數據庫環境簡介:
操作系統: 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記住,為了縮短故障時間,最有效的方法就是——————備份!制定有效的備份策略,即便這個數據庫僅僅用於測試和娛樂。