Oracle恢復例項之一:資料檔案、控制檔案、聯機日誌丟失

Jujay發表於2011-11-20
假設儲存資料庫檔案的硬碟出現了故障,導致當前資料庫所有的控制檔案、資料檔案、聯機日誌檔案都丟失或損壞了,而只剩下備份集和該備份集之後的所有歸檔日誌檔案,在這種情況下,由於聯機日誌檔案已經丟失,只能使用不完全恢復,恢復的情況由歸檔日誌檔案的完整度決定。現在我們開始來模擬這個實驗:
1)首先,備份資料庫,待會兒就利用這個備份集來做恢復。
RMAN> backup database format'H:\INTEL_DB_DUMPS\O04DMS0\rman\O04DMS0_%U';

Starting backup at 20-NOV-11
using channel ORA_DISK_1
channel ORA_DISK_1: starting full datafile backupset
channel ORA_DISK_1: specifying datafile(s) in backupset
input datafile fno=00001 name=I:\INTEL_DATA\O04DMS0\SYSTEM01.O04DMS0
input datafile fno=00002 name=I:\INTEL_DATA\O04DMS0\UNDOTBS01.O04DMS0
input datafile fno=00006 name=I:\INTEL_DATA\O04DMS0\SYSAUX01.O04DMS0
input datafile fno=00003 name=I:\INTEL_DATA\O04DMS0\USERS01.O04DMS0
input datafile fno=00004 name=I:\INTEL_DATA\O04DMS0\SECURITY_D.O04DMS0
input datafile fno=00005 name=K:\INTEL_INDEX\O04DMS0\SECURITY_I.O04DMS0
channel ORA_DISK_1: starting piece 1 at 20-NOV-11
channel ORA_DISK_1: finished piece 1 at 20-NOV-11
piece handle=H:\INTEL_DB_DUMPS\O04DMS0\RMAN\O04DMS0_05MS3KIH_1_1 tag=TAG20111120T033648 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:37
Finished backup at 20-NOV-11

Starting Control File and SPFILE Autobackup at 20-NOV-11
piece handle=H:\INTEL_DB_DUMPS\O04DMS0\RMAN_F\C-3120696418-20111120-00 comment=NONE
Finished Control File and SPFILE Autobackup at 20-NOV-11

注意這次備份產生2個檔案,第一個包含所有的資料檔案,第二個包含控制檔案和引數檔案。

2)準備測試資料,我們向測試表中插入兩條資料,第一條的redo已經被歸檔,而第二條的redo還在聯機日誌中。
建立測試表:
SQL> create table test (id number);
插入第一條資料:
SQL> insert into test values(1);
SQL> commit;
切換日誌使得包含第一天的redo被歸檔:
SQL>alter system switch logfile;
插入第二條資料,該條資料所對應的redo未被歸檔:
SQL> insert into test values(2);
SQL> commit;

3)模擬災難:刪除所有的資料檔案、控制檔案、聯機日誌檔案,且資料庫
異常關閉資料庫:
SQL> shutdown abort;
刪除所有的資料檔案,聯機日誌和控制檔案。

4)從備份集中恢復控制檔案:
首先啟動資料庫至nomount狀態(可以啟動到nomount狀態時因為引數檔案還在):
RMAN> startup nomount
接著從備份集中恢復控制檔案:
RMAN> restore controlfile from 'H:\INTEL_DB_DUMPS\O04DMS0\RMAN_F\C-3120696418-20111120-00';

Starting restore at 20-NOV-11
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=157 devtype=DISK

channel ORA_DISK_1: restoring control file
channel ORA_DISK_1: restore complete, elapsed time: 00:00:17
output filename=I:\INTEL_DATA\O04DMS0\CONTROL01.O04DMS0
output filename=J:\INTEL_LOG\O04DMS0\CONTROL02.O04DMS0
output filename=K:\INTEL_INDEX\O04DMS0\CONTROL03.O04DMS0
Finished restore at 20-NOV-11

5)所有的控制檔案都已經恢復成功,現在開始恢復資料檔案:
RMAN> sql 'alter database mount';
RMAN> restore database;

Starting restore at 20-NOV-11
using channel ORA_DISK_1

