對數據庫中數據進行增刪改時,都是先在buffer pool中完成,爲了提升事務的操做效率,buffer pool中數據並不會當即寫入磁盤,因此可能出現內存中數據和磁盤數據不一致的狀況。mysql
若是buffer pool發生故障致使數據沒法持久化,形成磁盤和buffer pool數據不一致。算法
爲了防止內存中修改的數據還沒有寫入磁盤,發生故障而不能持久化的問題。能夠經過redo log先行的方式進行保障。 redo log能夠在故障重啓以後作「重作」,保障了事務的持久化特性,可是redo log空間不可能無限擴大,對於內存中已修改未提交到磁盤的數據,也就是「髒頁」,也須要寫入磁盤。sql
對於內存中「髒頁」的處理就是checkpoint的工做,在必定狀況下將髒頁放入磁盤。數據庫
checkpoint主要解決如下問題:異步
故障恢復時只須要對checkpoint後的重作日誌進行恢復,縮短了恢復時間。 緩衝區不夠用時,採用lru算法,使部分髒頁刷入磁盤。async
checkpoint分爲兩種:性能
master thread中,每秒或每10秒一次的頻率將髒頁從內存刷入磁盤,這個過程是異步的。線程
flush_lru_list checkpoint是在單獨的page cleaner線程中執行的。lru列表是buffer pool的lru列表,lru空閒列表中保留必定數量的空閒頁面,來保證buffer pool中有足夠的空間應對新的數據庫請求。日誌
在空閒列表不足時,發生flush_lru_list checkpoint,空閒數量閾值是能夠配置的。事務
async/sync flush checkpoint是在單獨的page cleaner線程中執行的。在重作日誌不可用時,將buffer pool中的一部分髒數據刷新到磁盤。 經過配置閾值,在redo log空間不足指定閾值時進行刷新。
mysql爲提升事務執行效率,並不會每次都和磁盤交互進行持久化,經過日誌先行策略保證事務的持久化。 對於事務修改過程當中的髒頁,經過異步方式刷盤,經過checkpoint達到內存和redo log可用空間的目的。