ORA-00313、ORA-00312,指向 REDO01.LOG 找不到;檢查目錄發現所有 Redo Log 檔案全數消失 (推測曾誤刪)。所有 Redo Log 遺失,包含 Current (Group 1) 與 Inactive/Unused (Group 2, 3)。無備份、非歸檔模式下,唯一可行路徑:
CLEAR LOGFILE 重建非當前群組 (Group 2, 3)。_allow_resetlogs_corruption=TRUE 配合 RECOVER DATABASE UNTIL CANCEL 並 OPEN RESETLOGS 強制重建,代價是**犧牲未歸檔的交易資料**,並可能導致資料不一致,事後務必匯出重建。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 = 非當前。
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。
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.
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';
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 重建完成,資料庫開啟成功。
exp system/manager file=full.dmp log=full.log full=y_allow_resetlogs_corruption,重建 SPFILE。SELECT * FROM dba_objects WHERE status='INVALID'; 並重新編譯。此案例展示了在極端無備份情況下的「救命稻草」,但代價是資料可能不一致。**備份才是縮短 RTO/RPO 的唯一正解。**