【故障恢復】【驚魂】ORACLE聯機日誌檔案無故全部消失

secooler發表於2009-06-16
資料庫環境簡介:
作業系統:  Windows XP
資料庫版本: Oracle 10.2.0.1
歸檔模式:  非歸檔
備份策略:  沒有任何的備份策略,無備份可用
用途:      測試資料庫

【故障描述】
今天在啟動本機測試用資料庫時驚現資料庫無法啟動,提示如下:

C:\>sqlplus / as sysdba

SQL*Plus: Release 10.2.0.1.0 - Production on Tue Jun 16 18:25:43 2009

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

Connected to an idle instance.

SQL> startup;
ORACLE instance started.

Total System Global Area  167772160 bytes
Fixed Size                  1247876 bytes
Variable Size              75498876 bytes
Database Buffers           83886080 bytes
Redo Buffers                7139328 bytes
Database mounted.
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: 'C:\ORACLE\PRODUCT\10.2.0\ORADATA\SEC\REDO01.LOG'


SQL>

如上提示,系統找不到聯機日誌檔案,一身冷汗,就算是測試資料庫也不能就這樣“掛”了啊!
順著錯誤提示的目錄,進入到日誌檔案所在的目錄,哇塞,全部的日誌檔案都不見了!(現在想想,可能是因為這個測試資料庫我好久沒有問津了,也許在某一次的C盤檔案批次整理的過程中連帶這些重要的檔案一同“整理”掉了),心中不免有些緊張,轉念一想幸好是測試資料庫,釋然一下下,於是……我決定————恢復之,現把整個的恢復過程記錄如下,希望螢幕前的您不要再犯我這樣的錯誤了,作為一位DBA是絕對不應該允許自己犯這樣的錯誤,即使是純純的測試資料庫。

【故障分析】
因為是全部的日誌檔案都被刪除了,所以既包含當前聯機日誌,也包含非當前聯機日誌,我恢復的順序是:先透過Clear的方式恢復非當前聯機日誌,再透過設定隱含引數_allow_resetlogs_corruption=TRUE的方式恢復當前聯機日誌(使用這種極端的恢復方式是我不想看到的,沒有辦法,誰叫我沒有備份呢,找了半天連冷備都沒做過。如果您有備份,記住要優先考慮使用備份進行恢復)。

【故障處理】
1.透過v$log檢視確定哪些是當前聯機日誌和非當前聯機日誌
SQL> select * from v$log;

 GROUP# THREAD#  SEQUENCE#    BYTES MEMBERS ARC STATUS   FIRST_CHANGE# FIRST_TIM
------- ------- ---------- -------- ------- --- -------- ------------- ---------
      1       1          2 52428800       1 NO  CURRENT         272945 16-JUN-09
      3       1          1 52428800       1 NO  INACTIVE        252940 16-JUN-09
      2       1          0 52428800       1 YES UNUSED               0


確定如下:
group 1是當前聯機日誌
group 2 和group 3是非當前聯機日誌

2.透過Clear方式恢復非當前聯機日誌group 2 和group 3
SQL> alter database clear logfile group 2;

Database altered.

SQL> alter database clear logfile group 3;

Database altered.

此時檢視日誌檔案所在的目錄會依次恢復出兩個50M的日誌檔案REDO02.LOG和REDO03.LOG
(註釋:如果是該日誌組還沒有歸檔,則需要用如下的SQL命令進行操作
alter database clear unarchived logfile group 2;)

3.恢復當前聯機日誌 group 1,先演示確認一下透過clear的方式無法恢復當前聯機日誌
SQL> alter database clear logfile group 1;
alter database clear logfile group 1
*
ERROR at line 1:
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: 'C:\ORACLE\PRODUCT\10.2.0\ORADATA\SEC\REDO01.LOG'
ORA-27041: unable to open file
OSD-04002: unable to open file
O/S-Error: (OS 2) The system cannot find the file specified.

4.設定隱含引數_allow_resetlogs_corruption為“TRUE”
生成pfile
SQL> create pfile from spfile;

File created.

停掉資料庫
SQL> shutdown immediate;
ORA-01109: database not open


Database dismounted.
ORACLE instance shut down.

在生成的pfile(對應檔案是C:\oracle\product\10.2.0\db_1\database\INITsec.ORA)最後一行新增如下內容,儲存退出
_allow_resetlogs_corruption=TRUE

5.使用pfile啟動資料庫到mount狀態
SQL> startup mount pfile=C:\oracle\product\10.2.0\db_1\database\INITsec.ORA;
ORACLE instance started.

Total System Global Area  167772160 bytes
Fixed Size                  1247876 bytes
Variable Size              75498876 bytes
Database Buffers           83886080 bytes
Redo Buffers                7139328 bytes
Database mounted.

6.利用until cancel進行恢復
SQL> recover database until cancel;
ORA-00279: change 274548 generated at 06/16/2009 19:15:54 needed for thread 1
ORA-00289: suggestion : C:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\SEC\ARCHIVELOG\2009_06_16\O1_MF_1_1_%U_.ARC
ORA-00280: change 274548 for thread 1 is in sequence #1


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: 'C:\ORACLE\PRODUCT\10.2.0\ORADATA\SEC\SYSTEM01.DBF'


ORA-01112: media recovery not started

7.resetlogs方式開啟資料庫
SQL> alter database open resetlogs;

Database altered.

這時在日誌檔案所在的目錄中就可以看到被恢復出來的當前聯機日誌REDO01.LOG

8.到此,恢復過程完成,後續任務一:進行全庫的EXP備份
C:\>exp system/system file=exp_full_backup.dmf log=exp_full_backup.log full=y

9.後續任務二:取消隱含引數_all_resetlogs_corrupt

10.後續任務三:重建資料庫

11.後續任務四:使用IMP將剛剛備份的檔案匯入到資料庫中

12.檢查一下是否有無效的物件,處理之

13.搞定!

【總結】
針對這個測試庫,如果我有備份,恢復過程將大大簡化,也許只需要此恢復過程的1/10時間。
所以,
請每一位親愛的DBA記住,為了縮短故障時間,最有效的方法就是——————備份!制定有效的備份策略,即便這個資料庫僅僅用於測試和娛樂。

Good lucky.

-- The End --

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

相關文章