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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- undo log和redo log
- Oracle redo解析之-1、oracle redo log結構計算Oracle Redo
- mysql之 redo logMySql
- MySQL的Redo log 以及Bin logMySql
- 深入理解MySQL系列之redo log、undo log和binlogMySql
- MySQL Undo Log和Redo Log介紹MySql
- MySQL中的redo log和undo logMySql
- 【Mysql】三大日誌 redo log、bin log、undo logMySql
- Oracle RAC+DG 調整redo/standby log fileOracle
- MySQL Redo log頁內邏輯怎麼理解MySql
- redo log file 最佳化
- MySQL redo log最佳化MySql
- MySQL重做日誌(redo log)MySql
- InnoDB文件筆記(二)—— Redo Log筆記
- How to Dump Redo Log File Information --metalinkORM
- MySQL中的redo log和checkpointMySql
- mysql日誌:redo log、binlog、undo log 區別與作用MySql
- MySQL中redo log、undo log、binlog關係以及區別MySql
- 硬核乾貨!一文掌握 binlog 、redo log、undo log
- MySQL 日誌系統 redo log、binlogMySql
- MySQL學習之change buffer 和 redo logMySql
- MySQL如何計算統計redo log大小MySql
- 基於Redo Log和Undo Log的MySQL崩潰恢復流程MySql
- redo log 和 binlog 的一些總結
- 【REDO】Oracle redo advice-sqlOracle RedoSQL
- 【REDO】Oracle redo undo 學習Oracle Redo
- 必須瞭解的mysql三大日誌-binlog、redo log和undo logMySql
- 【REDO】Oracle redo內部結構Oracle Redo
- 3000幀動畫圖解MySQL為什麼需要binlog、redo log和undo log動畫圖解MySql
- Oracle-真實環境的丟失current redo log file的故障恢復Oracle
- Oracle Redo and UndoOracle Redo
- 更改online redo log file 提示 ORA-01511 ORA-01141
- MySQL中Redo Log相關的重要引數總結MySql
- duplicate遇到RMAN-05535: warning: All redo log files were not defined
- 2 萬字 + 30 張圖 | 細聊 MySQL undo log、redo log、binlog 有什麼用?MySql
- 12C開始oracle實現了SCALABLE LGWR多程式並行寫redo logOracle並行
- MYSQL 是如何保證binlog 和redo log同時提交的?MySql
- 一生摯友redo log、binlog《死磕MySQL系列 二》MySql
- MySQL更新資料時,日誌(redo log、binlog)執行流程MySql