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/