InnoDB體系架構(三)Checkpoint技術
Checkpoint技術
前篇 InnoDB體系架構(二)內存 從緩沖池、緩沖池的管理、重做日誌緩沖、額外內存緩沖這四個點介紹了InnoDB存儲引擎的內存結構,而在將緩沖池的數據刷新到磁盤的過程中使用到了Checkpoint技術,這篇文章我們著重講解一下Checkpoint在內存中到應用。
一、Checkpoint使用背景
由於日常DML語句,如:Update / Delete操作首先操作了緩沖池的數據,並沒有立即寫入到磁盤,這有可能會導致內存中數據與磁盤中的數據產生不一致的情況。而與磁盤數據不一致的緩沖池的頁就是我們常說的臟頁。而checkpoint的工作,就是將內存中的臟頁,在一定條件下將臟頁刷新到磁盤。
如果在從緩沖池將頁數據刷新到磁盤的過程中發生宕機,那麽數據就無法恢復了;為了避免這種情況的發生,采用了Write Ahead Log策略,即當事務提交時,先寫重做日誌,再修改頁,這樣發生宕機也可以通過重做日誌進行恢復。
二、Checkpoint的目的
1. 如果重做日誌太大,那麽數據庫啟動的時候恢復時間過長;
2. 緩沖池不夠用時,需要先將臟頁數據刷新到磁盤中;
3. 重做日誌不可用時,刷新臟頁到磁盤;
三、Checkpoint的運作機制
在了解運作機制之前,先來思考一下這幾個問題:Checkpoint發生的時間? 發生的條件? 臟頁(對象)的選擇?
在InnoDB存儲引擎內部,Checkpoint分為了兩種:
(一) Sharp Checkpoint
Sharp Checkpoint 發生在數據庫關閉時,將所有的臟頁都刷新回磁盤,這是默認的工作方式,參數:innodb_fast_shutdown=1。
(二)Fuzzy Checkpoint
在InnoDB存儲引擎運行時,使用Fuzzy Checkpoint進行頁刷新,只刷新一部分臟頁。在以下四種情況下會出發Fuzzy Checkpoint:
1. Master Thread Checkpoint
對於Master Thread,以每秒或者每N秒的速度將緩沖池的臟頁列表刷新一定比例的頁回磁盤,這個過程是異步的,用戶查詢線程不會阻塞。
2. FLUSH_LRU_LIST Checkpoint
為了保證LRU列表中有100個左右的空閑頁可使用,在InnoDB 1.1.x版本之前,用戶查詢線程會檢查LRU列表是否有足夠的空間操作。如果沒有,根據LRU算法,溢出LRU列表尾端的頁,如果這些頁有臟頁,需要進行checkpoint。因此叫:FLUSH_LRU_LIST Checkpoint。
3. Async/Sync Flush Checkpoint
Async/Sync Flush checkpoint 發生在重做日誌不可用的時候(滿了),將buffer pool中的一部分臟頁刷新到磁盤中,在臟頁寫入磁盤之後,事物對應的重做日誌也就可以釋放了。關於redo_log文件的的大小,可以通過innodb_log_file_size來配置。
4. Dirty Page too much Checkpoint
即臟頁太多,強制checkpoint,保證緩沖池有足夠可用的頁。 參數設置:innodb_max_dirty_pages_pct = 75 表示:當緩沖池中臟頁的數量占75%時,強制checkpoint。1.0.x之後默認75
InnoDB體系架構(三)Checkpoint技術