備份:
alter database backup controlfile to 'xxxxxxx' reuse; alter database bakcup controlfile to trace as 'xxxxxxx'; RMAN備份控制檔案
|
恢複執行個體:
1.控制檔案損壞後利用二進位備份恢複(異常斷電)
備份控制檔案: alter database backup controlfile to '/home/oracle/control.ctl ' reuse; 插入測試資料: SQL> insert into t1 values(1); SQL> commit; 類比斷電: SQL> shutdown abort; 類比控制檔案故障: rm -rf /database/oradata/skyread/control01.ctl rm -rf /database/oradata/skyread/control02.ctl rm -rf /database/oradata/skyread/control03.ctl 再次開啟資料庫: SQL> startup; ORA-00205: error in identifying control file, check alert log for more info 報00205錯誤 把備份檔案複製到資料庫控制檔案所在位置: cp /home/oracle/control.ctl /database/oradata/skyread/control01.ctl cp /home/oracle/control.ctl /database/oradata/skyread/control02.ctl cp /home/oracle/control.ctl /database/oradata/skyread/control03.ctl SQL> startup force mount Total System Global Area 5049942016 bytes Fixed Size 2090880 bytes Variable Size 1375733888 bytes Database Buffers 3657433088 bytes Redo Buffers 14684160 bytes Database mounted.
|
檢查資料檔案,資料檔案頭,記錄檔以及控制檔案的scn資訊,由於是機器斷電,所以這裡fuzzy的狀態是YES
SQL> select file#,status,fuzzy,CHECKPOINT_CHANGE# from v$datafile_header;
FILE# STATUS FUZ CHECKPOINT_CHANGE# -------------------- ------- --- -------------------- 1 ONLINE YES 122694280130 2 ONLINE YES 122694280130 3 ONLINE YES 122694280130 4 ONLINE YES 122694280130 18 ONLINE YES 122694280130 26 ONLINE YES 122694280130 31 ONLINE YES 122694280130
SQL> select group#,sequence#,members,archived,status,first_change# from v$log;
GROUP# SEQUENCE# MEMBERS ARC STATUS FIRST_CHANGE# -------------------- -------------------- -------------------- --- ---------------- -------------------- 1 1 1 NO CURRENT 122694212304 2 2 1 YES INACTIVE 122693905385 5 3 1 YES INACTIVE 122694191761 4 4 1 YES INACTIVE 122694190542 3 5 1 YES INACTIVE 122694168156
CONTROLFILE_CHANGE#是備份時的控制檔案SCN,這裡資料檔案的檢查點肯定是大於當時備份的控制檔案,所以資料開啟的時候,資料檔案,記錄檔,控制檔案的檢查點資訊是不一致的,要進行介質恢複到一致,才能開啟,以上V$LOG,V$DATAFILE都是和備份的控制檔案的檢查點一致的。但是v$datafile_header記錄的是最新的,就是資料庫關閉前的。所以如果開啟的時候做會做檢查,檢查資料檔案頭的檢查點計數和與現在控制檔案的檢查點技術是否相等,如果相等,進行第二次檢查,也就是檢查資料檔案頭開始的SCN和控制檔案結束的SCN是否相等,如果相等,就不需要進行恢複,不相等,就需要進行恢複。這裡明顯是不相等的,所以需要recovery。 SQL> select checkpoint_change#,controlfile_change#,resetlogs_change# from v$database;
CHECKPOINT_CHANGE# CONTROLFILE_CHANGE# RESETLOGS_CHANGE# -------------------- -------------------- -------------------- 122694212305
122694259161
122693676208
介質恢複資料庫:提示需要應用redo01.log SQL> recover database using backup controlfile; ORA-00279: change 122694280130 generated at 05/03/2013 11:25:37 needed for thread 1 ORA-00289: suggestion : /database/oradata/arch/1_1_814447469.dbf ORA-00280: change 122694280130 for thread 1 is in sequence #1
Specify log: {<RET>=suggested | filename | AUTO | CANCEL} /database/oradata/skyread/redo01.log Log applied. Media recovery complete. 重設記錄檔開啟資料庫: SQL> alter database open resetlogs; Database altered.
2.控制檔案損壞後利用trace檔案重建控制檔案(順利關機) 備份控制檔案為文字格式設定 SQL> alter database backup controlfile to trace as '/home/oracle/controlfile.sql' reuse; Database altered. 乾淨關閉資料庫並破壞所有控制檔案 SQL> shutdown immediate;
mv /database/oradata/skyread/control01.ctl /database/oradata/skyread/control01.ctl.bak mv /database/oradata/skyread/control02.ctl /database/oradata/skyread/control02.ctl.bak mv /database/oradata/skyread/control03.ctl /database/oradata/skyread/control03.ctl.bak
開啟資料庫出錯 SQL> startup; ORACLE instance started.
Total System Global Area 5049942016 bytes Fixed Size 2090880 bytes Variable Size 1375733888 bytes Database Buffers 3657433088 bytes Redo Buffers 14684160 bytes ORA-00205: error in identifying control file, check alert log for more info
在nomount模式用/home/oracle/controlfile.sql中的語句重建控制檔案,注意這裡用的是NORESETLOGS,這裡因為我們是乾淨關閉資料做的測試,相當於資料檔案和記錄檔都是沒有損壞的,這裡是基於資料檔案頭和記錄檔頭的資訊構建出控制檔案,所以這個控制檔案和資料檔案頭和記錄檔頭都是一致的,既然是一致的,那麼都不需要recover,直接開啟資料庫即可。
注意:這裡如果是用二進位備份控制檔案進行恢複,還是需要recover的,因為你備份的二進位檔案和當前的資料檔案頭資訊一般是不一致的。 CREATE CONTROLFILE REUSE DATABASE "SKYREAD" NORESETLOGS FORCE LOGGING ARCHIVELOG MAXLOGFILES 20 MAXLOGMEMBERS 5 MAXDATAFILES 1000 MAXINSTANCES 8 MAXLOGHISTORY 2337 LOGFILE GROUP 1 '/database/oradata/skyread/redo01.log' SIZE 512M, GROUP 2 '/database/oradata/skyread/redo02.log' SIZE 512M, GROUP 3 '/database/oradata/skyread/redo03.log' SIZE 512M, GROUP 4 '/database/oradata/skyread/redo04.log' SIZE 512M, GROUP 5 '/database/oradata/skyread/redo05.log' SIZE 512M DATAFILE '/database/oradata/skyread/system01.dbf', '/database/oradata/skyread/tbs_test.dbf', '/database/oradata/skyread/sysaux01.dbf', '/database/oradata/skyread/users01.dbf', '/database2/oradata/skyread/TBS_MRPMUSIC01.dbf', '/database/oradata/skyread/sf01.dbf', '/database2/oradata/skyread/undotbs02' CHARACTER SET UTF8;
SQL> alter database open; Database altered