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

Oracle 實例恢復深度解析:正常/異常關機下的資料檔遺失應對策略

     編輯:Oracle 資料庫基礎

場景定義

嘗試 STARTUP 時報 ORA-01157 (無法識別/鎖定資料檔) + ORA-01110 (報告具體檔案)。恢復策略完全取決於 **上一次關機是否正常** (NORMAL/IMMEDIATE/TRANSACTIONAL vs ABORT/CRASH)。

情況 A:正常關機 (Clean Shutdown)

Alert Log 末尾可見:

ALTER DATABASE DISMOUNT
Completed: ALTER DATABASE DISMOUNT

此時資料檔與控制檔一致,SCN 同步,**無需介質恢復**,可採用「離線丟棄 + 重建表空間」最快恢復。

操作步驟

  1. 確認正常關機:檢查 Alert Log 如上。
  2. 移除受影響回滾段:編輯 init.ora,從 ROLLBACK_SEGMENTS 移除屬於該資料檔的回滾段,或直接註釋該參數。
  3. RESTRICT 模式掛載:STARTUP RESTRICT MOUNT;
  4. 離線丟棄壞檔:ALTER DATABASE DATAFILE '' OFFLINE DROP;
  5. 打開資料庫:ALTER DATABASE OPEN;
    • 成功 → 進行第 7 步
    • 報 ORA-00604/ORA-00376/ORA-01110 → 進行第 6 步
  6. 標記損壞回滾段並開啟:
    SHUTDOWN IMMEDIATE;
    -- 編輯 init.ora
    _CORRUPTED_ROLLBACK_SEGMENTS = (rbs1, rbs2, ...)
    STARTUP RESTRICT;

    警告:隱含參數僅在 Oracle 支援指導下使用!

  7. 刪除並重建回滾段表空間:
    DROP TABLESPACE  INCLUDING CONTENTS;
    CREATE TABLESPACE  ...;
    CREATE ROLLBACK SEGMENT ...;
    ALTER ROLLBACK SEGMENT ... ONLINE;
  8. 解除限制模式:ALTER SYSTEM DISABLE RESTRICTED SESSION;
  9. 恢復參數檔:將重建的回滾段加回 ROLLBACK_SEGMENTS,移除 _CORRUPTED_ROLLBACK_SEGMENTS。

情況 B:異常關機 (Shutdown Abort / Crash)

回滾段中**必含活躍交易**,壞檔**不可 OFFLINE DROP**,必須從備份恢復並應用 Redo。

操作步驟

  1. 從備份恢復資料檔:複製備份檔至原路徑 (或新路徑後 ALTER DATABASE RENAME FILE)。
  2. 掛載資料庫:STARTUP MOUNT;
  3. 檢查資料檔狀態:
    SELECT FILE#, NAME, STATUS FROM V$DATAFILE;
    若為 OFFLINE:ALTER DATABASE DATAFILE '' ONLINE;
  4. 檢查線上 Redo Log 範圍:
    SELECT V1.GROUP#, MEMBER, SEQUENCE#, FIRST_CHANGE#
    FROM V$LOG V1, V$LOGFILE V2
    WHERE V1.GROUP# = V2.GROUP#;
    記錄最小 FIRST_CHANGE# (最早可用 Redo SCN)。
  5. 檢查需恢復檔案的 SCN:
    SELECT FILE#, CHANGE# FROM V$RECOVER_FILE;
    • 若 CHANGE# ≥ 最小 FIRST_CHANGE# → **可用線上 Redo 完成恢復**
    • 若 CHANGE# < 最小 FIRST_CHANGE# → **無法完全恢復** (所需 Redo 已被覆寫),聯繫 Oracle Support
  6. 執行恢復:
    RECOVER DATABASE;  -- 或 RECOVER DATAFILE '';
    ALTER DATABASE OPEN;

關鍵差異總結表

維度正常關機 (A)異常關機 (B)
回滾段狀態無活躍交易含活躍交易
壞檔處理OFFLINE DROP 丟棄必須恢復 + 應用 Redo
是否需備份不需 (重建表空間即可)必需 (資料檔 + 歸檔/線上 Redo)
風險丟失該表空間內所有資料若備份/Redo 不全面臨資料永久遺失
適用版本所有版本所有版本

非歸檔模式特殊說明

若資料庫為 **NOARCHIVELOG**,且異常關機導致資料檔損壞:

  • 僅當 V$RECOVER_FILE.CHANGE# ≥ 當前線上 Redo 最小 FIRST_CHANGE# 時可恢復 (即所需 Redo 仍在線上日誌中)
  • 否則**無法恢復**,唯一出路:若業務可接受丟失該表空間交易,可參考情況 A 第 6 步強制開啟 (隱含參數風險自負)

最佳實踐建議

  1. 永遠啟用 ARCHIVELOG:生產環境無例外。
  2. 多路徑控制檔 + 多路徑 Redo Log:單點故障不導致無法啟動。
  3. 定期驗證備份可用性:RMAN VALIDATE BACKUPSET + 季度恢復演練。
  4. 監控 Alert Log 關機模式:自動化腳本檢測非正常關機並告警。
  5. 隱含參數禁用原則:_CORRUPTED_ROLLBACK_SEGMENTS 等僅在 Oracle Support 遠程指導下使用,事前必須全庫備份。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved