1.1. Log & Checkpoint
Innodb的交易記錄是指Redo log,簡稱Log,儲存在記錄檔ib_logfile*裡面。Innodb還有另外一個日誌Undo log,但Undo log是存放在共用資料表空間裡面的(ibdata*檔案)。
由於Log和Checkpoint緊密相關,因此將這兩部分合在一起分析。
名詞解釋:LSN,記錄序號,Innodb的記錄序號是一個64位的整型。
1.1.1. 寫入機制1.1.1.1. Log寫入
LSN實際上對應記錄檔的位移量,新的LSN=舊的LSN + 寫入的日誌大小。舉例如下:
LSN=1G,記錄檔大小總共為600M,本次寫入512位元組,則實際寫入操作為:
l 求出位移量:由於LSN數值遠大於記錄檔大小,因此通過取餘方式,得到位移量為400M;
l 寫入日誌:找到位移400M的位置,寫入512位元組日誌內容,下一個事務的LSN就是1000000512;
1.1.1.2. Checkpoint寫入
Innodb實現了Fuzzy Checkpoint的機制,每次取到最老的髒頁,然後確保此髒頁對應的LSN之前的LSN都已經寫入記錄檔,再將此髒頁的LSN作為Checkpoint點記錄到記錄檔,意思就是“此LSN之前的LSN對應的日誌和資料都已經寫入磁碟檔案”。恢複資料檔案的時候,Innodb掃描記錄檔,當發現LSN小於Checkpoint對應的LSN,就認為恢複已經完成。
Checkpoint寫入的位置在記錄檔開頭固定的位移量處,即每次寫Checkpoint都覆蓋之前的Checkpoint資訊。
1.1.2. 管理機制
由於Checkpoint和日誌緊密相關,將日誌和Checkpoint一起說明,詳細的實現機制如下:
如所示,Innodb的一條交易記錄共經曆4個階段:
l 建立階段:事務建立一條日誌;
l 日誌刷盤:日誌寫入到磁碟上的記錄檔;
l 資料刷盤:日誌對應的髒頁資料寫入到磁碟上的資料檔案;
l 寫CKP:日誌被當作Checkpoint寫入記錄檔;
對應這4個階段,系統記錄了4個日誌相關的資訊,www.bkjia.com用於其它各種處理使用:
l Log sequence number(LSN1):當前系統LSN最大值,新的交易記錄LSN將在此基礎上產生(LSN1+新日誌的大小);
l Log flushed up to(LSN2):當前已經寫入記錄檔的LSN;
l Oldest modified data log(LSN3):當前最舊的髒頁資料對應的LSN,寫Checkpoint的時候直接將此LSN寫入到記錄檔;
l Last checkpoint at(LSN4):當前已經寫入Checkpoint的LSN;
對於系統來說,以上4個LSN是遞減的,即: LSN1>=LSN2>=LSN3>=LSN4.
具體的範例如下(使用show innodb status /G命令查看,Oldest modified data log沒有顯示):