影響對象:資料字典表、回滾段、臨時段、使用者表、索引。不同對象處理策略不同。
ORA-1578、ORA-600 [2000-8000] 及 trace 檔。ORA-600 第一參數範圍對應區塊層級:ORA-1578 file# (RFN) block#、ORA-1110 file# (AFN)、ORA-600 file# (AFN)。DBA_DATA_FILES (RFN=RELATIVE_FNO, AFN=FILE_ID)、DBA_TEMP_FILES。SELECT tablespace_name, segment_type, owner, segment_name, partition_name
FROM dba_extents
WHERE file_id = :AFN
AND :block# BETWEEN block_id AND block_id + blocks - 1;
| 對象類型 | 推薦策略 | 備註 |
|---|---|---|
| SYS 字典物件 | 恢復資料檔 / 完整資料庫恢復 | 風險最高,建議聯繫 Oracle Support |
| 回滾段 | 離線損壞段、重建回滾表空間 | 參考「回滾表空間檔案丟失處理」 |
| 臨時段 | 重建臨時表空間 | 無永久資料遺失風險 |
| 索引/分區索引 | REBUILD INDEX / REBUILD PARTITION | 最簡單、無資料遺失 |
| 使用者表 | 多種策略可選 | 視業務容忍度選擇 |
ALTER DATABASE DATAFILE '...' OFFLINE;
-- 還原備份檔案,必要時 RENAME FILE
RECOVER DATAFILE '...';
ALTER DATABASE DATAFILE '...' ONLINE;
RMAN> BLOCKRECOVER DATAFILE 5 BLOCK 11, 16;
-- 或指定 SCN/序列
RMAN> BLOCKRECOVER DATAFILE 5 BLOCK 11, 16 RESTORE UNTIL SEQUENCE 8505;
DBMS_ROWID.ROWID_CREATE(1, obj_id, RFN, block, 0) (Low)DBMS_ROWID.ROWID_CREATE(1, obj_id, RFN, block+1, 0) (High)CREATE TABLE salvage AS SELECT * FROM corrupt WHERE 1=2;INSERT INTO salvage SELECT /*+ ROWID(A) */ * FROM corrupt A WHERE rowid < :low;
INSERT INTO salvage SELECT /*+ ROWID(A) */ * FROM corrupt A WHERE rowid >= :high;-- Session 級
ALTER SESSION SET EVENTS '10231 TRACE NAME CONTEXT FOREVER, LEVEL 10';
-- 或 Instance 級 init.ora
event="10231 trace name context forever, level 10"
-- 然後 CREATE TABLE salvage AS SELECT * FROM corrupt_table;
EXEC DBMS_REPAIR.SKIP_CORRUPT_BLOCKS('SCHEMA', 'TABLE');
-- 然後 exp 或 CTAS 導出好資料,重建表
| 方法 | 優點 | 盲區 |
|---|---|---|
| EXP 全庫導出 | 簡單、無需停機 | HWM 以上壞塊、索引壞塊、字典壞塊檢測不到 |
| ANALYZE TABLE ... VALIDATE STRUCTURE CASCADE | 檢測表+索引結構,結果寫入使用者 trace | 不標記壞塊、需離線或影響效能 |
| DBVERIFY (dbv) 離線檢驗 | 最徹底、可檢測所有區塊層級 | 需離線、裸裝置需 ln 連結檔案名 |
dbv file=system01.dbf blocksize=8192
-- 輸出含頁總數、失敗頁數、標記損壞頁數等統計
壞塊處理核心原則:先定位對象、再選策略、盡量保資料、必要時聯繫支援。索引壞塊直接重建最划算;表壞塊視業務容忍度在「完整恢復、區塊恢復、ROWID 拯救、Event 跳過、DBMS_REPAIR」中選擇;預防勝於治療,建議定期排程 dbv 或 ANALYZE VALIDATE 並監控 Alert 日誌。