標籤:ar 使用 sp strong 檔案 資料 on 問題 log
checkpoint乾的事情:
將緩衝池中的髒頁重新整理回磁碟,不同之處在於每次從哪裡取多少髒頁重新整理到磁碟,以及什麼時候觸發checkpoint。
checkpoint解決的問題:
1.縮短資料庫的恢復(資料庫宕機時,不需要重做所有的日誌,因checkpoint之前的頁都已經重新整理回磁碟啦)
2.緩衝池不夠用時,將髒頁重新整理到磁碟(緩衝池不夠用時,根據LRU算會溢出最近最少使用的頁,若此頁為髒頁,需要強制執行checkpoint將髒也刷回磁碟)
3.重做日誌不可用時,重新整理髒頁(採用迴圈使用的,並不是無限增大。當重用時,此時的重做日誌還需要使用,就必須強制執行checkpoint將髒頁刷回磁碟)
checkpoint分類:
1.Sharp Checkpoint
發生在資料庫關閉時將所有的髒頁刷回磁碟,這是預設的。通過參數innodb_fast_shutdown=1來設定。
2.Fuzzy Checkpoint
在InnoDB儲存引擎內部使用Fuzzy Checkpoint進行頁的重新整理,即只重新整理一部分髒頁,而不是全部重新整理。大致分為以下幾種情況:
a.Master Thread Checkpoint
差不多以每秒或者每十秒從緩衝池的髒頁列表(Flush列表),這是非同步作業,InnoDB儲存引擎可以進行其他的操作部分不會發生堵塞。
b.FLUSH_LUR_LIST Checkpoint
InnoDB儲存引擎需要保證LRU列表中有差不多100個空閑頁可供使用。在InnoDB1.1.X版本之前,需要檢查LRU列表中是否有足夠的可用空間操作發生在使用者查詢線程中,顯然這會阻塞使用者的查詢操作。倘若沒有100個空閑頁,那麼InnoDB儲存引擎會將LRU列表尾端的頁移除,如果這些頁中有髒頁,那麼需要進行Checkpoint,而這些來自於LRU列表的被稱為FLUSH_LRU_LIST Checkpoint。但是在MySQL5.6版本後這個檢查被放在了一個單獨的Page Cleaner Thread中進行,通過參數innodb_lru_scan_depth來設定可用頁的數量。
c.Async/Sync Flush Checkpoint
在重做記錄檔停用情況下,需要將一些也重新整理回磁碟,而操作發生在Flush列表上。若將已經寫入到重做日誌的LSN記為redo_lsn,將已經重新整理回磁碟最新的LSN記為checkpoint_lsn,則可以定義:checkpoint_age = redo_lsn-checkpoint_lsn在定義一下的變數async_water_mark=75%*total_redo_log_file_size、sync_water_mark=90%*total_redo_file_size。若每個重做日誌的大小為1G且定義了兩個重做日誌共2G。那麼async_water_mark=1.5G,sync_water_mark=1.8G。
當checkpoint_age<async_water_mark時,不需要重新整理任何髒資料到磁碟;
當async_water_mark<checkpoint_age<sync_water_mark時,觸發Async Flush從Flush列表重新整理足夠的髒頁會磁碟,使得重新整理後滿足checkpoint_age<async_water_mark;
當checkpoint_age>sync_water_mark時,這種情況很少發生除非設定的重做記錄檔太小,並且進行類似於LOAD DATA的BULK INSRET操作。這個時候觸發Sync Flush從Flush列表重新整理足夠的髒頁會磁碟,使得重新整理後滿足checkpoint_age<async_water_mark;
Async Flush Checkpoint會阻塞發現問題的使用者查詢線程,Sync Flush Checkpoint會阻塞所有的使用者查詢線程,並且等待髒頁重新整理完成。但是從MySQL5.6版本開始這部分操作放入單獨的Page Cleaner Thread中,不再會堵塞使用者查詢線程。
d.Dirty Page too much Checkpoint
髒頁的數量太多導致InnoDB儲存引擎強制進行Checkpoint,其目的是為了保證緩衝池中有足夠的頁可以用。可以通過參數innodb_max_dirty_pages_pct來設定。
注意:Checkpoint機制將髒頁刷回磁碟並不是直接刷回磁碟的,而是通過doublewrite(兩次寫). 即通過memcpy函數將髒頁先複製到記憶體中的doublewrite buffer,之後通過doublewrite分兩次(每次1MB)順序寫入共用資料表空間的物理磁碟上,然後調用fsync函數同步磁碟。具體是怎麼實現的會在以後的部落格中分享。
MySQL Checkpoint機制