當資料庫做了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...