mysql教程欄目帶大家了解InnoDB的Checkpoint技術。
一句話概括,Checkpoint技術就是將緩存池中臟頁在某個時間點刷回到磁盤的操作
遇到的問題 ?
都知道緩沖池的出現就是為了解決CPU與磁盤速度之間的鴻溝,免得我們在讀寫數據庫時還需要進行磁盤IO操作。有了緩沖池后,所有的頁操作首先都是在緩沖池內完成的。
如一個DML語句,進行數據update或delete 操作時,此時改變了緩沖池頁中的記錄,此時因為緩沖池頁的數據比磁盤的新,此時的頁就叫做臟頁。
不管怎樣,總會后的內存頁數據需要刷回到磁盤里,這里就涉及幾個問題:
- 若每次一個頁發生變化,就將新頁的版本刷新到磁盤,那么這個開銷是非常大的
- 若熱點數據集中在某幾個頁中,那么數據庫的性能將變得非常差
- 如果在從緩沖池將頁的新版本刷新到磁盤時發生了宕機,那么數據就不能恢復了
Write Ahead Log(預寫式日志)
WAL策略解決了刷新頁數據到磁盤時發生宕機而導致數據丟失的問題,它是關系數據庫系統中用于提供原子性和持久性(ACID 屬性中的兩個)的一系列技術。
WAL策略核心點就是
redo log,每當有事務提交時,先寫入 redo log(重做日志),在修改緩沖池數據頁,這樣當發生掉電之類的情況時系統可以在重啟后繼續操作
WAL策略機制原理
InnoDB為了保證數據不丟失,維護了redo log。在緩沖池的數據頁修改之前,需要先將修改的內容記錄到redo log中,并保證redo log早于對應的數據頁落盤,這就是WAL策略。
當故障發生而導致內存數據丟失后,InnoDB會在重啟時,通過重放redo log,將緩沖池數據頁恢復到崩潰前的狀態。
Checkpoint
按理說有了WAL策略,我們就可以高枕無憂了。但其問題點又出現在redo log上面:
- redo log 不可能是無限大的,不能沒完沒了的存儲我們的數據等待一起刷新到磁盤
- 在數據庫怠機恢復時,如果redo log 太大的話恢復的代價也是非常大的
所以為了解決臟頁的刷新性能,臟頁應該在什么時間、什么情況下進行臟頁的刷新就用到了Checkpoint技術。
Checkpoint 的目的
1、縮短數據庫的恢復時間
當數據庫怠機恢復時,不需要重做所有的日志信息。因為Checkpoint前的數據頁已經刷回到磁盤了。只需要Checkpoint后的redo log進行恢復就好了。
2、緩沖池不夠用時,將臟頁刷新到磁盤
當緩沖池空間不足時,根據LRU算法會溢出最近最少使用的頁,若此頁為臟頁,那么需要強制執行Checkpoint,將臟頁也就是頁的新版本刷回磁盤。
3、redo log不可用時,刷新臟頁
如圖redo log 的不可用是因為當前數據庫對其設計都是循環使用的,所以其空間并不是無限大。
當redo log被寫滿, 因為此時系統不能接受更新, 所有更新語句都會被堵住。
此時必須強制產生Checkpoint需要將 write pos 向前推進,推進范圍內的臟頁都需要刷新到磁盤
Checkpoint 的種類
Checkpoint發生的時間、條件及臟頁的選擇等都非常復雜。
Checkpoint 每次刷新多少臟頁到磁盤?
Checkpoint每次從哪里取臟頁?
Checkpoint 什么時間被觸發?
面對上面的問題,InnoDB存儲引擎內部為我們提供了兩種Checkpoint:
-
Sharp Checkpoint
發生在數據庫關閉時將所有的臟頁都刷新回磁盤,這是默認的工作方式,參數innodb_fast_shutdown=1
-
Fuzzy Checkpoint
InnoDB存儲引擎內部使用這種模式,只刷新一部分臟頁,而不是刷新所有的臟頁回磁盤
FuzzyCheckpoint發生的情況
-
Master Thread Checkpoint
差不多以每秒或每十秒的速度從緩沖池的臟頁列表中刷新一定比例的頁回磁盤。
-
FLUSH_LRU_LIST Checkpoint
因為LRU列表要保證一定數量的空閑頁可被使用,所以如果不夠會從尾部移除頁,如果移除的頁有臟頁,就會進行此Checkpoint。
5.6版本后,這個Checkpoint放在了一個單獨的Page Cleaner線程中進行,并且用戶可以通過參數innodb_lru_scan_depth控制LRU列表中可用頁的數量,該值默認為1024
-
Async/Sync Flush Checkpoint
指的是redo log文件不可用的情況,這時需要強制將一些頁刷新回磁盤,而此時臟頁是從臟頁列表中選取的
5.6版本后不會阻塞用戶查詢
-
Dirty Page too much Checkpoint 即臟頁的數量太多,導致InnoDB存儲引擎強制進行Checkpoint。
其目的總的來說還是為了保證緩沖池中有足夠可用的頁。
其可由參數innodb_max_dirty_pages_pct控制,比如該值為75,表示當緩沖池中臟頁占據75%時,強制進行CheckPoint
總結
-
因為CPU和磁盤間的鴻溝的問題,從而出現緩沖池數據頁來加快數據庫DML操作
-
因為緩沖池數據頁與磁盤數據一致性的問題,從而出現WAL策略(核心就是redo log)
-
因為緩沖池臟頁的刷新性能問題,從而出現Checkpoint技術
InnoDB 為了提高執行效率,并不會每次DML操作都和磁盤交互進行持久化。而是通過Write Ahead Log 先策略寫入redo log保證事物的持久化。
對于事物中修改的緩沖池臟頁,會通過異步的方式刷盤,而內存空閑頁和redo log的可用是通過Checkpoint技術來保證的。
更多相關免費學習推薦:mysql教程(視頻)