重做日誌檔案損壞測試

studywell發表於2016-04-12

重做日誌檔案損壞測試
參考:http://blog.chinaunix.net/uid-17143914-id-2824664.html

資料庫的所有增、刪、改都會記錄入重做日誌。如果當前啟用的重做日誌檔案損壞,會導致資料庫異常關閉。非啟用的重做日誌最終也會因為日誌切換變為啟用的重做日誌,所以損壞的非啟用的重做日誌最終也會導致資料庫的異常終止。在ipas/mSwitch中每組重做日誌只有一個成員,所以在下面的分析中只考慮重做日誌組損壞的情況,而不考慮單個重做日誌成員損壞的情況。

一、確定損壞的重做日誌的位置及其狀態:
1. 如果資料庫處於可用狀態:
select * from v$logfile;
select * from v$log;

2. 如果資料庫處於已經異常終止:
startup mount;
select * from v$logfile;
select * from v$log;

其中,logfile的狀態為INVALID表示這組日誌檔案出現已經損壞;log狀態為Inactive:表示重做日誌檔案處於非啟用狀態;Active:表示重做日誌檔案處於啟用狀態;Current:表示是重做日誌為當前正在使用的日誌檔案。

二、損壞的日誌檔案處於非啟用狀態:
1. 刪除相應的日誌組:
alter database drop logfile group 4;

2. 重新建立相應的日誌組:
alter database add logfile group 4 ('/oracle/app/oracle/oradata/orcl/redo41.log','/oracle/app/oracle/oradata/orcl/redo42.log') size 50m;
alter database add logfile member '/oracle/app/oracle/oradata/orcl/redo43.log' to group 4;


三、損壞的日誌檔案處於啟用狀態且為非當前日誌:
1. 清除相應的日誌組:
alter database clear unarchived logfile group group_number;
操作後,該日誌組狀態為“UNUSED”;

如rm日誌組中一個檔案,切換日誌後臺日誌會報錯,將資料庫重啟到mount狀態,clear 後,將自動建立剛才刪除的日誌檔案;

如不做處理,重新啟動資料庫,會報如下錯誤,直接退出啟動程式;
Tue Apr 12 18:06:00 2016
ARC1 started with pid=21, OS id=18715
USER (ospid: 18711): terminating the instance due to error 313
System state dump requested by (instance=1, osid=18711), summary=[abnormal instance termination].
System State dumped to trace file /oracle/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_diag_18681_20160412180600.trc
Dumping diagnostic data in directory=[cdmp_20160412180600], requested by (instance=1, osid=18711), summary=[abnormal instance termination].
Instance terminated by USER, pid = 18711



四、損壞的日誌檔案為當前活動日誌檔案:
用命令清除相應的日誌組:
alter database clear unarchived logfile group group_number;
如果清除失敗,則只能做基於時間點的不完全恢復。
開啟資料庫並且用適當的方法進行資料庫全備份:
alter database open;


五、歸檔模式,資料庫open狀態、當前正在使用的日誌檔案損壞,並且異常關閉資料庫。
建立兩個測試表後,
刪除當前的redo log;
shutdown abort
startup
報錯:

解決辦法:
這時候我們有兩種辦法,一種是使用備份進行恢復,另一種是使用隱含引數。介紹第二種:
該引數是在資料庫不一致的情況下,設定後允許資料庫啟動,然後重置日誌檔案。
alter system set "_allow_resetlogs_corruption"=true scope=spfile;
恢復預設值:alter system reset "_allow_resetlogs_corruption" scope=spfile;

sys@ORCL> shutdown immediate
ORACLE instance shut down.
sys@ORCL> startup
報錯;
sys@ORCL> select status from v$instance;
STATUS
------------
MOUNTED

sys@ORCL> select * from v$log;

alter database open resetlogs;

ORA-01139: RESETLOGS option only valid after an incomplete database recovery

需要這樣:
sys@ORCL> recover database until cancel;
ORA-00279: change 2922743 generated at 04/12/2016 17:39:18 needed for thread 1
ORA-00289: suggestion : /oracle/app/oracle/fast_recovery_area/ORCL/archivelog/2016_04_12/o1_mf_1_9_%u_.arc
ORA-00280: change 2922743 for thread 1 is in sequence #9

Specify log: {<RET>=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: '/oracle/app/oracle/oradata/orcl/system01.dbf'

ORA-01112: media recovery not started

alter database open resetlogs;

丟失剛才建立當前redolog的測試表;
resetlog後重建redo日誌;


重建例項然後使用expdp和impdp,將資料匯出在匯入資料庫
SQL> create directory expdp as '/opt/app/oracle/oradata';

然後匯出資料重建資料庫,再匯入資料。
總結:對於當前正在使用的日誌的損壞,一般透過備份來修復,如果不行只能採用第二種設定隱含引數_allow_resetlogs_corruption來恢復。

六、總結,對於不是當前使用的歸檔日誌損壞,歸檔模式需要使用alter database clear unarchived 命令清空日誌組即可。
對於非歸檔模式需要使用alter system clear日誌檔案組即可。


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

相關文章