首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

DB2 誤刪資料表緊急恢復實戰:利用 DROPPED TABLE RECOVERY 功能完整演示

     編輯:DB2 教學

前言

DB2 提供獨特的 Dropped Table Recovery(刪除表恢復) 功能,允許在表空間層級還原後,透過前滾日誌將已刪除的表資料「卸載」至檔案系統,再重建表並載入資料。本文以 SAMPLE 資料庫為例,完整演示從查詢歷史記錄到資料落地的全過程。

前置條件

  • 資料庫需處於歸檔日誌模式(logretain on 或 userexit on)。
  • 誤刪表所在的表空間(本例為 USERSPACE1)自誤刪時間點起有完整的備份與連續日誌。
  • 備份檔案存放於 C:\db2backup\。

步驟 1:查詢誤刪表的歷史記錄

DB2 歷史文件記錄了所有 DROP TABLE 操作。執行:

db2 "list history dropped table all for sample"

輸出關鍵欄位:

  • Op:操作類型(D 代表 Drop)。
  • Table ID:內部表識別碼(如 00000000000002010002000d),恢復指令必須使用此 ID。
  • Schema / Name:Schema 与表名。
  • Tablespace:所在表空間(本例為 USERSPACE1)。
  • Timestamp:Drop 發生的時間戳。

步驟 2:還原包含該表的表空間(不前滾)

使用表空間級備份映像檔還原,並指定 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:無人值守模式。

步驟 3:前滾日誌並指定恢復刪除表的目標目錄

此步驟為核心: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 檔案)。
  • 執行完成後,資料庫恢復正常連線狀態,目標目錄下生成刪除表的資料匯出檔(DEL 格式)。

步驟 4:重建表結構(DDL)

歷史文件同樣保存了表的 DDL。可透過 db2look 或查詢系統目錄表(SYSCAT.TABLES, SYSCAT.COLUMNS)獲取建表語句,在原 Schema 下重建表:

CREATE TABLE "SCHEMA"."RECOVERME" (
  "COL1" INTEGER NOT NULL,
  "COL2" VARCHAR(50),
  ...
) IN "USERSPACE1";

注意: 表名可與原名不同,但欄位定義、順序、資料類型必須完全一致。

步驟 5:載入資料至新表

使用 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)。

圖示流程總結

DB2恢復刪除表技巧流程圖

關鍵點回顧與最佳實踐

  1. 時間窗口: 僅能恢復「備份時間點」至「Drop 時間點」之間的資料;Drop 後新增的資料無法找回。
  2. 表空間級備份: 必須備份包含該表的表空間,資料庫級備份同樣適用但耗時較長。
  3. Table ID 不可寫錯: 從 LIST HISTORY DROPPED TABLE 直接複製,避免手輸錯誤導致 SQL2037N。
  4. 磁碟空間: 卸載目錄需預留足夠空間,資料量大時可能達到原表大小。
  5. 並發控制: 恢復期間建議將應用離線,避免前滾過程中產生新日誌增加複雜度。
  6. 定期演練: 將此流程納入季度災難恢復演練計畫,驗證 RTO。可結合 db2dart 檢查表空間一致性。

掌握 DB2 Dropped Table Recovery,讓「手滑刪表」不再是不可逆的災難,而是可控、可演練、可恢復的標準運維場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved