在啟用自動存儲的 DB2 環境中嘗試異機重導向還原,執行腳本後連續報錯 SQL0104N(語法錯誤)與 SQL1024N(資料庫連線不存在),導致表空間容器重定義失敗。本文還原現場、分析根因、給出修正方案。
| Tablespace ID | Name | Type | Page Size | Extent Size | Containers |
|---|---|---|---|---|---|
| 0 | SYSCATSPACE | DMS | 4KB | 4 | 1 個檔案容器 |
| 1 | TEMPSPACE1 | SMS | 4KB | 32 | 1 個目錄容器 |
| 2 | USERSPACE1 | DMS Large | 8KB | 32 | 2 個檔案容器 |
關鍵點:Minimum recovery time = 2010-03-01-07.31.44,還原點需在此之後。
RESTORE DATABASE IESDB
FROM '/dbbackup'
DBPATH ON '/iesdb/IEs/NODE0000/SQL00001'
ON '/IEsdb/sprot' into sport
NEWLOGPATH '/IEsdb/sprot/DB2log/'
REPLACE EXISTING
REDIRECT
without rolling forward
WITHOUT PROMPTING;
SET TABLESPACE CONTAINERS FOR 0
USING ( file '/IEsdb/sprot/tbs0' 49152 );
SET TABLESPACE CONTAINERS FOR 2
USING ( file '/IEsdb/sprot/tbs2' 3932160 );
SQL0104N An unexpected token "ON" was found following "".
Expected tokens may include: "END-OF-STATEMENT". SQLSTATE=42601
SET TABLESPACE CONTAINERS FOR 0 USING ( file '/IEsdb/sprot/tbs0' 49152 )
SQL1024N A database connection does not exist. SQLSTATE=08003
SET TABLESPACE CONTAINERS FOR 2 USING ( file '/IEsdb/sprot/tbs2' 3932160 )
SQL1024N A database connection does not exist. SQLSTATE=08003
問題行:
DBPATH ON '/iesdb/IEs/NODE0000/SQL00001'
ON '/IEsdb/sprot' into sport
原因: DBPATH ON 子句僅支援單一路徑,語法為 DBPATH ON '/path'。腳本中出現兩個 ON 關鍵字,第二個 ON '/IEsdb/sprot' into sport 被解析器視為語法錯誤。
自動存儲限制: 啟用自動存儲的資料庫,不支援在 RESTORE 階段重新定義表空間容器。自動存儲意味著容器由 DB2 依據存儲路徑自動管理,SET TABLESPACE CONTAINERS 命令在重導向還原中會被忽略或報錯。
原因: 由於第一條 RESTORE ... REDIRECT 語法失敗,重導向會話未成功建立,後續的 SET TABLESPACE CONTAINERS 命令無法在有效的重導向會話中執行,故報「資料庫連線不存在」。
僅指定資料庫級存儲路徑與日誌路徑,移除所有 SET TABLESPACE CONTAINERS 命令:
RESTORE DATABASE IESDB
FROM '/dbbackup'
DBPATH ON '/iesdb/IEs/NODE0000/SQL00001'
ON '/IEsdb/sprot'
NEWLOGPATH '/IEsdb/sprot/DB2log/'
REPLACE EXISTING
REDIRECT
WITHOUT ROLLING FORWARD
WITHOUT PROMPTING;
DBPATH ON:指定資料庫目錄掛載點(自動存儲根路徑)。ON '/IEsdb/sprot':指定自動存儲路徑(STOGROUP 路徑),DB2 將在該路徑下自動建立表空間容器。RESTORE DATABASE IESDB CONTINUE。RESTORE ... REDIRECT 成功進入會話後,逐一執行 SET TABLESPACE CONTAINERS。db2move/db2look+load 遷移。# 1. 進入重導向會話
db2 "RESTORE DATABASE IESDB FROM '/dbbackup' \
DBPATH ON '/iesdb/IEs/NODE0000/SQL00001' \
ON '/IEsdb/sprot' \
NEWLOGPATH '/IEsdb/sprot/DB2log/' \
REPLACE EXISTING REDIRECT WITHOUT ROLLING FORWARD WITHOUT PROMPTING"
# 2. 檢查會話狀態(應顯示重導向中)
db2 "LIST TABLESPACES"
# 3. 直接完成還原(無需 SET CONTAINERS)
db2 "RESTORE DATABASE IESDB CONTINUE"
# 4. 前滾日誌
db2 "ROLLFORWARD DATABASE IESDB TO END OF LOGS AND COMPLETE OVERFLOW LOG PATH ('/path/to/archived/logs')"
db2 get db cfg for | grep AUTO_STORAGE 。來源與目標一致最省事。db2 -tvf restore_script.sql 試跑,捕捉 SQL0104N 語法錯誤。DBPATH ON 與 ON 指定的目錄必須在實例擁有者權限下預先存在且可寫。NEWLOGPATH 目錄需預建,前滾時若用 OVERFLOW LOG PATH 亦需掛載歸檔日誌。自動存儲簡化了容器管理,但也限制了重導向還原時的容器自定義能力。核心原則:自動存儲環境下重導向還原,僅重定向資料庫目錄與存儲路徑,勿嘗試 SET TABLESPACE CONTAINERS。 修正語法後,還原流程將順利推進,「水到渠成」。