MySQL筆記之Checkpoint機制

邴越發表於2023-04-08

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/

相關文章