Mysql

innodb_max_dirty_pages_pct 的確切含義是什麼,它與重做日誌有何關係?

  • November 22, 2019

我對innodb_max_dirty_pages_pct參數及其與重做日誌的關係感到困惑。

定義本身很簡單:

InnoDB 嘗試從緩衝池中刷新數據,以便臟頁的百分比不超過此值。

但是,讓我困惑的是與重做日誌的關係。

“刷新數據”是否意味著:

  1. 將臟頁從日誌緩衝區復製到重做日誌,或者
  2. 從重做日誌到緩衝池文件?

我無法想像第一種情況是如何發生的。即使在具有 的系統中innodb_flush_log_at_trx_commit = 0,日誌每秒刷新一次,那麼如何在一秒鐘內更改 90% 的緩衝池呢?

如果 case 是 2(我猜這個解釋是(檢查點年齡 > 總日誌大小 * pct),那麼大量的髒頁不適合重做日誌。

我有什麼誤解?

你說:

日誌每秒刷新一次,那麼如何在一秒鐘內更改 90% 的緩衝池呢?

$$ … $$如此多的髒頁不適合重做日誌

您似乎認為日誌緩衝區和緩衝池的含義相同;那不是真的。

從緩衝池中刷新臟頁和重做日誌之間沒有關係。日誌緩衝區和緩衝池用途不同,分開管理。

正如手冊指出的那樣

緩衝池是主記憶體中 InnoDB記憶體表和索引數據的區域

日誌緩衝區是保存要寫入磁碟上日誌文件的數據的記憶體區域

(強調我的。)

當臟數據或索引頁被刷新時,相應的日誌記錄已經被寫出——這就是預寫日誌的本質。從緩衝池中刷新臟頁意味著這些頁被寫入適當的ibdata*和/或.ibd文件。

由 RolandoMySQLDBA 編輯

從 Percona 首席技術官 Vadim Tkachenko 添加 InnoDB 的視覺化表示

InnoDB 架構

首先要了解的是重做日誌緩衝區和日誌文件不包含與緩衝池和數據文件相同類型的項目(請參閱此處)。沒有項目從重做日誌複製到緩衝池或從緩衝池複製到重做日誌。因此,你對它們之間關係的看法都是錯誤的。

“刷新數據”是指將頁面從緩衝池寫入數據文件(參見此處)。

我認為innodb_max_dirty_pages_pct仍然與重做日誌有關,因為在對應的日誌記錄已經寫入磁碟之前無法刷新臟頁(我無法在文件中找到確認,但似乎很可能是因為否則數據庫恢復過程將具有不連貫的集合日誌數據記錄)。

因此,當innodb_max_dirty_pages_pct達到並且後台程序開始嘗試查找可以寫入磁碟但不能因為相應的重做日誌記錄不是從磁碟上的緩衝區寫入時,它可能會觸發重做日誌刷新,可能會導致前台業務暫時放緩。(但在緩衝池足夠大的情況下幾乎不會發生這種情況。)

引用自:https://dba.stackexchange.com/questions/253935