重做日志文件(redo log file)是Oracle數據庫中至關重要的事務日志,是數據庫崩潰恢復的重要依據,通常用於以下幾個方面:
- 實例恢復。
- 維護DATAGUARD中的備庫(standby)。
- 通過備份恢復介質故障。
- 用於日志挖掘,可以將其復制或輸出到流中。
重做日志文件可以分為在線(online)日志文件和歸檔(archived)日志文件兩種類別,歸檔日志文件作為在線日志文件的一個備份,它的產生取決於數據庫是否開啟歸檔模式(archivelog);那么日志文件這么重要,要是出現介質故障怎么辦呢?這里就來淺談一下關於在線日志文件的恢復方法。
實驗環境:linux 5.2 + Oracle Database 11.2.0.1.0
首先來看看日志文件的幾種狀態,可以通過查詢v$log視圖的status字段獲取狀態信息:
SYS@db11g>select group#,members,thread#,sequence#,status,archived from v$log; GROUP# MEMBERS THREAD# SEQUENCE# STATUS ARC ---------- ---------- ---------- ---------- ---------------- --- 1 2 1 226 INACTIVE YES 2 2 1 227 CURRENT NO 3 2 1 225 INACTIVE YES
這里我開啟了歸檔模式,有三個日志組,每組兩個日志文件,可以看到現在的在線日志文件只有兩種狀態(INACTIVE,CURRENT)聯機日志狀態通常有以下幾種:
- CURRENT - 當前正在被LGWR使用的group(同時是ACTIVE狀態),其中記載數據庫中正在進行的更改,刪除將導致恢復時數據丟失。
- ACTIVE - 活動的日志文件狀態,日志完成切換或等待檢查點事件時都可能出於這種狀態,不是CURRENT的日志但是實例恢復時是需要的,此時的日志有可能已經完成了歸檔,即將變成INACTIVE狀態,或者日志文件在等待Checkpoint事件沒有完成歸檔。
- INACTIVE - 非活動的日志狀態,此時的日志實例恢復時不再需要,可能已經歸檔。
- UNUSED - 尚未記錄change的空白日志組,一般會出現在add logfile, resetlogs打開數據庫或者使用了clear logfile命令后。
- CLEARING - 表示該組重做日志文件正在被ALTER DATABASE CLEAR LOGFILE語句重建中(重建后狀態會變成unused)。
- CLEARING_CURRENT - 表示該組重做日志文件重建時出現錯誤,出現對日志文件的I/O故障就會出現這種狀態。
丟失某個日志組中的某個member:
這種情況在日志多路復用的情況下是不影響數據庫使用的,所以建議日志組的成員數至少2個。
歸檔模式丟失日志組(整個日志組):
在歸檔模式下,如果丟失了非CURRENT日志組,這會在日志切換時因無法歸檔導致數據庫hang住,這時需要使用 ALTER DATABASE CLEAR LOGFILE 語句重新創建組中的成員,這樣不會影響任何事務處理。
如果日志已經歸檔,一般只需要clear就可以重建該日志文件,但是如果該數據庫處於歸檔狀態但該日志組還沒有歸檔,就需要使用alter database clear unarchived logfile強行clear,強制clear沒有歸檔的日志組建議在操作后立即對數據庫執行新的完全備份,因為日志已丟失,所有日志丟失之前的恢復將失效。
操作演示:
SYS@ORA10G>!rm -rf /u01/app/oracle/oradata/ORA11G/redo03* SYS@db11g>startup mount; ORACLE instance started. Total System Global Area 521936896 bytes Fixed Size 2214936 bytes Variable Size 423625704 bytes Database Buffers 92274688 bytes Redo Buffers 3821568 bytes Database mounted. SYS@db11g>alter database clear logfile group 3; alter database clear logfile group 3 * ERROR at line 1: ORA-00350: log 3 of instance db11g (thread 1) needs to be archived ORA-00312: online log 3 thread 1: '/u01/app/oracle/oradata/db11g/redo03.log' ORA-00312: online log 3 thread 1: '/u01/app/oracle/oradata/db11g/redo03_b.log' SYS@db11g>alter database clear unarchived logfile group 3; Database altered. SYS@db11g>alter database open; Database altered.
非歸檔模式丟失CURRENT日志組
無歸檔,無備份,一旦當前的重做日志文件損壞,Oracle是不允許數據庫打開的,這是極端的故障,不過用戶希望強制打開數據庫挽回數據丟失,也就是忽略一致性打開數據庫,針對這種情況可以使用_allow_resetlogs_corruption參數嘗試修復,模擬一下環境:
1,mount狀態下查看日志狀態
SYS@db11g>startup mount;
ORACLE instance started.
Total System Global Area 521936896 bytes
Fixed Size 2214936 bytes
Variable Size 423625704 bytes
Database Buffers 92274688 bytes
Redo Buffers 3821568 bytes
Database mounted.
SYS@db11g>select group#,members,thread#,sequence#,status,archived from v$log;
GROUP# MEMBERS THREAD# SEQUENCE# STATUS ARC
---------- ---------- ---------- ---------- ---------------- ---
1 2 1 244 CURRENT NO
3 2 1 0 UNUSED NO
2 2 1 243 INACTIVE NO
2,這個時候干掉current日志組
SYS@db11g>! rm -rf /u01/app/oracle/oradata/db11g/redo01*
3,打開數據庫報錯
SYS@db11g>alter database open;
alter database open
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel
Process ID: 31815
Session ID: 1 Serial number: 5
查看alert日志
Additional information: 3
ORA-00312: online log 1 thread 1: '/u01/app/oracle/oradata/db11g/redo01.log'
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3
Errors in file /u01/app/oracle/diag/rdbms/db11g/db11g/trace/db11g_ora_31815.trc:
ORA-00313: open failed for members of log group 1 of thread
ORA-00312: online log 1 thread 1: '/u01/app/oracle/oradata/db11g/redo01.log'
ORA-00312: online log 1 thread 1: '/u01/app/oracle/oradata/db11g/redo01_b.log'
USER (ospid: 31815): terminating the instance due to error 313
Instance terminated by USER, pid = 31815
此時數據庫實例已經down下來了。
設置_allow_resetlogs_corruption參數方式打開數據庫:
1,創建參數文件
SYS@db11g>create pfile from spfile;
File created.
2,添加參數如下
*._allow_resetlogs_corruption=true
3,resetlog起庫,之前需要執行recover動作
SYS@db11g>conn / as sysdba
Connected to an idle instance.
SYS@db11g>create pfile from spfile;
File created.
SYS@db11g>startup mount;
ORACLE instance started.
Total System Global Area 521936896 bytes
Fixed Size 2214936 bytes
Variable Size 423625704 bytes
Database Buffers 92274688 bytes
Redo Buffers 3821568 bytes
Database mounted.
SYS@db11g>alter database open resetlogs;
alter database open resetlogs
*
ERROR at line 1:
ORA-01139: RESETLOGS option only valid after an incomplete database recovery
SYS@db11g>recover database until cancel;
Media recovery complete.
SYS@db11g>alter database open resetlogs;
Database altered.
通常這個起庫過程都會伴隨一系列的ora-600的,此時需要使用別的手段繼續進行調整恢復,如導出數據,值得注意的是這種resetlogs打開數據庫方式跳過了一致性檢查,數據庫可能已經損壞,所以建議在執行使用_allow_resetlogs_corruption參數強制打開數據庫之前備份數據庫,防止恢復失敗,備份重於一切!!