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

Oracle 10g 遺失所有線上重做日誌檔 (Redo Log) 的完整復原實戰

     編輯:Oracle 資料庫基礎

案例背景

  • 環境:Windows XP + Oracle 10.2.0.1
  • 模式:非歸檔模式 (NOARCHIVELOG)
  • 備份:完全無備份
  • 現象:啟動資料庫報 ORA-00313、ORA-00312,指向 REDO01.LOG 找不到;檢查目錄發現所有 Redo Log 檔案全數消失 (推測曾誤刪)。

故障分析與復原策略

所有 Redo Log 遺失,包含 Current (Group 1) 與 Inactive/Unused (Group 2, 3)。無備份、非歸檔模式下,唯一可行路徑:

  1. 用 CLEAR LOGFILE 重建非當前群組 (Group 2, 3)。
  2. 對當前群組 (Group 1) 必須使用隱含參數 _allow_resetlogs_corruption=TRUE 配合 RECOVER DATABASE UNTIL CANCEL 並 OPEN RESETLOGS 強制重建,代價是**犧牲未歸檔的交易資料**,並可能導致資料不一致,事後務必匯出重建。

逐步復原操作

1. 確認日誌群組狀態

SQL> SELECT * FROM v$log;

GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIM
------ ------- --------- ----- ------- --- ------ ------------- ---------
1      1       2         50M   1       NO  CURRENT 272945      16-JUN-09
3      1       1         50M   1       NO  INACTIVE 252940      16-JUN-09
2      1       0         50M   1       YES UNUSED 0

判斷:Group 1 = CURRENT,Group 2, 3 = 非當前。

2. CLEAR 非當前群組

SQL> ALTER DATABASE CLEAR LOGFILE GROUP 2;
SQL> ALTER DATABASE CLEAR LOGFILE GROUP 3;
-- 若該群組未歸檔需加 UNARCHIVED 關鍵字
-- ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP 2;

此時檔案系統會出現 REDO02.LOG、REDO03.LOG。

3. 驗證 CLEAR 當前群組會失敗

SQL> ALTER DATABASE CLEAR LOGFILE GROUP 1;
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: '...REDO01.LOG'
ORA-27041: unable to open file
OSD-04002: unable to open file
O/S-Error: (OS 2) The system cannot find the file specified.

4. 設定隱含參數並以 PFILE 啟動 MOUNT

SQL> CREATE PFILE FROM SPFILE;
SQL> SHUTDOWN IMMEDIATE;
-- 編輯產生的 INIT.ORA,最後新增:
_allow_resetlogs_corruption=TRUE

SQL> STARTUP MOUNT PFILE='C:\Oracle\product\10.2.0\db_1\database\INITSEC.ORA';

5. 執行不完整復原並 OPEN RESETLOGS

SQL> RECOVER DATABASE UNTIL CANCEL;
-- 提示建議歸檔日誌路徑,直接輸入 CANCEL
ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: '...SYSTEM01.DBF'

SQL> ALTER DATABASE OPEN RESETLOGS;
Database altered.

此時 REDO01.LOG 重建完成,資料庫開啟成功。

事後必要收尾動作 (極重要)

  1. 立即完整匯出 (EXP FULL):exp system/manager file=full.dmp log=full.log full=y
  2. 移除隱含參數:編輯 PFILE 刪除 _allow_resetlogs_corruption,重建 SPFILE。
  3. 重建資料庫:建立新資料庫,匯入 (IMP) 剛才的 DMP。
  4. 檢查無效物件:SELECT * FROM dba_objects WHERE status='INVALID'; 並重新編譯。
  5. 建立備份策略:哪怕是測試庫,也要定期冷備份或開啟歸檔模式配合 RMAN。

總結

此案例展示了在極端無備份情況下的「救命稻草」,但代價是資料可能不一致。**備份才是縮短 RTO/RPO 的唯一正解。**

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