聯機重做日誌檔案的恢復

kngnng發表於2013-03-11

說明

         針對聯機重做日誌檔案,我們並不需要做特殊的備份,因為他的存在特殊性,oracle幾乎每時每刻都在寫入應用日誌檔案,只要對其有一定的冗餘處理即可,oracle會劃分日誌檔案組,每個組中還會包含多個成員,保證日誌檔案的安全性,但不能保證日誌檔案都已經損壞,如磁碟損壞等情況。針對日誌檔案有無寫入應用,這裡有不同的情況來恢復。

 

丟失非當前聯機日誌

1        查詢日誌檔案狀態

SQL>select group#,thread#,sequence#,members,archived,status from v$log;

 

    GROUP#    THREAD#  SEQUENCE#    MEMBERS ARC STATUS

---------- ---------- ---------- ---------- --- ----------------

         1          1          4          1 NO  CURRENT

         3          1          3          1 YES INACTIVE

         2          1          2          1 YES INACTIVE

         這裡有必要說一下各種狀態資訊,對於status6種不同的值

         unused:表示日誌檔案還沒有被應用過,一般在資料庫剛剛建立或者open resetlogs

         current:表示當前日誌

         active:表示活動的,即使不是當前的日誌,也代表了正在被使用或者將要被使用

         clearing:表示日誌正在被清空,在資料庫執行:alter database clear logfile後,日誌會                                成為這個狀態,執行完成後會變為unused;

         clearing_current:表示日誌正在被清空,但是由於清空出錯,導致無法完成清空二報錯。

         Inactive:表示不活動狀態,日誌已經被歸檔或者已經寫入資料檔案,日誌檔案已經可                                以被重用。

         查詢到日誌1號、2號日誌狀態當前為非活動。

2        模擬丟失日誌檔案

SQL>shutdown immediate;

[oracle@dev206 oracle]$ rm -rf /oracle/u01/app/oracle/oradata/orcl/redo03.log

         啟動資料庫    

SQL>conn / as sysdba;

SQL>startup;

ORA-32004: obsolete and/or deprecated parameter(s) specified

ORACLE instance started.

 

Total System Global Area 1224736768 bytes

Fixed Size                  2020384 bytes

Variable Size             352324576 bytes

Database Buffers          855638016 bytes

Redo Buffers               14753792 bytes

Database mounted.

ORA-00313: open failed for members of log group 3 of thread 1

ORA-00312: online log 3 thread 1:

'/oracle/u01/app/oracle/oradata/orcl/redo03.log'

         啟動失敗,丟失找不到日誌檔案redo03.log,資料庫啟動到mount狀態

3        修復丟失的聯機重做日誌檔案

SQL>alter database clear logfile group 3;

        

4        啟動資料庫

SQL>alter database open;

 

5        檢查日誌檔案

         通過檢視V$log檢視和檢視檔案,新的日誌檔案已經生成。

 

丟失當前聯機日誌

         如果丟失當前聯機日誌檔案,即使有備份也肯能會丟失資料。並且資料庫在open狀態,丟失線上日誌檔案會造成資料庫的崩潰。

1        查詢日誌檔案狀態

SQL> select group#,thread#,sequence#,members,archived,status from v$log;

 

    GROUP#    THREAD#  SEQUENCE#    MEMBERS ARC STATUS

---------- ---------- ---------- ---------- --- ----------------

         1          1         13          1 YES INACTIVE

         2          1         15          1 NO  CURRENT

         3          1         14          1 YES INACTIVE       

        

2        模擬丟失日誌檔案

SQL>shutdown abort;

SQL>startup mount;

[oracle@dev206 oracle]$ rm -rf /oracle/u01/app/oracle/oradata/orcl/redo02.log

         啟動資料庫    

SQL> alter database open;

alter database open

*

ERROR at line 1:

ORA-00313: open failed for members of log group 2 of thread 1

ORA-00312: online log 2 thread 1:

'/oracle/u01/app/oracle/oradata/orcl/redo02.log'

ORA-27037: unable to obtain file status

Linux-x86_64 Error: 2: No such file or directory

Additional information: 3

         啟動失敗,丟失找不到日誌檔案redo02.log

3        嘗試直接修復丟失的聯機重做日誌檔案

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:

'/oracle/u01/app/oracle/oradata/orcl/redo02.log'

         此時由於丟失資訊,無法正常恢復。

4        執行不完全恢復

         如果資料庫開啟歸檔並有備份,可以利用備份進行不完全恢復,會丟失資料。

         如果沒有備份的情況下,只能強制恢復了,需要利用oracle的內建函式跳過一致性檢查。

SQL>alter system set "_allow_resetlogs_corruption"=true scope=spfile;

SQL>shutdown immediate;

SQL>startup mount;

 

5        恢復資料庫

SQL>recover database until cancel;

ORA-00279: change 6078001 generated at 03/11/2013 13:42:25 needed for thread 1

ORA-00289: suggestion :

/oracle/u01/app/oracle/oradata/orcl/archive/1_15_809543188.dbf

ORA-00280: change 6078001 for thread 1 is in sequence #15

 

 

Specify log: {=suggested | filename | AUTO | 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: '/oracle/u01/app/oracle/oradata/orcl/system01.dbf'

 

 

ORA-01112: media recovery not started

SQL>alter database open resetlogs;

         此時資料庫啟動恢復完成

6        善後處理

         此時資料庫雖然恢復完成,但是通過檢視alert日誌後可能會出現ORA-600的錯誤,包括SCN混亂或者undo表空間的錯誤等,造成這種問題的原因有資料庫在丟失日誌檔案時的資料不一致,包括提交的資料未寫入資料檔案,未提交的資料寫入了資料檔案等情況。此時我們可以通過export資料後新建庫在import新庫來解決。

         鑑於日誌檔案的重要性,但是又沒有日誌檔案的備份,一定要做好聯機日誌檔案的冗餘。

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

相關文章