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

DB2DART 數據搶救實戰:用 /DDEL 參數從損壞表空間導出殘留數據

     編輯:DB2 教學

前言:當 REORG/LOAD 失敗、表空間標記「受限」時

DB2DART(Database Analysis and Reporting Tool)是 IBM 提供的離線底層頁面分析工具,能在數據庫**未啟動**狀態下直接讀取表空間容器文件,提取尚未被覆寫的行數據。本文以 SAMPLE 數據庫為例,演示如何用 /DDEL 參數導出指定表的所有列數據,作為最後手段搶救業務數據。

前置條件與風險提示

  • 必須離線:實例需 DB2STOP,確保無進程持有容器文件鎖。
  • 僅讀操作:/DDEL 不修改磁盤,但建議先對容器文件做塊級備份(dd if=/dev/rawdev of=/backup/container.img)。
  • 版本匹配:DART 版本必須與數據庫實例版本一致(V9.7 用 V9.7 DART,不可混用)。
  • 數據完整性無保證:導出數據可能包含「已刪除未回收」「事務未提交」的髒行,需業務邏輯二次清洗。

核心步驟:四步走搶救流程

步驟 1:獲取目標表的 FID / TID / TBSPACEID

-- 在數據庫啟動狀態下查詢(若已掛掉,需從備份目錄表恢復 syscat.tables)
SELECT TABSCHEMA, TABNAME, TBSPACEID, TABLEID
FROM SYSCAT.TABLES
WHERE TABNAME = 'YOUR_TABLE';

假設查得:TBSPACEID=2, TABLEID=2(即 FID=2, TID=2)。

步驟 2:啟動 DART 交互式導出

D:\> db2dart SAMPLE /DDEL

工具提示輸入參數:

Table object data formatting start.
Please enter
Table ID or name, tablespace ID, first page, num of pages:
(suffix page number with 'p' for pool relative)

步驟 3:輸入定位參數

2,2,0,999
  • 2 = FID (TBSPACEID)
  • 2 = TID (TABLEID)
  • 0 = 起始頁碼(從 0 開始)
  • 999 = 頁數,**建議設大覆蓋全表**

步驟 4:確認列映射與輸出文件

工具自動讀取表元數據,顯示將導出的 5 個列:

5 of 5 columns in the table will be dumped.
Column numbers and datatypes of the columns dumped:
0 SMALLINT
1 VARCHAR() - VARIABLE LENGTH CHARACTER STRING
2 SMALLINT
3 VARCHAR() - VARIABLE LENGTH CHARACTER STRING
4 VARCHAR() - VARIABLE LENGTH CHARACTER STRING

Default filename for output data file is TS2T2.DEL,
do you wish to change filename used? y/n

輸入 N 使用默認,或輸入 Y 指定如 recovered_table.del。

步驟 5:等待導出完成

Formatted data being dumped ...
Dumping Page 0 ....
Table object data formatting end.
The requested DB2DART processing has completed successfully!
Complete DB2DART report found in:
C:\PROGRA~1\IBM\SQLLIB\DB2\DART0000\SAMPLE.RPT

產出文件說明

文件用途
TS2T2.DEL (或自定義 .del)分隔符格式數據文件,可直接 LOAD 或 IMPORT 入新表
SAMPLE.RPT詳細處理日誌,含頁面掃描統計、錯誤行記錄、校驗和不匹配詳情

後續數據入庫建議

-- 1. 建立同結構空表(含所有約束、索引暫不建)
CREATE TABLE RECOVERED_TABLE LIKE ORIGINAL_TABLE;

-- 2. 載入 DEL 文件(允許髒行跳過)
LOAD FROM TS2T2.DEL OF DEL
    MODIFIED BY COLDEL0x09 CHARDEL0x22  -- 根據實際分隔符調整
    INSERT INTO RECOVERED_TABLE
    FOR EXCEPTION EXCEPT_TBL
    NOROWWARNINGS
    MESSAGES load.msg;

-- 3. 業務清洗:對比 EXCEPT_TBL、主鍵衝突、NULL 違規等
-- 4. 重建索引、RUNSTATS、授權

常見問題排查

  1. 提示「Table not found」:確認 FID/TID 正確;若表被 DROP,元數據已無,需從備份還原系統目錄表後再查。
  2. 導出行數遠小於預期:可能表空間已被 REORG/LOAD 覆寫,或頁面鏈接斷裂;嘗試掃描全表空間 /DDEL 0,0,0,999999 然後按列過濾。
  3. DEL 文件編碼亂碼:DART 按數據庫代碼頁導出;載入時指定 MODIFIED BY CODEPAGE=xxx。

替代方案對比

方案適用場景優點缺點
DB2DART /DDEL實例掛掉、表空間受限、無備份免啟動實例、底層直讀、最後手段離線、可能髒數據、需人工清洗
RECOVER DATABASE … TO END OF LOGS有完整備份+歸檔日誌數據一致性最強、自動重做需備份集、RTO 較長
LOAD COPY YES + 表空間備份還原定期做表空間備份粒度細、速度快需規劃備份窗口
HADR 閃備庫激活配置 HADR 同步秒級切換、零數據丟失成本高、需雙機

總結

DB2DART /DDEL 是「數據庫急診室」的手術刀——不癒本病(修復元數據),但能搶回命(導出殘留行)。建議平時演練:在測試庫人為損壞表空間 → 用 DART 導出 → 對比行數/內容,熟練掌握參數輸入與後續清洗,真正故障時才能「手穩心細」。

DB2DART 交互式導出過程截圖

圖示:DB2DART /DDEL 交互式導出過程截圖(來源:原文)

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