當資料庫做了DML或DDL操作之後,LGWR進程會將這些操作記錄到重做日誌中。
Oracle最少要包含兩個日誌組。 一個日誌組可以有多個日誌成員,每個成員互為鏡像, 內容完全一致。
重做日誌損壞嚴重時,會造成資料庫不能開啟或造成運行狀態下的資料庫被中止。特別是當前活動紀錄組因為檔案系統損壞或其它原因
整個損壞時,恢複會是件非常麻煩的事。
下面是幾種損壞情況下的恢複方法.
一. 刪除損壞的日誌群組成員
1.確定出現介質失敗的日誌成員
SELECT member FROM v$logfile WHERE status='INVALID';
2.如果介質失敗的日誌成員是當前日誌組的成員,則需要將其變為非當前日誌組
alter system switch logfile;
3.刪除損壞的日誌群組成員
alter database drop logfile member '/u01/app/oracle/oradata/xcldb/REDO1_2.LOG';
4.增加日誌成員
alter database add logfile member '/u01/app/oracle/oradata/xcldb/REDO1_3.LOG' to group 組號;
二.非活動紀錄組損壞
1. open狀態下,非活動的日誌群組成員全部損壞
直接清除掉損壞的日誌組,使LGWR進程可以繼續。
alter database clear unarchived logfile group 組號;
清除過後,Oracle會重建立日誌組的所有成員。
要注意的是,因為之前損壞的日誌群組成員沒有被歸檔,所以最好重新做好備份。
2. close狀態下,非活動(INVALID)的日誌群組成員全部損壞
可刪除原有日誌組,增加新日誌組
2.1. alter database add logfile group 新組號
('/u01/app/oracle/oradata/xcldb/redo4_1.log',
'/u01/app/oracle/oradata/xcldb/redo4_2.log') size 10m reuse;
2.2. alter database drop logfile group 舊組號;
2.3. alter database open;
三.當前日誌組的所有成員都損壞
3.1. open狀態下,當前活動的日誌群組成員全部損壞
必須使用資料檔案備份,歸檔日誌執行基於取消的不完全恢複
1. SQL>startup mount
2. 如果有資料檔案備份,將冷備份的資料檔案還原回去
3. 執行不完全恢複
SQL>recover database until cancel
SQL>cancel
4.resetlogs方式open資料庫
SQL>alter database open resetlogs;
但上面的情況下,很少會有合適的冷備份,可按下面的方法做:
1. 設定兩個隱含參數:
SQL>ALTER SYSTEM SET _allow_resetlogs_corruption=TRUE SCOPE=SPFILE;
SQL>ALTER SYSTEM SET _allow_error_simulation=TRUE SCOPE=SPFILE;
_allow_resetlogs_corruption 跳過檔案頭的一致性檢查,強制啟動資料庫
_allow_error_simulation 增進scn
如果使用了隱含參數仍不能開啟的話,就只能再採取其它方法做恢複了。
2.使用修改過後的pfile來啟動資料庫
SQL>shutdown immediate
SQL>startup
如果有開閃回區,關掉閃回
SQL>alter database flashback off;
3. open資料庫
SQL>alter database open resetlogs;
4. 此時資料庫的當前日誌仍在被損壞的日誌組上
強制切換日誌組
SQL>alter system switch logfile;
重新查詢日誌狀態,直到日誌組轉到其它日誌組上
SQL> select a.group#,a.status,b.member from v$log a,v$logfile b where a.group#=b.group#;
5. 將非當前的已損壞的那個日誌組給刪了
SQL> alter database drop logfile group 損壞了的組號;
SQL> alter system switch logfile;
SQL> alter database add logfile group 新組號
('/u01/app/oracle/oradata/xcldb/redo4_1.log',
'/u01/app/oracle/oradata/xcldb/redo4_2.log') size 10m reuse;
SQL> alter system switch logfile;
重新查詢確認下日誌狀態
SQL> select a.group#,a.status,b.member from v$log a,v$logfile b where a.group#=b.group#;
6. 經過上面的步驟,資料庫應當已正常了,此時只要把隱含參數拿掉重啟就正式結束恢複了。
SQL>ALTER SYSTEM SET _allow_resetlogs_corruption=FALSE SCOPE=SPFILE;
SQL>ALTER SYSTEM SET _allow_error_simulation=FALSE SCOPE=SPFILE;
SQL>shutdown immediate
SQL>startup
3.2. close狀態下,當前活動的日誌群組成員全部損壞
因為是關閉狀態,資料檔案,控制檔案等都處於完全一致的狀態
SQL>recover database until cancel
SQL>alter database open resetlogs;
resetlogs 選項開啟資料庫後,會重建所有日誌成員,並且過去
的備份不能直接使用,所以需重新備份所有資料檔案和控制檔案。
MAIL: xcl_168@aliyun.com
BLOG: http://blog.csdn.net/xcl168