首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 壞塊恢復實戰:無備份跳過導出與 RMAN 區塊級恢復詳解

     編輯:Oracle 資料庫相關知識

場景一:無備份情況下的搶救

  1. 嘗試導出報錯:EXP test/test FILE=t.dmp TABLES=t → ORA-01578: ORACLE data block corrupted (file# 4, block# 35)。
  2. 定位受損對象:
    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;
  3. 索引壞塊:直接 ALTER INDEX idx REBUILD ONLINE 修復。
  4. 數據壞塊 (TABLE):
    1. 設置事件跳過壞塊:ALTER SESSION SET EVENTS '10231 TRACE NAME CONTEXT FOREVER, LEVEL 10';
    2. 重新導出受影響表:EXP ... TABLES=damaged_table。
    3. 刪除原表:DROP TABLE damaged_table;。
    4. 重建表結構(CREATE TABLE ... AS SELECT * FROM ... WHERE 1=0 或導入結構)。
    5. 導入數據:IMP ... TABLES=damaged_table。

代價:壞塊所在行數據永久丟失,其餘行挽回。

場景二:有 RMAN 備份的區塊級恢復 (零數據丟失)

  1. 驗證壞塊:RMAN> BACKUP VALIDATE DATAFILE 2;
  2. 查詢壞塊詳情:
    SELECT * FROM v$database_block_corruption WHERE file# = 2;
    顯示 CORRUPTION_CHANGE#、BLOCK# 等。
  3. 區塊恢復:
    RMAN> BLOCKRECOVER DATAFILE 2 BLOCK 14 FROM BACKUPSET;
    自動從備份集讀取該塊映像應用 Redo 至當前 SCN。

前提:

  • 數據庫運行於 ARCHIVELOG 模式。
  • 存在最近的 RMAN 備份集(含該數據文件)。
  • 壞塊未被覆寫(未執行過 DROP TABLESPACE INCLUDING CONTENTS 等)。

對比總結

維度事件 10231 跳過導出RMAN BLOCKRECOVER
備份需求無需完整 RMAN 備份 + 歸檔日志
數據丟失壞塊行丟失零丟失
業務影響需停機導出/導入Online 可執行(部分版本)
適用版本所有版本8i+
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved