這篇文章主要講解了“InnoDB臟頁刷新機(jī)制的原理”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“InnoDB臟頁刷新機(jī)制的原理”吧!
我們知道InnoDB采用Write Ahead Log策略來防止宕機(jī)數(shù)據(jù)丟失,即事務(wù)提交時,先寫重做日志,再修改內(nèi)存數(shù)據(jù)頁,
這樣就產(chǎn)生了臟頁。既然有重做日志保證數(shù)據(jù)持久性,查詢時也可以直接從緩沖池頁中取數(shù)據(jù),那為什么還要刷新臟頁
到磁盤呢?如果重做日志可以無限增大,同時緩沖池足夠大,能夠緩存所有數(shù)據(jù),那么是不需要將緩沖池中的臟頁刷新
到磁盤。但是,通常會有以下幾個問題:
服務(wù)器內(nèi)存有限,緩沖池不夠用,無法緩存全部數(shù)據(jù)
重做日志無限增大成本要求太高
宕機(jī)時如果重做全部日志恢復(fù)時間過長
事實(shí)上,當(dāng)數(shù)據(jù)庫宕機(jī)時,數(shù)據(jù)庫不需要重做所有的日志,只需要執(zhí)行上次刷入點(diǎn)之后的日志。這個點(diǎn)就叫做Checkpoint,
它解決了以上的問題:
縮短數(shù)據(jù)庫恢復(fù)時間
緩沖池不夠用時,將臟頁刷新到磁盤
重做日志不可用時,刷新臟頁
重做日志被設(shè)計成可循環(huán)使用,當(dāng)日志文件寫滿時,重做日志中對應(yīng)數(shù)據(jù)已經(jīng)被刷新到磁盤的那部分不再需要的日志可以被
覆蓋重用。
InnoDB引擎通過LSN(Log Sequence Number)來標(biāo)記版本,LSN是日志空間中每條日志的結(jié)束點(diǎn),用字節(jié)偏移量來表示。
每個page有LSN,redo log也有LSN,Checkpoint也有LSN。可以通過命令show engine innodb status來觀察:
---
LOG
---
Log 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機(jī)制每次刷新多少頁,從哪里取臟頁,什么時間觸發(fā)刷新?這些都是很復(fù)雜的。有兩種Checkpoint,分別為:
Sharp Checkpoint
Fuzzy Checkpoint
Sharp Checkpoint發(fā)生在關(guān)閉數(shù)據(jù)庫時,將所有臟頁刷回磁盤。在運(yùn)行時使用Fuzzy Checkpoint進(jìn)行部分臟頁的刷新。
部分臟頁刷新有以下幾種:
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列表尾端的頁淘汰,如果被淘汰的頁中有臟頁,會強(qiáng)制執(zhí)行Checkpoint刷回臟頁數(shù)據(jù)到
磁盤,顯然這會阻塞用戶查詢線程。從InnoDB1.2.X版本開始,這個檢查放到單獨(dú)的Page Cleaner Thread中進(jìn)行,
并且用戶可以通過innodb_lru_scan_depth控制LRU列表中可用頁的數(shù)量,默認(rèn)值為1024。
Async/Sync Flush Checkpoint
是指重做日志文件不可用時,需要強(qiáng)制將臟頁列表中的一些頁刷新回磁盤。這可以保證重做日志文件可循環(huán)使用。
在InnoDB1.2.X版本之前,Async Flush Checkpoint會阻塞發(fā)現(xiàn)問題的用戶查詢線程,Sync Flush Checkpoint會阻塞
所有查詢線程。InnoDB1.2.X之后放到單獨(dú)的Page Cleaner Thread。
Dirty Page too much Checkpoint
臟頁數(shù)量太多時,InnoDB引擎會強(qiáng)制進(jìn)行Checkpoint。目的還是為了保證緩沖池中有足夠可用的空閑頁。其可以通過
參數(shù)innodb_max_dirty_pages_pct來設(shè)置:
mysql> show variables like 'innodb_max_dirty_pages_pct';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| innodb_max_dirty_pages_pct | 60 |
+----------------------------+-------+
感謝各位的閱讀,以上就是“InnoDB臟頁刷新機(jī)制的原理”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對InnoDB臟頁刷新機(jī)制的原理這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!
新聞名稱:InnoDB臟頁刷新機(jī)制的原理-創(chuàng)新互聯(lián)
標(biāo)題網(wǎng)址:http://www.chinadenli.net/article44/didsee.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、微信公眾號、網(wǎng)站導(dǎo)航、云服務(wù)器、網(wǎng)站建設(shè)、網(wǎng)站內(nèi)鏈
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容