Oracle 資料塊損壞 (ORA-01578) 可透過 dbms_repair 套件標記、跳過壞塊、清理孤兒索引鍵、重建 Freelist 實現「帶傷運行」。本文完整記錄從建立測試表、模擬壞塊 (UltraEdit 改寫 .dbf)、dbv 驗證、dbms_repair 六步驟修復流程,含 PL/SQL 代碼與輸出解讀。
DBMS_REPAIR.ADMIN_TABLES('REPAIR_TABLE',1,1,'USERS') (壞塊記錄表) + ORPHAN_TABLE (孤兒鍵表)。DBMS_REPAIR.CHECK_OBJECT(schema=>'DLINGER', object=>'TEST', corrupt_count=>:cc) → REPAIR_TABLE 記錄壞塊位置、MARKED_CORRUPT=TRUE (9i 自動標記,8i 需步驟 3)。DBMS_REPAIR.FIX_CORRUPT_BLOCKS(...) 寫入標記、更新時間戳。9i 可跳過。DBMS_REPAIR.SKIP_CORRUPT_BLOCKS(schema=>'DLINGER', object=>'TEST', flags=>1) → 查詢不再報 ORA-01578,但損失壞塊上的所有行 (實測損失 46 行)。DBMS_REPAIR.DUMP_ORPHAN_KEYS(schema=>'DLINGER', object=>'I_TEST', type=>2, repair_table=>'REPAIR_TABLE', orphan_table=>'ORPHAN_TABLE') → ORPHAN_TABLE 列出 46 條孤兒鍵,與損失行數吻合。決定是否 REBUILD INDEX。DBMS_REPAIR.REBUILD_FREELISTS(schema=>'DLINGER', object=>'TEST') 修復段空間管理結構。-- dbv 驗證 dbv file='D:\oracle\oradata\Oracle9i\block.dbf' blocksize=8192 -- 查看 REPAIR_TABLE SELECT object_name, relative_file_id, block_id, marked_corrupt, corrupt_description, repair_description, check_timestamp FROM repair_table; -- 查看 ORPHAN_TABLE SELECT * FROM orphan_table;
DBMS_REPAIR.CHECK_OBJECT 於核心表,早期發現壞塊。