本文記錄一起真實生產環境案例:OBJ$ 表與 I_OBJ4 索引因 DATAOBJ# 不一致導致 ORA-08102: index key not found,進而引發 ORA-00604 遞迴錯誤,導致無法建立資料表。詳細記錄從診斷、BBED 修改資料塊、嘗試標記壞塊、最終透過刪除資料字典記錄並配合 Bootstrap$ 核心索引恢復的完整過程,供 DBA 參考。
SQL> CREATE TABLE t1 AS SELECT * FROM dual;
ORA-00604: error occurred at recursive SQL level 1
ORA-08102: index key not found, obj# 39, file 1, block 93842 (2)
查詢 DBA_OBJECTS 確認 obj#=39 為 I_OBJ4 索引。
MINUS 對比全表掃描與索引掃描結果,發現 _NEXT_OBJECT 記錄在 OBJ$ 中 DATAOBJ#=97094,但在 I_OBJ4 中為 97109,雙方不一致。MAX(DATAOBJ#) 走 INDEX FULL SCAN (MIN/MAX) 僅回傳 96815,證明索引鏈結結構已損壞,非單純資料不一致。I_OBJ4 索引塊 93842,鍵值包含 97109。ROWID=AAAAASAABAAAADxAAb 對應 FILE#=1, BLOCK#=241, ROW#=27。DATAOBJ# 從 97094 (C3 0A 47 5F) 修改為 97109 (C3 0A 48 0A),並 SUM APPLY 更新檢查碼。MINUS 查詢無差異,但 ANALYZE TABLE SYS.OBJ$ VALIDATE STRUCTURE CASCADE 仍報 ORA-01499,建表仍失敗。BLOCK#=93842 尾部檢查碼由 01 改 02,經 DBVERIFY 確認標記成功。_corrupted_rollback_segments 等隱含參數的 PFILE,嘗試繞過壞塊。ORA-01578,無法繞過,證明索引邏輯損壞非單一塊問題。I_OBJ4 字典記錄 → 重建核心 Bootstrap$ 索引(I_OBJ1, I_USER1, I_FILE#_BLOCK#, I_IND1, I_TS#, I_CDEF1 等)→ 開啟資料庫」策略。MINUS 對比無差異不代表索引健康。MAX() 走 MIN/MAX 掃描結果異常,說明分支節點或葉節點鏈結斷裂。RESTORE/RECOVER TABLESPACE SYSTEM 或 FLASHBACK DATABASE。ANALYZE TABLE SYS.OBJ$ VALIDATE STRUCTURE CASCADE 及 DBMS_REPAIR.CHECK_OBJECT 檢核字典健康。DB_BLOCK_CHECKING=FULL、DB_BLOCK_CHECKSUM=FULL 提早發現塊損壞。此案例再次證明:字典核心物件損壞屬於最高等級災難,修復需極度謹慎,條件允許下優先以備份恢復為主,手工 BBED 修補僅作最後手段。