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

Oracle 資料區塊損壞恢復完整策略:DBV、RMAN、BBED 實戰

     編輯:Oracle 資料庫基礎

損壞偵測與定位

-- 1. DBV 離線檢查 (需關閉資料庫或檔案離線)
dbv file=/u01/oradata/db/users01.dbf blocksize=8192

-- 2. 觸發掃描定位 (全表掃描)
SELECT count(*) FROM corrupted_table;  -- 回傳 ORA-01578

-- 3. 精確定位損壞物件
SELECT tablespace_name, segment_type, owner, segment_name
FROM dba_extents
WHERE file_id = 4
  AND 35 BETWEEN block_id AND block_id + blocks - 1;

恢復策略決策樹

  1. 索引區塊損壞 → ALTER INDEX idx REBUILD (最快、零資料遺失)
  2. 有完整備份 + ArchiveLog → RMAN Block Media Recovery (首選)
  3. 無備份 / 非歸檔模式 → Event 10231 + EXP/IMP (資料遺失風險)
  4. 極端情況 → BBED (最後手段,Oracle 不支援)

方案 A:RMAN 區塊恢復 (零資料遺失,需歸檔模式)

-- 1. 驗證備份集完整性並掃描壞塊
RMAN> BACKUP VALIDATE DATAFILE 4;

-- 2. 查詢壞塊清單
RMAN> SELECT * FROM v$database_block_corruption WHERE file# = 4;

-- 3. 執行區塊恢復 (自動從備份集讀取好塊覆寫)
RMAN> BLOCKRECOVER DATAFILE 4 BLOCK 35 FROM BACKUPSET;

-- 4. 驗證恢復結果
RMAN> BACKUP VALIDATE DATAFILE 4;  -- 應無壞塊回報

優點:資料庫線上執行、僅恢復損壞區塊、無資料遺失。
前提:ArchiveLog 模式 + 近期 RMAN 備份集。

方案 B:Event 10231 + EXP/IMP (資料遺失,適用無備份)

-- 1. 設定 Session 事件跳過壞塊
ALTER SESSION SET EVENTS '10231 TRACE NAME CONTEXT FOREVER, LEVEL 10';

-- 2. 匯出受影響表 (會跳過壞塊行)
EXP userid=system/password FILE=tab.dmp TABLES=corrupted_table

-- 3. 重建表
DROP TABLE corrupted_table;
CREATE TABLE corrupted_table AS SELECT * FROM corrupted_table@dblink; -- 或從 DDL 重建

-- 4. 匯入資料
IMP userid=system/password FILE=tab.dmp TABLES=corrupted_table IGNORE=Y

壞塊所在列永久遺失,僅能恢復好塊資料。適用於非關鍵表或無備份環境。

方案 C:DBMS_REPAIR (標記壞塊跳過,資料遺失)

-- 1. 建立修復表
EXEC DBMS_REPAIR.ADMIN_TABLES(TABLE_NAME => 'REPAIR_TABLE', ACTION => DBMS_REPAIR.CREATE_ACTION);

-- 2. 檢測並標記壞塊
EXEC DBMS_REPAIR.CHECK_OBJECT(
    SCHEMA_NAME => 'SCOTT', OBJECT_NAME => 'CORRUPTED_TABLE',
    REPAIR_TABLE_NAME => 'REPAIR_TABLE');

-- 3. 修復 (標記壞塊為軟刪除,後續存取跳過)
EXEC DBMS_REPAIR.FIX_CORRUPT_BLOCKS(
    SCHEMA_NAME => 'SCOTT', OBJECT_NAME => 'CORRUPTED_TABLE',
    REPAIR_TABLE_NAME => 'REPAIR_TABLE');

方案 D:BBED (區塊編輯器,極高風險)

  • 功能:直接讀寫資料檔區塊內容 (十六進位編輯)
  • 位置:$ORACLE_HOME/bin/bbed (Linux 需編譯 make -f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed)
  • 密碼:blockedit (僅供 Oracle 內部使用,不提供技術支援)
  • 場景:資料檔標頭損壞、Bootstrap$ 核心物件損壞、無任何備份且必須搶救關鍵資料

警告:BBED 操作錯誤會導致資料庫徹底不可用。僅在 Oracle Support 指導下使用,並務必先完整複製資料檔備份。

預防勝於治療

  1. 啟用 DB_BLOCK_CHECKSUM:ALTER SYSTEM SET db_block_checksum = FULL SCOPE=SPFILE; (11g+ 預設 TYPICAL)
  2. 啟用 DB_BLOCK_CHECKING:ALTER SYSTEM SET db_block_checking = MEDIUM SCOPE=SPFILE; (效能影響 < 5%)
  3. 定期 RMAN VALIDATE:每週 BACKUP VALIDATE DATABASE 主動發現壞塊
  4. 硬體層 RAID + 控制器快取保護 (BBWC/FBWC)
  5. 多重備份策略:RMAN 磁碟 + 磁帶/異地,保留多代
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved