DB2 提供獨特的 Dropped Table Recovery(刪除表恢復) 功能,允許在表空間層級還原後,透過前滾日誌將已刪除的表資料「卸載」至檔案系統,再重建表並載入資料。本文以 SAMPLE 資料庫為例,完整演示從查詢歷史記錄到資料落地的全過程。
logretain on 或 userexit on)。USERSPACE1)自誤刪時間點起有完整的備份與連續日誌。C:\db2backup\。DB2 歷史文件記錄了所有 DROP TABLE 操作。執行:
db2 "list history dropped table all for sample"
輸出關鍵欄位:
00000000000002010002000d),恢復指令必須使用此 ID。使用表空間級備份映像檔還原,並指定 without rolling forward:
db2 "restore db sample tablespace (USERSPACE1) from C:\db2backup taken at 20041102100931 without rolling forward without prompting"
taken at:選擇誤刪發生 之前 的最近一次表空間備份時間戳。without rolling forward:還原後表空間處於 ROLLFORWARD PENDING 狀態,不自動前滾。without prompting:無人值守模式。此步驟為核心:DB2 會在前滾過程中識別 DROP TABLE 記錄,將該表在 Drop 瞬間的資料頁「卸載」至指定目錄。
db2 "rollforward db sample to end of logs and complete recover dropped table 00000000000002010002000d to C:\db2backup"
recover dropped table :指定步驟 1 獲取的 Table ID。to C:\db2backup:卸載資料檔的輸出目錄(需預先存在,DB2 會在其下建立 NODE0000\DATA\ 子目錄存放 .exp 檔案)。歷史文件同樣保存了表的 DDL。可透過 db2look 或查詢系統目錄表(SYSCAT.TABLES, SYSCAT.COLUMNS)獲取建表語句,在原 Schema 下重建表:
CREATE TABLE "SCHEMA"."RECOVERME" (
"COL1" INTEGER NOT NULL,
"COL2" VARCHAR(50),
...
) IN "USERSPACE1";
注意: 表名可與原名不同,但欄位定義、順序、資料類型必須完全一致。
使用 LOAD 工具將步驟 3 卸載的 DEL 檔案導入新表。METHOD P(1,2) 表示僅載入第 1、2 欄位(視實際表結構調整):
db2 "load from C:\db2backup\NODE0000\DATA of del method P(1,2) insert into RECOVERME"
of del:檔案格式為分隔符格式(預設逗號分隔)。method P(1,2):位置法指定載入欄位;若表結構完全一致可省略,預設全欄位載入。insert into:追加模式(表為空時同 insert/replace)。
LIST HISTORY DROPPED TABLE 直接複製,避免手輸錯誤導致 SQL2037N。db2dart 檢查表空間一致性。掌握 DB2 Dropped Table Recovery,讓「手滑刪表」不再是不可逆的災難,而是可控、可演練、可恢復的標準運維場景。