channel ORA_DISK_1: starting datafile backupset restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
restoring datafile 00001 to I:\INTEL_DATA\O04DMS0\SYSTEM01.O04DMS0
restoring datafile 00002 to I:\INTEL_DATA\O04DMS0\UNDOTBS01.O04DMS0
restoring datafile 00003 to I:\INTEL_DATA\O04DMS0\USERS01.O04DMS0
restoring datafile 00004 to I:\INTEL_DATA\O04DMS0\SECURITY_D.O04DMS0
restoring datafile 00005 to K:\INTEL_INDEX\O04DMS0\SECURITY_I.O04DMS0
restoring datafile 00006 to I:\INTEL_DATA\O04DMS0\SYSAUX01.O04DMS0
channel ORA_DISK_1: reading from backup piece H:\INTEL_DB_DUMPS\O04DMS0\RMAN\O04DMS0_05MS3KIH_1_1
channel ORA_DISK_1: restored backup piece 1
piece handle=H:\INTEL_DB_DUMPS\O04DMS0\RMAN\O04DMS0_05MS3KIH_1_1 tag=TAG20111120T033648
channel ORA_DISK_1: restore complete, elapsed time: 00:00:56
Finished restore at 20-NOV-11

資料檔案恢復成功。

6)註冊備份集之後產生的歸檔日誌。
由於控制檔案時從備份集中恢復過來的,因此控制檔案中記錄的歸檔日誌是不完整的:
SQL> select name from v$archived_log;
NAME
------------------------------------------------------------------------------
H:\INTEL_ARCH\O04DMS0\O04DMS0_1_1043_686537442.ARCH
H:\INTEL_ARCH\O04DMS0\O04DMS0_1_1044_686537442.ARCH
H:\INTEL_ARCH\O04DMS0\O04DMS0_1_1045_686537442.ARCH
H:\INTEL_ARCH\O04DMS0\O04DMS0_1_1046_686537442.ARCH
從上面輸出可以看出控制檔案記錄的最新的歸檔日誌為1046,而在硬碟上還有一個O04DMS0_1_1047_686537442.ARCH,這個歸檔日誌是在備份之後產生的,因此未被記錄在控制檔案中,下面我們用rman提供的catalog命令註冊歸檔日誌到控制檔案中:
RMAN> catalog archivelog 'H:\INTEL_ARCH\O04DMS0\O04DMS0_1_1047_686537442.ARCH';

cataloged archive log
archive log filename=H:\INTEL_ARCH\O04DMS0\O04DMS0_1_1047_686537442.ARCH recid=1006 stamp=767678151

7)執行不完全恢復
當所有的歸檔日誌都已經註冊到控制檔案中後,就可以開始執行不完全恢復:
SQL> recover database using backup controlfile until cancel;
ORA-00279: change 30650218 generated at 11/20/2011 03:36:51 needed for thread 1
ORA-00289: suggestion : H:\INTEL_ARCH\O04DMS0\O04DMS0_1_1047_686537442.ARCH
ORA-00280: change 30650218 for thread 1 is in sequence #1047


Specify log: {=suggested | filename | AUTO | CANCEL}
AUTO
ORA-00279: change 30650338 generated at 11/20/2011 03:39:26 needed for thread 1
ORA-00289: suggestion : H:\INTEL_ARCH\O04DMS0\O04DMS0_1_1048_686537442.ARCH
ORA-00280: change 30650338 for thread 1 is in sequence #1048
ORA-00278: log file 'H:\INTEL_ARCH\O04DMS0\O04DMS0_1_1047_686537442.ARCH' no
longer needed for this recovery


ORA-00308: cannot open archived log
'H:\INTEL_ARCH\O04DMS0\O04DMS0_1_1048_686537442.ARCH'
ORA-27041: unable to open file
OSD-04002: unable to open file
O/S-Error: (OS 2) The system cannot find the file specified.

選擇AUTO之後,Oracle會自動應用所有的歸檔日誌,知道無法找到為止,出現的ORA-錯誤都是可以忽略的。
最後以resetlogs方式開啟資料庫:
SQL> alter database open resetlogs;
SQL> select * from test;

        ID
----------
         1
查詢測試表,發現只有第一條記錄,第二天丟失,這和我們之前預測的一樣。



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

相關文章