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

Oracle 壞塊識別、分類與多種修復策略完整指南

     編輯:Oracle 資料庫基礎

壞塊分類與影響對象

  • 邏輯壞塊:區塊結構不一致(型別、地址、SCN、頭尾校驗失敗)。
  • 物理壞塊:介質層面損壞,作業系統無法讀取。

影響對象:資料字典表、回滾段、臨時段、使用者表、索引。不同對象處理策略不同。

常見報錯與層級定位

  • Alert 日誌出現 ORA-1578、ORA-600 [2000-8000] 及 trace 檔。
  • ORA-600 第一參數範圍對應區塊層級:
    2000-4000 Cache Layer、4000-6000 Transaction Layer、6000-8000 Data Layer。

壞塊成因

  • 硬體 I/O 錯誤、OS I/O/緩衝問題、記憶體/分頁錯誤、磁碟修復工具誤操作、資料檔部分被覆寫、存取未格式化系統區塊、資料檔溢位、Oracle/OS Bug。

四步驟處理流程

  1. 收集資訊:從 Alert/trace 取得 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。
  2. 定位對象:
    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;
  3. 依對象類型選擇策略(見下表)。
  4. 執行修復並驗證。

常見對象修復策略對照表

對象類型推薦策略備註
SYS 字典物件恢復資料檔 / 完整資料庫恢復風險最高,建議聯繫 Oracle Support
回滾段離線損壞段、重建回滾表空間參考「回滾表空間檔案丟失處理」
臨時段重建臨時表空間無永久資料遺失風險
索引/分區索引REBUILD INDEX / REBUILD PARTITION最簡單、無資料遺失
使用者表多種策略可選視業務容忍度選擇

使用者表五大修復手段

1. 恢復資料檔(需歸檔模式+完整備份)

ALTER DATABASE DATAFILE '...' OFFLINE;
-- 還原備份檔案,必要時 RENAME FILE
RECOVER DATAFILE '...';
ALTER DATABASE DATAFILE '...' ONLINE;

2. 區塊級恢復 (9i+,需 RMAN Catalog、歸檔、完整備份)

RMAN> BLOCKRECOVER DATAFILE 5 BLOCK 11, 16;
-- 或指定 SCN/序列
RMAN> BLOCKRECOVER DATAFILE 5 BLOCK 11, 16 RESTORE UNTIL SEQUENCE 8505;

3. ROWID RANGE SCAN 拯救資料

  1. 取得壞塊 ROWID 範圍:
    DBMS_ROWID.ROWID_CREATE(1, obj_id, RFN, block, 0) (Low)
    DBMS_ROWID.ROWID_CREATE(1, obj_id, RFN, block+1, 0) (High)
  2. 建立暫存表:CREATE TABLE salvage AS SELECT * FROM corrupt WHERE 1=2;
  3. 導出好資料:
    INSERT INTO salvage SELECT /*+ ROWID(A) */ * FROM corrupt A WHERE rowid < :low;
    INSERT INTO salvage SELECT /*+ ROWID(A) */ * FROM corrupt A WHERE rowid >= :high;
  4. 重建表、索引、約束。

4. Event 10231 跳過壞塊全表掃描

-- 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;

5. DBMS_REPAIR 標記跳過

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 日誌。

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