【Oracle筆記】在線日志文件的恢復方法


重做日志文件(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)聯機日志狀態通常有以下幾種:

  1. CURRENT - 當前正在被LGWR使用的group(同時是ACTIVE狀態),其中記載數據庫中正在進行的更改,刪除將導致恢復時數據丟失。
  2. ACTIVE - 活動的日志文件狀態,日志完成切換或等待檢查點事件時都可能出於這種狀態,不是CURRENT的日志但是實例恢復時是需要的,此時的日志有可能已經完成了歸檔,即將變成INACTIVE狀態,或者日志文件在等待Checkpoint事件沒有完成歸檔。
  3. INACTIVE - 非活動的日志狀態,此時的日志實例恢復時不再需要,可能已經歸檔。
  4. UNUSED - 尚未記錄change的空白日志組,一般會出現在add logfile, resetlogs打開數據庫或者使用了clear logfile命令后。
  5. CLEARING - 表示該組重做日志文件正在被ALTER DATABASE CLEAR LOGFILE語句重建中(重建后狀態會變成unused)。
  6. 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參數強制打開數據庫之前備份數據庫,防止恢復失敗,備份重於一切!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM