06 重做日誌損壞的恢復

2021-12-30 10:31:27 字數 3350 閱讀 9612

當資料庫做了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: [email protected]

blog:

聯機重做日誌

兩點 1.利用重做日誌檔案,在資料庫發生故障時,可以重新處理事務。維護一致性 2.記錄資料所做的所有更改,提供恢復機制,可以劃分成組,至少需要兩個組,每個組至少乙個成員。規劃原則 分散放開到不同的磁碟,日誌所在盤io要足夠,io讀寫要快。分散到不同的磁碟的好處,解決io的衝突,解決因故障,日誌不可用...

MySQL重做日誌

用來實現事物的永續性,即事務acid中的d。重做日誌有兩部分組成 當事務commit時,必須將事務的全部日誌寫入重做日誌檔案進行持久化,待完成後事務commit的操作才算完成,即日誌前寫規則。為確保每次日誌都寫入到重做日誌檔案,在每次寫入後都進行一次fsync操作。因為重做日誌檔案沒有使用o dir...

mysql重做日誌

mysql預設情況下會有兩個檔案 ib logfile0和ib logfile1,這兩個檔案就是重做日誌檔案,或者事務日誌。重做日誌的目的 萬一例項或者介質失敗,重做日誌檔案就能派上用場。每個innodb儲存引擎至少有乙個重做日誌檔案組,每個檔案組下至少有2個重做日誌檔案,如預設的ib logfil...