MySql的checkpoint

前言

對數據庫中數據進行增刪改時,都是先在buffer pool中完成,爲了提升事務的操做效率,buffer pool中數據並不會當即寫入磁盤,因此可能出現內存中數據和磁盤數據不一致的狀況。mysql

若是buffer pool發生故障致使數據沒法持久化,形成磁盤和buffer pool數據不一致。算法

爲了防止內存中修改的數據還沒有寫入磁盤,發生故障而不能持久化的問題。能夠經過redo log先行的方式進行保障。 redo log能夠在故障重啓以後作「重作」,保障了事務的持久化特性,可是redo log空間不可能無限擴大,對於內存中已修改未提交到磁盤的數據,也就是「髒頁」,也須要寫入磁盤。sql

對於內存中「髒頁」的處理就是checkpoint的工做,在必定狀況下將髒頁放入磁盤。數據庫

checkpoint主要解決如下問題:異步

  1. 縮短數據庫恢復的時間。
  2. 緩衝池不夠用時,將髒頁刷入磁盤。
  3. 重作日誌不可用時,刷新髒頁。

故障恢復時只須要對checkpoint後的重作日誌進行恢復,縮短了恢復時間。 緩衝區不夠用時,採用lru算法,使部分髒頁刷入磁盤。async

checkpoint分類

checkpoint分爲兩種:性能

  • sharp checkpoint:在關閉數據庫時,將buffer pool中的髒頁所有刷入磁盤。
  • fuzzy checkpoint:在數據庫正常運行時,找到不一樣時機將髒頁寫入磁盤,一部分一部分的刷入磁盤,不會由於一次性刷入磁盤形成性能問題。
  1. master thread checkpoint

master thread中,每秒或每10秒一次的頻率將髒頁從內存刷入磁盤,這個過程是異步的。線程

  1. flush_lru_list checkpoint

flush_lru_list checkpoint是在單獨的page cleaner線程中執行的。lru列表是buffer pool的lru列表,lru空閒列表中保留必定數量的空閒頁面,來保證buffer pool中有足夠的空間應對新的數據庫請求。日誌

在空閒列表不足時,發生flush_lru_list checkpoint,空閒數量閾值是能夠配置的。事務

  1. async/sync flush checkpoint

async/sync flush checkpoint是在單獨的page cleaner線程中執行的。在重作日誌不可用時,將buffer pool中的一部分髒數據刷新到磁盤。 經過配置閾值,在redo log空間不足指定閾值時進行刷新。

  1. dirty page too much checkpoint dirty page too much checkpoint是在master thread線程中每秒一次的頻率實現的。 dirty page too much 意味着buffer pool中髒頁過多,執行checkpoint髒頁刷入磁盤,保證buffer pool中有足夠的可用頁面。

總結

mysql爲提升事務執行效率,並不會每次都和磁盤交互進行持久化,經過日誌先行策略保證事務的持久化。 對於事務修改過程當中的髒頁,經過異步方式刷盤,經過checkpoint達到內存和redo log可用空間的目的。

相關文章
相關標籤/搜索