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

Oracle 資料區塊損壞類型、偵測與恢復完整指南

     編輯:Oracle 教學

一、什麼是區塊損壞

損壞的資料區塊:格式非 Oracle 可識別,或內容邏輯不一致。分類:

  • 媒體損壞:區塊格式錯誤、磁碟讀取無意義資料 (硬體/OS/IO 子系統故障)
  • 邏輯損壞:檢驗和正常、Header/Footer 吻合,但內容不一致 (Oracle 內部錯誤)

二、故障現象

ORA-01578: ORACLE data block corrupted (file # %s, block # %s)

  • 始終回傳相對檔號與區塊號
  • 出現在發出查詢的 Session、Alert.log
  • 參數固定 → 媒體損壞;參數變動 → 硬體/記憶體/IO 問題
  • 伴隨 ORA-01110 顯示絕對檔號

三、處理流程

  1. 檢查 Alert.log 與 OS 日誌
  2. 使用診斷工具判斷損壞類型
  3. 多次執行檢查確認是否持續
  4. 從損壞物件救援資料
  5. 解決硬體問題 (記憶體、磁碟控制器、磁碟)
  6. 依需求恢復或還原資料

四、即時驗證區塊完整性: DB_BLOCK_CHECKING

動態參數,修改即時生效:

ALTER SYSTEM SET DB_BLOCK_CHECKING = FULL SCOPE=BOTH;
值檢查程度開銷
OFF僅 SYSTEM 表空間檢查無
LOW記憶體中區塊變更後基本 Header 檢查1%~3%
MEDIUMLOW + 非索引組織表語意檢查3%~7%
FULLMEDIUM + 索引區塊語意檢查5%~10%

五、區塊媒體恢復 (Block Media Recovery, BMR)

特點:降低 MTTR、資料檔保持 ONLINE、僅損壞區塊不可存取、使用 RMAN RECOVER ... BLOCK。

先決條件

  • 目標資料庫為 ARCHIVELOG 模式且 OPEN 或 MOUNT
  • 含損壞區塊的資料檔備份為 FULL 或 LEVEL 0
  • 需歸檔重做日誌,不可用 LEVEL 1 增量備份
  • 啟用閃回資料庫可加速 (從閃回日誌取得良好區塊)

V$DATABASE_BLOCK_CORRUPTION 視圖

記錄被標記為損壞的區塊:

  • CORRUPTION_TYPE: MEDIA (物理) / LOGICAL (邏輯)
  • 邏輯損壞預設不檢查,需 BACKUP ... VALIDATE CHECK LOGICAL 啟用

RECOVER ... BLOCK 指令範例

-- 單一區塊
RECOVER DATAFILE 7 BLOCK 3;

-- 多區塊多檔案
RECOVER DATAFILE 2 BLOCK 43, DATAFILE 2 BLOCK 79, DATAFILE 6 BLOCK 183;

-- 恢復視圖中所有損壞區塊
RECOVER CORRUPTION LIST;

確定損壞區塊來源

  • LIST FAILURE、VALIDATE、BACKUP VALIDATE 結果
  • V$DATABASE_BLOCK_CORRUPTION
  • Alert.log、User Trace 檔 (V$DIAG_INFO 查詢路徑)
  • ANALYZE TABLE/INDEX VALIDATE STRUCTURE
  • DBVERIFY (dbv) 工具

六、事件 10231 緊急處理 (無備份、無法恢復時)

-- 開啟事件
ALTER SYSTEM SET EVENTS='10231 trace name context forever, level 10';

-- 匯出損壞表 (跳過壞區塊)
EXP test/test FILE=t.dmp TABLES=t;

-- 刪除並重建
DROP TABLE t;
IMP test/test FILE=t.dmp TABLES=t;

-- 關閉事件
ALTER SYSTEM SET EVENTS='10231 trace name context off';

警告:10231 會跳過壞區塊直接讀取,可能導致資料遺失或邏輯不一致,僅限緊急救援並需事後驗證資料完整性。

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