Redo Log之一:理解Oracle redo log
1. 什麼是Redo log
Redo log包含所有的資料庫變化歷史,資料庫的所有操作變化,均按照寫入重做日誌緩衝區先於資料塊緩衝區、寫入重做日誌檔案先於寫入資料檔案;當發生提交動作時,將重做日誌緩衝區變化刷到重做日誌檔案。重做日誌檔案一般用於資料庫恢復(例項恢復和介質恢復)、Log Miner、Change Data Capture、流複製、GoldenGate複製等;Redo log檔案包含所有的DML變化(INSERT\UPDATE\DELETE\SELECT FOR UPDATE)、包含所有DDL語句造成的資料字典物件的更改及遞迴語句的更改,不包括DML語句。version 9i以上版本還會包括DDL語句;資料庫操作DML/DDL資料庫緩衝區與檔案的關係如下圖:
2. Redo log寫入方式
Oracle重做日誌採用迴圈寫入的方式,每一個Oracle例項至少擁有2組中左日誌組,每組重做日誌組可以有一個或多個日誌成員;Oracle重做日誌一般由Oracle自動切換,重做日誌檔案在當LGWR程式停止寫入並開始寫入下一個日誌組時發生切換,或在使用者收到發出ALTER SYSTEM SWITCH LOGFILE時發生切換。
Oracle提供了清空重做日誌檔案功能,可以在資料庫正常執行過程中,當出現日誌檔案損壞而無法進行歸檔時,可以清空損壞的日誌檔案(ALTER DATABASE CLEAR LOGFILE GROUP N;),使得資料庫繼續執行而無需停止資料庫;如果損壞的日誌檔案仍未進行歸檔,可以使用UNARCHIVED關鍵字進行清理日誌(ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP N;)。世紀運維中,還可以在某個例項禁止某個執行緒,並刪除該例項的所有redo log。
SQL>ALTER DATABASE DISABLE THREAD
SQL> ALTER DATABASE DROP LOGFILE GROUP 1;
SQL> ALTER DATABASE DROP LOGFILE GROUP2;
3. 日誌組v$log和日誌成員v$logfile
1) 日誌組v$log
SQL> desc v$log
Name Null? Type
------------------------ ------------ -----------------------
GROUP# NUMBER
THREAD# NUMBER
SEQUENCE# NUMBER
BYTES NUMBER
BLOCKSIZE NUMBER
MEMBERS NUMBER
ARCHIVED VARCHAR2(3)
STATUS VARCHAR2(16)
FIRST_CHANGE# NUMBER
FIRST_TIME DATE
NEXT_CHANGE# NUMBER
NEXT_TIME DATE
Group#:redo log組編號,redo log以group為單位,我們經常稱之為重做日誌組,一個例項裡至少要有兩個日誌組,每個組有一個或者多個成員;同一個group裡的成員的大小一致。
Thread#:在RAC環境裡才有意義,代表不同的例項的編號,RAC的每個例項有單獨redo log,該值與例項編號一致。
SEQUENCE#:redo log序列號;我們都知道重做日誌是迴圈寫的,該值記錄每個例項日誌組的順序;該序號在歸檔日誌、RMAN備份和備份集等管理都是使用該值進行區分的。
BYTES:重做日誌的大小,該值記錄的是日誌組的大小,而日誌組可以有多個成員,可見同一個日誌組的日誌成員大小一致。
MEMBERS:日誌組包含的日誌成員個數,每個日誌組的成員個數可以是一個或多個。
ARCHIVED:是否已經已經歸檔成功,如果未開啟歸檔則該值為NO。
STATUS:日誌組的當前狀態;Oracle日誌組有5種不同的狀態, CURRENT表示當前正在使用的日誌組;ACTIVE表示該日誌組仍是活躍的,對應的髒塊還沒有寫入到資料檔案上或者歸檔模式下未完成歸檔,即此時例項如果異常,會使用到該日誌組進行例項恢復;UNUSED表示還沒有使用的,一般只有新新增的未使用過的日誌組才會有這種狀態,建議新新增的日誌組時進行日誌切換,使得日誌組中沒有該狀態;INACTIVE與ACTIVE相對,也就是不包含髒資料。 CLEARING 、CLEARING_CURRENT這兩個狀態和clear logfile有關,CLEARING表示的是在執行了alter database clear logfile group N命令的日誌組狀態,所以這是一個執行過程中狀態,一旦命令執行結束,這個狀態也隨之執行結果而發生改變,如果是成功的話,狀態將變成UNUSED狀態,如果失敗或者是過程中中斷了使得clear不能完成,就會變更CLEARING_CURRENT,日誌切換異常或IO異常都會是狀態CLEARING_CURRENT。
FIRST_CHANGE#:最小的SCN號,用於例項恢復。
FIRST_TIME:最小SCN號的時間。
NEXT_CHANGE#:下一個SCN號,用於例項恢復。
NEXT_TIME:下一個SCN號的時間。
2) 日誌成員v$logfile
SQL> desc v$logfile;
Name Null? Type
----------------------------------------- -------- ----------------------------
GROUP# NUMBER
STATUS VARCHAR2(7)
TYPE VARCHAR2(7)
MEMBER VARCHAR2(513)
IS_RECOVERY_DEST_FILE VARCHAR2(3)
GROUP#:與前面v$log的GROUP#相同;
STATUS:INVALID代表檔案不可訪問;STALE表示檔案不完全,比如新增日誌成員等操作正在執行;DELETED表示該檔案已經不再使用;null表示檔案正在正常使用。
4. 檢查點與日誌切換
重做日誌一般涉及到LGWR、CKPT、DBWR、ARCHn四個後臺程式;LGWR後臺程式是將log buffer中的資料寫到日誌檔案的程式,是oracle相當重要的一個後臺程式,LGWR程式觸發的條件為以下4種情況之一:
a、 每3秒鐘;也就是該程式最多休眠3秒鐘,休眠時觸發rdbms ipc message事件; LGWR將buffer中的資料寫到日誌檔案時,觸發log file parallel write事件;
b、 在事務提交時(COMMIT),此時會觸發LGWR程式寫完後才返回提交成功,在等待LGWR程式寫的過程中將觸發log file sync事件;
c、 DBWn程式寫入資料檔案之前;
d、 Redo log Buffer三分之一滿時,這個數字是有一個隱含引數_log_io_size控制,該值的預設值是log buffer大小的1/3;該值的最大值為3MB,所以Redo log buffer多於1MB的變化記錄時也會觸發LGWR程式寫;
CKPT後臺程式是檢查點程式,以下幾種情況會觸發CKPT程式進行檢查點操作:
1)、例項關閉時;
2)、備份命令執行時;
3)、手動執行CheckPoint操作時;
4)、達到log_checkpoint_timout/log_checkpoint_internal/fatstart_mttr_target引數設定臨界值;
5)、資料檔案被online/offline時;
5. Redo Log損壞常見解決辦法
a、非當前日誌且已歸檔,使用命令將損壞日誌清空:
SQL> alter database clear logfile group n;
b、非當前日誌當尚未歸檔,則需要用
SQL>alter database clear unarchived logfile group n;
c、如果是當前日誌損壞,一般不能clear,則可能意味著丟失資料,有備份,可以採用備份進行不完全恢復;如果沒有備份,只能通過將資料庫啟動到mount狀態將損壞的日誌檔案刪除。
Created by Tony.Tang[TangYun]2015.02
--------------End-----------------------
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24930246/viewspace-1429161/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- standby redo log的理解
- oracle redo log operationOracle Redo
- (轉)老白的理解REDO LOG
- Oracle redo log重組Oracle Redo
- Oracle Dump Redo Log FileOracle
- 修改oracle redo log的大小Oracle Redo
- Oracle redo log 常見操作Oracle Redo
- Oracle redo解析之-1、oracle redo log結構計算Oracle Redo
- 深入理解MySQL系列之redo log、undo log和binlogMySql
- oracle redo internal 之 dump logfileOracle Redo
- oracle redo internal 之 dump logfileOracle
- oracle檔案管理之 redo logOracle
- 使用LOGMNR工具分析Oracle Redo Log和Archive Log教程Oracle RedoHive
- MySQL:Redo & binlogMySql
- mysql之 redo logMySql
- MySQL的Redo log 以及Bin logMySql
- Oracle調整redo log日誌大小Oracle
- Oracle Standby Redo Log實驗兩則Oracle
- 【操作】調整Online Redo Logs大小(Resizing Oracle Online Redo Logs)Oracle
- redo_log_switch_date
- redo log file 優化優化
- MySQL中的redo log和undo logMySql
- MySQL Undo Log和Redo Log介紹MySql
- Redo Log之二:遷移redo log到不同的儲存路徑
- MySQL Redo log頁內邏輯怎麼理解MySql
- ORACLE 11gr2 ASM redo log 增加OracleASM
- zt_Oracle Dump Redo Log File 說明Oracle
- redo的等待log file sync和log file parallel write和redo size設定Parallel
- 【Mysql】三大日誌 redo log、bin log、undo logMySql
- Archive Log模式下Redo Log、Check Point和Switch LogHive模式
- logminer工具對redo log或archive log的挖掘Hive
- MySQL 日誌系統 redo log、binlogMySql
- MySQL重做日誌(redo log)MySql
- MySQL redo log最佳化MySql
- redo log日誌挖掘(二)
- redo log日誌挖掘(一)
- 增大redo log檔案大小
- LGWR writes redo log (117)