CheckPoint是MySQL的WAL和Redolog的一個優化技術。
一、Checkpoint機制
CheckPoint做了什麼事情?將快取池中的髒頁刷回磁碟。
checkpoint定期將db buffer的內容重新整理到data file,當遇到記憶體不足、db buffer已滿等情況時,需要將db buffer中的內容/部分內容(特別是髒資料)轉儲到data file中。
在轉儲時,會記錄checkpoint發生的位置,在故障回覆時候,只需要redo/undo最近的一次checkpoint之後的操作。
二、CheckPoint作用
1、縮短資料庫的恢復時間
當資料庫宕機時,資料庫不需要重做所有紀錄檔,因為CheckPoint之前的頁都已經重新整理回磁碟。只需對CheckPoint後的重做紀錄檔進行恢復,從而縮短恢復時間
2、緩衝池不夠用時,將髒頁重新整理到磁碟
當快取池不夠用時,LRU演演算法會溢位最近最少使用的頁,若此頁為髒頁,會強制執行CheckPoint,將該髒頁刷回磁碟
3、Redo紀錄檔不可用時,重新整理髒頁
不可用是因為對重做紀錄檔的設計是迴圈使用的。重做紀錄檔可以被重用的部分,是指當資料庫進行恢復操作時不需要的部分。若此時這部分重做紀錄檔還有用,將強制執行CheckPoint,將緩衝池的頁至少重新整理到當前重做紀錄檔的位置
三、CheckPoint種類
InnoDB儲存引擎內部,有兩種Checkpoint,分別為:Sharp Checkpoint、Fuzzy Checkpoint
1、Sharp CheckPoint
發生在資料庫關閉時,會將所有的髒頁刷回磁碟,這是預設的工作方式,即引數innodb_fast_shutdown=1。
但是若資料庫在執行時也使用Sharp Checkpoint,那麼資料庫的可用性就會受到很大的影響。故在InnoDB儲存引擎內部使用Fuzzy Checkpoint進行頁的重新整理,即只重新整理一部分髒頁,而不是重新整理所有的髒頁回磁碟。
2、Fuzzy CheckPoint
為提高效能,資料庫執行時使用Fuzzy CheckPoint進行頁的重新整理,即只重新整理一部分髒頁。
Fuzzy Checkpoint(模糊檢查點):
- Master Thread Checkpoint;
- FLUSH_LRU_LIST Checkpoint;
- Async/Sync Flush Checkpoint;
- Dirty Page too much Checkpoint
在Innodb事務紀錄檔中,採用了Fuzzy Checkpoint,Innodb每次取最老的modified page(last checkpoint)對應的LSN,再將此髒頁的LSN作為Checkpoint點記錄到紀錄檔檔案,意思就是此LSN之前的LSN對應的紀錄檔和資料都已經flush到redo log。
三、LSN標記
InnoDB引擎通過LSN(Log Sequence Number)來標記版本,LSN是紀錄檔空間中每條紀錄檔的結束點,用位元組偏移量來表示。
1、LSN(Log Sequence Number)
- LSN是用來標記版本的
- LSN是8位元組的數位
- 每個page有LSN,redo log也有LSN,Checkpoint也有LSN
2、Log Sequence Number
當mysql crash的時候,Innodb掃描redo log,從last checkpoint開始apply redo log到buffer pool,直到last checkpoint對應的LSN等於Log flushed up to對應的LSN,則恢復完成。
如上圖所示,Innodb的一條事務紀錄檔共經歷4個階段:
- 建立階段:事務建立一條紀錄檔
- 紀錄檔刷盤:紀錄檔寫入到磁碟上的紀錄檔檔案
- 資料刷盤:紀錄檔對應的髒頁資料寫入到磁碟上的資料檔案
- 寫CKP:紀錄檔被當作Checkpoint寫入紀錄檔檔案;
對應這4個階段,系統記錄了4個紀錄檔相關的資訊,用於其它各種處理使用:
- Log sequence number(LSN1):當前系統LSN最大值,新的事務紀錄檔LSN將在此基礎上生成(LSN1+新紀錄檔的大小);
- Log flushed up to(LSN2):當前已經寫入紀錄檔檔案的LSN;
- Oldest modified data log(LSN3):當前最舊的髒頁資料對應的LSN,寫Checkpoint的時候直接將此LSN寫入到紀錄檔檔案;
- Last checkpoint at(LSN4):當前已經寫入Checkpoint的LSN;
對於系統來說,以上4個LSN是遞減的,即: LSN1>=LSN2>=LSN3>=LSN4。
參考資料:
https://lefred.be/content/a-graph-a-day-keeps-the-doctor-away-mysql-checkpoint-age/