日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

mysql 脏页刷新_InnoDB脏页刷新机制

發(fā)布時(shí)間:2023/12/20 数据库 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql 脏页刷新_InnoDB脏页刷新机制 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

我們知道InnoDB采用Write Ahead Log策略來(lái)防止宕機(jī)數(shù)據(jù)丟失,即事務(wù)提交時(shí),先寫(xiě)重做日志,再修改內(nèi)存數(shù)據(jù)頁(yè),

這樣就產(chǎn)生了臟頁(yè)。既然有重做日志保證數(shù)據(jù)持久性,查詢時(shí)也可以直接從緩沖池頁(yè)中取數(shù)據(jù),那為什么還要刷新臟頁(yè)

到磁盤呢?如果重做日志可以無(wú)限增大,同時(shí)緩沖池足夠大,能夠緩存所有數(shù)據(jù),那么是不需要將緩沖池中的臟頁(yè)刷新

到磁盤。但是,通常會(huì)有以下幾個(gè)問(wèn)題:

服務(wù)器內(nèi)存有限,緩沖池不夠用,無(wú)法緩存全部數(shù)據(jù)

重做日志無(wú)限增大成本要求太高

宕機(jī)時(shí)如果重做全部日志恢復(fù)時(shí)間過(guò)長(zhǎng)

事實(shí)上,當(dāng)數(shù)據(jù)庫(kù)宕機(jī)時(shí),數(shù)據(jù)庫(kù)不需要重做所有的日志,只需要執(zhí)行上次刷入點(diǎn)之后的日志。這個(gè)點(diǎn)就叫做Checkpoint,

它解決了以上的問(wèn)題:

縮短數(shù)據(jù)庫(kù)恢復(fù)時(shí)間

緩沖池不夠用時(shí),將臟頁(yè)刷新到磁盤

重做日志不可用時(shí),刷新臟頁(yè)

重做日志被設(shè)計(jì)成可循環(huán)使用,當(dāng)日志文件寫(xiě)滿時(shí),重做日志中對(duì)應(yīng)數(shù)據(jù)已經(jīng)被刷新到磁盤的那部分不再需要的日志可以被

覆蓋重用。

InnoDB引擎通過(guò)LSN(Log Sequence Number)來(lái)標(biāo)記版本,LSN是日志空間中每條日志的結(jié)束點(diǎn),用字節(jié)偏移量來(lái)表示。

每個(gè)page有LSN,redo log也有LSN,Checkpoint也有LSN。可以通過(guò)命令show engine innodb status來(lái)觀察:

---

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ī)制每次刷新多少頁(yè),從哪里取臟頁(yè),什么時(shí)間觸發(fā)刷新?這些都是很復(fù)雜的。有兩種Checkpoint,分別為:

Sharp Checkpoint

Fuzzy Checkpoint

Sharp Checkpoint發(fā)生在關(guān)閉數(shù)據(jù)庫(kù)時(shí),將所有臟頁(yè)刷回磁盤。在運(yùn)行時(shí)使用Fuzzy Checkpoint進(jìn)行部分臟頁(yè)的刷新。

部分臟頁(yè)刷新有以下幾種:

Master Thread Checkpoint

FLUSH_LRU_LIST Checkpoint

Async/Sync Flush Checkpoint

Dirty Page too much Checkpoint

Master Thread Checkpoint

Master Thread以每秒或每十秒的速度從緩沖池的臟頁(yè)列表中刷新一定比例的頁(yè)回磁盤。這個(gè)過(guò)程是異步的,不會(huì)阻塞查詢

線程。

FLUSH_LRU_LIST Checkpoint

InnoDB要保證LRU列表中有100左右空閑頁(yè)可使用。在InnoDB1.1.X版本前,要檢查L(zhǎng)RU中是否有足夠的頁(yè)用于用戶查詢

操作線程,如果沒(méi)有,會(huì)將LRU列表尾端的頁(yè)淘汰,如果被淘汰的頁(yè)中有臟頁(yè),會(huì)強(qiáng)制執(zhí)行Checkpoint刷回臟頁(yè)數(shù)據(jù)到

磁盤,顯然這會(huì)阻塞用戶查詢線程。從InnoDB1.2.X版本開(kāi)始,這個(gè)檢查放到單獨(dú)的Page Cleaner Thread中進(jìn)行,

并且用戶可以通過(guò)innodb_lru_scan_depth控制LRU列表中可用頁(yè)的數(shù)量,默認(rèn)值為1024。

Async/Sync Flush Checkpoint

是指重做日志文件不可用時(shí),需要強(qiáng)制將臟頁(yè)列表中的一些頁(yè)刷新回磁盤。這可以保證重做日志文件可循環(huán)使用。

在InnoDB1.2.X版本之前,Async Flush Checkpoint會(huì)阻塞發(fā)現(xiàn)問(wèn)題的用戶查詢線程,Sync Flush Checkpoint會(huì)阻塞

所有查詢線程。InnoDB1.2.X之后放到單獨(dú)的Page Cleaner Thread。

Dirty Page too much Checkpoint

臟頁(yè)數(shù)量太多時(shí),InnoDB引擎會(huì)強(qiáng)制進(jìn)行Checkpoint。目的還是為了保證緩沖池中有足夠可用的空閑頁(yè)。其可以通過(guò)

參數(shù)innodb_max_dirty_pages_pct來(lái)設(shè)置:

mysql> show variables like 'innodb_max_dirty_pages_pct';

+----------------------------+-------+

| Variable_name ? ? ? ? ? ? ?| Value |

+----------------------------+-------+

| innodb_max_dirty_pages_pct | 60 ? ?|

+----------------------------+-------+

總結(jié)

以上是生活随笔為你收集整理的mysql 脏页刷新_InnoDB脏页刷新机制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。