REDO檔案丟失的恢復__沒有任何備份的情況

lusklusklusk發表於2017-07-28
以下為沒有任何備份的前提下,但是控制檔案、其他所有檔案都是OK的情況下


online redo inactive\unused檔案丟失,可以恢復,只要啟動到mount狀態,alter database clear logfile即可
比如手工刪除了active狀態的group 1的所有日誌檔案,啟動的時候報錯ORA-00313: open failed for members of log group 1 of thread 1
SQL> startup mount;
SQL> alter database clear logfile group 1;
SQL> alter database open;


online redo active檔案丟失,無法恢復。
SQL> select GROUP#,THREAD#,SEQUENCE#,STATUS from v$log;
    GROUP#    THREAD#  SEQUENCE# STATUS
---------- ---------- ---------- ----------------
         1          1         10 CURRENT
         3          1          9 ACTIVE
         2          1          8 ACTIVE

SQL> select status from v$instance;
STATUS
------------
MOUNTED

SQL> alter database clear logfile group 2;
alter database clear logfile group 2
*
ERROR at line 1:
ORA-01624: log 2 needed for crash recovery of instance orcl (thread 1)
ORA-00312: online log 2 thread 1: '/u01/app/oracle/oradata/orcl/redo02.log'



online redo current檔案丟失,基本上是無法恢復了
沒有任何備份的環境下online redo current檔案丟失(歸不歸檔都一樣),一般恢復不過來。但仍有如下大概的恢復方法,無法保證一定能成功,運氣好的話可能成功。
遇到這樣的問題,一般是如下場景
SQL>startup mount;
RMAN> restore database;
RMAN> recover database;
RMAN>alter database open resetlogs;
後會有如下提示
ORA-01194: file 1 needs more recovery to be consistent 
ORA-01110: data file 1: '/u01/app/oracle/oradata/DB/system01.dbf' 
這是因為當前的redo log寫入不完整導致庫無法開啟,我們需要使用強制open資料庫的方式,使其跳過資料庫對redo和undo 表空間的檢驗。 


恢復方法
1.備份所有資料檔案(強制開庫後所有檔案都會有一次寫入行為,如果強制開庫失敗,可能會導致最後一招DUL資料抽取工具都無法使用)
2.擷取出報錯ORA-01110中資料檔案的UNDO資訊,如上為system01.dbf
strings system01.dbf | grep _SYSSMU | cut -d $ -f 1 | sort -u
3.根據上面顯示的UNDO資訊,在pfile中新增引數_CORRUPTED_ROLLBACK_SEGMENTS,如下_SYSSMU1$表示以1開頭的所有UNDO資訊,一般如下配置就包括了所有的UNDO資訊,1開頭到9開頭的所有UNDO
_CORRUPTED_ROLLBACK_SEGMENTS=(_SYSSMU1$,_SYSSMU2$,_SYSSMU3$,_SYSSMU4$,_SYSSMU5$,_SYSSMU6$,_SYSSMU7$,_SYSSMU8$,_SYSSMU9$) 
4.pfile中繼續新增如下引數
UNDO_MANAGEMENT=MANUAL 
_ALLOW_RESETLOGS_CORRUPTION = TRUE
5.啟動資料到mount狀態
SQL>startup mount pfile='/..../init.ora' 
SQL>show parameter corrupt; 
SQL>show parameter undo 
6.Recover and open the database: 
SQL>RECOVER DATABASE UNTIL CANCEL; 
==>輸入CANCEL 
SQL>ALTER DATABASE OPEN RESETLOGS; 
ALTER DATABASE OPEN RESETLOGS 

ERROR at line 1: 
ORA-00603: ORACLE server session terminated by fatal error 
ORA-00600: internal error code, arguments: [2662], [2380], [2470549886], 
[2380], [2470550245], [12583040], [], [], [], [], [], [] 
ORA-00600: internal error code, arguments: [2662], [2380], [2470549885], 
[2380], [2470550245], [12583040], [], [], [], [], [], [] 
ORA-01092: ORACLE instance terminated. Disconnection forced 
ORA-00600: internal error code, arguments: [2662], [2380], [2470549881], 
[2380], [2470550245], [12583040], [], [], [], [], [], [] 
Process ID: 4066 
Session ID: 3753 Serial number: 3 
7.如果上面報錯ora-00600 [2662],則需要推進SCN,執行一次10015 level 1表示推進100萬,執行兩次表示推進200萬,10015 level 1表示推進500萬,如下表示推進了700萬,推進多次後alter database open還是報ORA-01113的話就沒轍了 
SQL> shutdown abort;
SQL> startup mount pfile='/..../init.ora'; 
SQL> ALTER SESSION SET EVENTS '10015 TRACE NAME ADJUST_SCN LEVEL 1'; 
Session altered. 
SQL> ALTER SESSION SET EVENTS '10015 TRACE NAME ADJUST_SCN LEVEL 1'; 
Session altered. 
SQL> ALTER SESSION SET EVENTS '10015 TRACE NAME ADJUST_SCN LEVEL 5'; 
Session altered. 
SQL> alter database open; 
alter database open 

ERROR at line 1: 
ORA-01113: file 1 needs media recovery 
ORA-01110: data file 1: '/u01/app/oracle/oradata/DB/system01.dbf' 





注意:利用上面這種方法開啟的資料庫,很有可能存在不一致的地方,所以用exp/imp的方法將資料匯入到新庫中。 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30126024/viewspace-2142751/,如需轉載,請註明出處,否則將追究法律責任。

相關文章