Oracle恢復例項之三:active或current聯機日誌檔案丟失

Jujay發表於2011-11-20
聯機日誌檔案狀態為active或current表示該日誌包含的資料修改還未完全同步到資料檔案中,在例項恢復時,還需要讀取其中的redo記錄重演,因此如果損壞,資料丟失在所難免。

1)模擬災難
首先檢視log的狀態:
SQL> select group#,sequence#,status from v$log;

    GROUP#  SEQUENCE# STATUS
---------- ---------- ----------------
         2          5 CURRENT
         3          3 INACTIVE
         4          4 INACTIVE

Group#2的狀態為current,我們找出它所對應的磁碟檔案為:
SQL> select group#,member from v$logfile where group#=2;

    GROUP# MEMBER
---------- ---------------------------------------------------------
         2 J:\INTEL_LOG\O04DMS0\REDO02.O04DMS0
如果資料庫時正常關閉,在關閉之前,會做一次資料檔案同步,因此為了模擬current檔案丟失的情況,我們異常關閉資料庫:
SQL> shutdown abort;
然後把Group#2對應的檔案REDO02.O04DMS0在作業系統級別上刪除。

2)根據錯誤資訊定位問題
啟動資料庫會出現以下錯誤
SQL> startup
ORACLE instance started.

Total System Global Area  281018368 bytes
Fixed Size                  1296292 bytes
Variable Size             251660380 bytes
Database Buffers           25165824 bytes
Redo Buffers                2895872 bytes
Database mounted.
ORA-00313: open failed for members of log group 2 of thread 1
ORA-00312: online log 2 thread 1: 'J:\INTEL_LOG\O04DMS0\REDO02.O04DMS0'
ORA-27041: unable to open file
OSD-04002: unable to open file
O/S-Error: (OS 2) The system cannot find the file specified.

由於有一組日誌檔案丟失,因此資料庫只能mount,無法open,檢視一下丟失的日誌檔案是什麼狀態:
SQL> select group#,sequence#,status from v$log where group#=2;

    GROUP#  SEQUENCE# STATUS
---------- ---------- ----------------
         2          5 CURRENT

非常不幸,丟失的日誌檔案時current狀態,也就是說資料丟失時難免的,現在能問題是如何讓資料庫能正常開啟。

這時候得修改一個隱藏引數_allow_resetlogs_corruption為true,這個引數為true表示” resetlogs forced to skip the consistency check“:

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

修改之後重啟讓其生效,接著做一次不完全恢復:
SQL> recover database until cancel;
ORA-00279: change 30656042 generated at 11/20/2011 05:32:01 needed for thread 1
ORA-00289: suggestion : H:\INTEL_ARCH\O04DMS0\O04DMS0_1_5_767679611.ARCH
ORA-00280: change 30656042 for thread 1 is in sequence #5


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: 'I:\INTEL_DATA\O04DMS0\SYSTEM01.O04DMS0'


ORA-01112: media recovery not started

選擇cancel,出現ORA-錯誤沒關係,這是預料之中的,接著以resetlogs方式開啟資料庫:
SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel

這時還是錯誤,可能是上面出現的ORA_03113,也可能是ORA-600錯誤,沒關係,這都是在預料之中,最後重啟一下就可以了。

此時REDO02.O04DMS0檔案在作業系統級別上已經恢復回來了,在資料庫中的狀態如下:
SQL> select group#,sequence#,status from v$log;

    GROUP#  SEQUENCE# STATUS
---------- ---------- ----------------
         2          1 INACTIVE
         3          2 CURRENT
         4          0 UNUSED

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

相關文章