理解MySQL的Checkpoint機制

MySQL的Checkpoint機制介紹

  Mysql對於持久性的實現是基於Write ahead log來實現的,在其管理的文件系統中有一個文件叫做重做日誌(redo log),其作用是在服務器宕機重啓後通過它來實現數據恢復的功能。重做日誌中記錄的是事務對數據庫所做的邏輯操作。這句話怎麼理解呢?舉個例子:
  在事務A中修改了studenet表的一條記錄:update student set sname = '張三' where sno = '1001';那麼對於這個操作redo log記錄的就是:修改sno='1001’的那條記錄的sname=‘張三’,即對數據頁的哪一行做什麼操作並不是直接記錄sql操作後的數據值。另外需要理解的是,redo log採用了循環寫機制,它被保存在共享表空間的ib_logfile0和ib_logfile1中,循環寫的意思就是ib_logfile0寫滿了就寫ib_logfile1,ib_logfile1滿了就重寫ib_logfile0。
  那麼它和Checkpoint機制有什麼關係呢?所謂的Checkpoint機制其實就是什麼時間將InnoDB緩存中的髒頁刷新到磁盤中去,其隱含的語義是:保持redo log中的日誌信息與磁盤數據一致。 即使服務器宕機了,也不會造成數據丟失。
  首先來理解一下Checkpoint機制需要解決的問題。做個假設,當InnoDB緩衝區無限大以及redo log可以無限追加寫的時候,我們還需要將緩衝區的髒頁刷新到磁盤去嗎?實際上是不需要的,因爲數據讀寫只需要經過緩衝區即可,而且即使服務器宕機也可以通過redo log進行恢復。第一個條件現實條件很難滿足(太貴了),第二個條件其實還可以滿足,因爲硬盤比較便宜,但是這樣子又帶來了一個新的問題,就是當數據庫運行了很長一段時間,redo log已經很大了,此時服務器宕機使用redo log恢復就會需要很長的時間,因此redo log被設計爲了循環寫。
  好了,有了這個背景,我們就可以知道Checkpoint機制需要解決什麼問題了。第一點,解決緩衝區有限的問題,當緩衝區中的髒頁太多(75%)的時候就觸發Checkpoint,將其中的髒頁刷新到磁盤中去。第二,redo log不能無限追加寫,如下圖:InnoDB不斷在redo log buffer中記錄redo log的數據信息時,其Master Thread也在不斷的將redo log buffer的內容刷新到磁盤,但是由於redo log是循環寫,因此到一定時間就會出現redo log之前寫的內容需要被覆蓋,當發生redo log需要被覆蓋時,觸發Checkpoint機制,即下圖的write追上了checkpoint。相信還是很好理解的,另外,這種機制還解決了數據庫恢復慢的問題,因爲現在redo log上記錄信息對應的髒頁有一部分已經被刷新到磁盤上去了,因此其恢復時間比較快。
在這裏插入圖片描述

InnoDB中的Checkpoint機制詳細介紹

  在其內部,有兩種Checkpoint機制。

  • Sharp Checkpoint
  • Fuzzy Checkpoint
Sharp Checkpoint

  它會在數據庫關閉時將所有的髒頁刷新到磁盤中去。

Fuzzy Checkpoint

  它是利用InnoDB的Page Clear Thread在一定時機刷新一部分髒頁到磁盤去。這是InnoDB默認採用的機制。

總結一下,Checkpoint解決的三個問題:

  1. 解決了數據庫恢復慢的問題(redo log循環寫)
  2. 緩衝區不夠用的問題(髒頁比例達到75%強制刷新到磁盤)
  3. 重做日誌不可用問題(在redo log的write追上checkpoint時刷新髒頁到磁盤)

參考資料:《MySQL技術內幕:InnoDB存儲引擎》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章