MySQL筆記之Checkpoint機制

2023-04-09 06:01:01

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/