幾個知識點:
緩沖池:緩存磁盤數據,通過內存速度彌補CPU速度和磁盤速度的鴻溝。
臟頁:LRU列表中被修改的頁,和磁盤上的數據不一致
刷新頻率:每次有臟頁就刷新,開銷很大。需要一種刷新機制
數據丟失:有臟頁,未刷新到磁盤,發生宕機,可能會丟失--->引入Write Ahead Log策略(先寫重做日志,再修改頁)
數據恢復:通過重做日志恢復數據,體現事務ACID中的持久性(D)
checkpoint:將緩沖池中的臟頁刷新回到磁盤。
checkpoint解決的問題:
- 縮短數據庫的恢復時間
- 緩沖池不夠用,將臟頁刷新回磁盤
- 重做日志不可用(不可被重用,不可被覆蓋),刷新臟頁
1.縮短數據庫恢復時間重做日志中記錄了的checkpoint的位置,這個點之前的頁已經刷新回磁盤,只需要對checkpoint之后的重做日志進行恢復。這樣就大大縮短了恢復時間。
2.緩沖池不夠用時,根據LRU算法,溢出最近最少使用的頁,如果頁為臟頁,強制執行checkpoint,將頁刷新回磁盤。
3.重做日志不可用,是指,重做日志的這部分不可以被覆蓋,為什么?因為:這部分對應的數據還未刷新到磁盤上。重做日志的設計是循環使用的。數據庫恢復時,如果不需要,即可被覆蓋;如果需要,必須強制執行checkpoint,將緩沖池中的頁至少刷新到當前重做日志的位置。
InnoDB存儲引擎,通過LSN來標記版本,LSN是8字節的數字。每個頁有LSN,重做日志有LSN,checkpoint有LSN。
----checkpoint的刷新原理------------------------------------
checkpoint:將緩沖池中的臟頁刷回到磁盤。
考慮的問題:每次刷新多少頁到磁盤?每次從哪里取臟頁?什么時間觸發checkpoint?
InnoDB存儲引擎內部,
兩種checkpoint,分別為:
- Sharp Checkpoint
- Fuzzy Checkpoint
Sharp Checkpoint發生在數據庫關閉時,將所有的臟頁都刷新回磁盤,這是默認的工作方式,即參數:innodb_fast_shutdown=1。
不適用於數據庫運行時的刷新。
在數據庫運行時,InnoDB存儲引擎內部采用Fuzzy Checkpoint,只刷新一部分臟頁。
幾種發生Fuzzy Checkpoint的情況:
1.
MasterThread Checkpoint
異步刷新,每秒或每10秒從緩沖池臟頁列表刷新一定比例的頁回磁盤。異步刷新,即此時InnoDB存儲引擎可以進行其他操作,用戶查詢線程不會受阻。-->參考master Thread的介紹
2.
FLUSH_LRU_LIST Checkpoint
InnoDB存儲引擎需要保證LRU列表中差不多有100個空閑頁可供使用。在InnoDB 1.1.x版本之前,用戶查詢線程會檢查LRU列表是否有足夠的空間操作。如果沒有,根據LRU算法,溢出LRU列表尾端的頁,如果這些頁有臟頁,需要進行checkpoint。因此叫:flush_lru_list checkpoint.
mysql5.6之后,也就是Innodb1.2.x開始,這個檢查放在了單獨的進程(Page Cleaner)中進行。好處:1.減少master Thread的壓力 2.減輕用戶線程阻塞。-->參考page cleaner線程。
設置參數:innodb_lru_scan_dept:控制LRU列表中可用頁的數量,該值默認1024
3.
Async/Sync Flush Checkpoint
指重
做日志不可用的情況,需要強制刷新頁回磁盤,此時的頁時臟頁列表選取的。
這種情況是保證重做日志的可用性,說白了就是,重做日志中可以循環覆蓋的部分空間太少了,換種說法,就是極短時間內產生了大量的redo log。
寫入日志的LSN:redo_lsn
刷新回磁盤的最新頁LSN:checkpoint_lsn
定義:
checkpoint_age = redo_lsn - checkpoint_lsn
async_water_mark = 75% * total_redo_file_size
sync_water_mark = 90% * total_redo_file_size
圖解如下:
關於用戶阻塞的問題:
在InnoDB1.2.x版本之前,Async Flush Checkpoint 會阻塞發現問題的用戶查詢線程;Sync Flush Checkpoint會阻塞所有用戶查詢線程。
在InnoDB1.2.x版本開始,也就是MySQL5.6,這部分的刷新操作放在了單獨的線程中:Page Cleaner Thread中,故不會阻塞用戶查詢線程。
通過show engine innodb status\G 可以查看Async Flush,Sync Flush
4
.Dirty Page too much Checkpoint
即臟頁太多,強制checkpoint.保證緩沖池有足夠可用的頁。
參數設置:innodb_max_dirty_pages_pct = 75 表示:當緩沖池中臟頁的數量占75%時,強制checkpoint。1.0.x之后默認75
--OK
