我們知道innodb採用write ahead log策略來防止宕機資料丟失,即事務提交時,先寫重做日誌,再修改記憶體資料頁,
這樣就產生了髒頁。既然有重做日誌保證資料永續性,查詢時也可以直接從緩衝池頁中取資料,那為什麼還要重新整理髒頁
到磁碟呢?如果重做日誌可以無限增大,同時緩衝池足夠大,能夠快取所有資料,那麼是不需要將緩衝池中的髒頁重新整理
到磁碟。但是,通常會有以下幾個問題:
伺服器記憶體有限,緩衝池不夠用,無法快取全部資料
重做日誌無限增大成本要求太高
宕機時如果重做全部日誌恢復時間過長
事實上,當資料庫宕機時,資料庫不需要重做所有的日誌,只需要執行上次刷入點之後的日誌。這個點就叫做checkpoint,
它解決了以上的問題:
縮短資料庫恢復時間
緩衝池不夠用時,將髒頁重新整理到磁碟
重做日誌不可用時,重新整理髒頁
重做日誌被設計成可迴圈使用,當日誌檔案寫滿時,重做日誌中對應資料已經被重新整理到磁碟的那部分不再需要的日誌可以被
覆蓋重用。
innodb引擎通過lsn(log sequence number)來標記版本,lsn是日誌空間中每條日誌的結束點,用位元組偏移量來表示。
每個page有lsn,redo log也有lsn,checkpoint也有lsn。可以通過命令show engine innodb status來觀察:
loglog sequence number 11102619599
log flushed up to 11102618636
last checkpoint at 11102606319
0 pending log writes, 0 pending chkp writes
15416290 log i/o's done, 12.32 log i/o's/second
checkpoint機制每次重新整理多少頁,從**取臟頁,什麼時間觸發重新整理?這些都是很複雜的。有兩種checkpoint,分別為:
sharp checkpoint
fuzzy checkpoint
sharp checkpoint發生在關閉資料庫時,將所有髒頁刷回磁碟。在執行時使用fuzzy checkpoint進行部分髒頁的重新整理。
部分髒頁重新整理有以下幾種:
master thread checkpoint
flush_lru_list checkpoint
async/sync flush checkpoint
dirty page too much checkpoint
master thread checkpoint
master thread以每秒或每十秒的速度從緩衝池的髒頁列表中重新整理一定比例的頁回磁碟。這個過程是非同步的,不會阻塞查詢
執行緒。flush_lru_list checkpoint
innodb要保證lru列表中有100左右空閒頁可使用。在innodb1.1.x版本前,要檢查lru中是否有足夠的頁用於使用者查詢
操作執行緒,如果沒有,會將lru列表尾端的頁淘汰,如果被淘汰的頁中有髒頁,會強制執行checkpoint刷回髒頁資料到
磁碟,顯然這會阻塞使用者查詢執行緒。從innodb1.2.x版本開始,這個檢查放到單獨的page cleaner thread中進行,
並且使用者可以通過innodb_lru_scan_depth控制lru列表中可用頁的數量,預設值為1024。
async/sync flush checkpoint
是指重做日誌檔案不可用時,需要強制將髒頁列表中的一些頁重新整理回磁碟。這可以保證重做日誌檔案可迴圈使用。
在innodb1.2.x版本之前,async flush checkpoint會阻塞發現問題的使用者查詢執行緒,sync flush checkpoint會阻塞
所有查詢執行緒。innodb1.2.x之後放到單獨的page cleaner thread。
dirty page too much checkpoint
髒頁數量太多時,innodb引擎會強制進行checkpoint。目的還是為了保證緩衝池中有足夠可用的空閒頁。其可以通過
引數innodb_max_dirty_pages_pct來設定:
mysql> show variables like 'innodb_max_dirty_pages_pct';
| variable_name | value |
| innodb_max_dirty_pages_pct | 60 |
mysql髒頁 MySQL效能調優 髒頁重新整理
原理 當記憶體資料頁跟磁碟資料頁內容不一致的時候,我們稱這個記憶體頁為 髒頁 記憶體資料寫入到磁碟後,記憶體和磁碟上的資料頁的內容就一致了,稱為 乾淨頁 當要讀入的資料頁沒有在記憶體的時候,就必須到緩衝池中申請乙個資料頁。這時候只能把最久不使用的資料頁從記憶體中淘汰掉 如果要淘汰的是乙個乾淨頁,就直...
mysql 檢視 髒頁 MySQL 刷髒頁
1.髒頁,乾淨頁 當記憶體資料頁和磁碟資料頁上的內容不一致時,我們稱這個記憶體頁為髒頁 記憶體資料寫入磁碟後,記憶體頁上的資料和磁碟頁上的資料就一致了,我們稱這個記憶體頁為乾淨頁。2.刷髒頁的時機 2.1 redo log redo log 是迴圈寫的,當redo log 寫滿了,即 write p...
MySQL學習筆記 6 髒頁重新整理策略
innodb的redo log寫滿了系統記憶體不足系統空閒時 不影響效能 mysql正常關閉過程 不影響效能 這種情況要盡量避免,出現這種情況的時候,整個系統就不能再接受更新了,所有更新都將被阻塞 記憶體不足是指innodb中的buffer pool的剩餘記憶體不足 buffer pool中的資料頁...