MySQL checkpoint
一、Mysql checkpoint

1、checkpoint的目的
1)縮短數據庫的恢復時間
2)buffer pool空間不夠用時,將臟頁刷新到磁盤
3)redolog不可用時,刷新臟頁
2、檢查點分類
1)sharp checkpoint:完全檢查點,數據庫正常關閉時,會觸發把所有的臟頁都寫入到磁盤上(這時候logfile的日志就沒用了,臟頁已經寫到磁盤上了)。
完全檢查點,發生在數據庫正常關閉的時候。
在數據庫在運行時不會使用sharp checkpoint,在引擎內部使用fuzzy checkpoint,即只刷新一部分臟頁,而不是刷新所有的臟頁回磁盤。
2)fuzzy checkpoint:模糊檢查點,部分頁寫入磁盤。
發生在數據庫正常運行期間。
模糊檢查點,不是sharp的就是模糊檢查點(4種):page clean thread checkpoint、flush_lru_list checkpoint、async/sync flush checkpoint、dirty page too much checkpoint。
3、Master Thread checkpoint
差不多以每秒或每十秒的速度從緩沖池的臟頁列表中刷新一定比例的頁回磁盤,這個過程是異步的,不會阻塞用戶查詢。
1、周期性,讀取flush list,找到臟頁,寫入磁盤
2、寫入的量比較小
3、異步,不影響業務
4、通過capacity能力告知進行刷盤控制
通過innodb的io能力告知控制對flush list刷臟頁數量,io_capacity越高,每次刷盤寫入臟頁數越多;
如果臟頁數量過多,刷盤速度很慢,在io能力允許的情況下,調高innodb_io_capacity值,讓多刷臟頁。
innodb_io_capacity = 200
innodb_io_capacity_max = 2000
4、flush_lru_list checkpoint:保證可用的空閑頁
Mysql會保證,保證里面有多少可用的空閑頁,如果沒有100個可用空閑頁,那么innodb會將lru列表尾端的頁移除,如果這些頁中有臟頁,那么需要進行checkpoint。
線程page cleaner中進行,用戶可以通過參數innodb_lru_scan_depth控制lru列表中可用頁的數量,默認是1024。
此情況下觸發,默認掃描1024個lru冷端數據頁,將臟頁寫入磁盤(有10個就刷10,有100個就刷100個……)
innodb_lru_scan_depth | 1024
5、async/sync flush checkpoint
log file快滿了,會批量的觸發數據頁回寫,這個事件觸發的時候又分為異步和同步,不可被覆蓋的redolog占log file的比值:75%--->異步、90%--->同步。
當這兩個事件中的任何一個發生的時候,都會記錄到errlog中,一旦errlog出現這種日志提示,一定需要加大logfile。
Async/Sync Flush Checkpoint是為了保證重做日志的循環使用的可用性。刷新操作放入到了單獨的Page Cleaner Thread中,故不會阻塞用戶查詢線程。
6、dirty page too much checkpoint
很明顯,臟頁太多檢查點,為了保證buffer pool的空間可用性的一個檢查點。
1)臟頁監控,關注點
show global status like 'Innodb_buffer_pool_pages%t%'
show global status like '%wait_free';
Innodb_buffer_pool_pages_dirty/Innodb_buffer_pool_pages_total:表示臟頁在buffer 的占比
Innodb_buffer_pool_wait_free:如果>0,說明出現性能負載,buffer pool中沒有干凈可用塊
2)臟頁控制參數
| innodb_max_dirty_pages_pct???? | 75.000000 |
| innodb_max_dirty_pages_pct_lwm | 0.000000? |
默認是臟頁占比75%的時候,就會觸發刷盤,將臟頁寫入磁盤,騰出內存空間。建議不調,調太低的話,io壓力就會很大,但是崩潰恢復就很快;
lwm:low water mark低水位線,刷盤到該低水位線就不寫臟頁了,0也就是不限制。
注意:上面在調整的時候,要關注系統的寫性能iostat -x。
二、
通過show engine innodb status\G解釋一下LOG相關的四行參數的值:
Log sequence number 143942609---LSN:日志序列號(1)
//字節,日志生成的最新位置,最新位置出現在log buffer中
Log flushed up to?? 143942609---(2)
//字節,日志已經寫入到log file的位置,1-2=log buffer日志量,最好是<=1M
Pages flushed up to 143942609---(3)
//字節,臟頁的數量(日志字節數來衡量),2-3=臟頁的數量(日志字節為單位)
Last checkpoint at? 143942600---(4)
//字節,共享表空間上的日志記錄點,最后一次檢查點,及崩潰恢復時指定的起點,3-4就是崩潰恢復多跑的日志,值越大說明需要提升checkpoint的跟進速度
MySQL 數據庫
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。