MySQL的Flush List和髒頁的落盤機制

2022-09-25 03:51:08 字數 2234 閱讀 8556

一、回顧

mysql啟動後buffer pool會初始化。buffer pool也會初始化好n程式設計客棧多個空白的快取頁,以及它們的描述資料會被組織成lru鍊錶以及freelist 雙向鍊錶。

這時你從磁碟中讀取乙個資料頁,會先從free list中找出乙個空閒快取頁的描述資訊,然後將你讀出的資料頁中載入進快取頁中。同時將快取頁的描述資訊從free list中剔除,此外該描述資訊塊還會被維護進lru鍊錶中。

資料頁被載入進buffer pool後你就可以對其進行變更操作了。

二、flush list

為了加快響應客戶端的速度,mysql會在buffer pool中對資料進行修改,可是一旦你對lru鍊錶中的快取頁做了修改,那該頁中的資料和磁碟中的資料頁資訊就不一致了!大家一般管這種資料頁叫做髒頁。

為了保證資料的最終一致性,mysql是需要將髒頁重新整理回磁碟的!

但是問題是:需要將哪些資料頁重新整理回磁碟呢?

這就引出了flush list~

flush list 和 free list程式設計客棧很像,都是由buffer pool中資料描述資訊組織而成的雙向鍊錶。

一旦你對記憶體中的緩衝頁作出了修改,那該緩衝頁對應的描述資訊塊就會新增進 flush list。這樣當buffer pool中的資料頁不夠用時,我們就可以優先將 flush list中的髒資料頁重新整理進磁碟中。

如果你讀了前幾篇文章那你肯定知道了 lrulist、freelist、flushlist、buffer pool、髒頁、髒資料。

下面乘勝追擊!一起看一下髒頁的落盤機制

三、什麼是髒頁?什麼是髒資料?

什麼是髒頁?

我在介紹flush list 的那篇文章有提及,髒頁就是lru鍊錶中被修改了的快取頁。他們和磁碟中的資料頁不一致,髒頁是需要被重新整理回磁碟的。

什麼是髒資料?

這個問題其實引出了髒讀的概念程式設計客棧。舉個例子:事物a中讀取到了事物b中未提交的資料,我們管這些資料叫做髒資料。

四、髒頁刷回磁碟的時機

當buffer pool不夠用時,根據lru機制,mysql會將old sublist部分的快取頁移出lru鍊錶。如果被移除出去的快取頁的描述資訊在flush list中,mysql就得將其重新整理回磁碟。

innodb儲存引擎將髒頁刷回磁碟的時機有蠻多的,你可以把它當作拓展知識大概瀏覽一下。

1、當mysql資料庫關閉時,會將所有的髒資料頁重新整理回磁碟。這個功能由引數:innodb_fast_shutdown=0控制,預設讓innodb在關閉前將髒頁刷回磁碟,以及清理掉undo log。

2、有乙個後台執行緒master thread會按照每秒或者每十秒的速度,非同步的將buffer pool中一定比例的頁面重新整理回磁碟中。

3、在mysql5.7中,buffer pool的重新整理由page cleaner threads完成。

我們可以通過innodb_page_cleaners引數控制page cleaner threads執行緒的數量,但是當你將這個數值調整的比buffer pool的數量還大時,mysql會自動將 innodb_page_cleaners數量設定為innodb_buffer_pool_instances的數量。

innodb1.1.x之前需要保證lru列表中有至少100個空閒頁可以使用。低於這個閾值就會觸發髒頁的重新整理。

從mysql5.6,也就是innodb1.2.x開始,innodb_lru_scan_depth引數為每個緩衝池例項指定page cleaner threads 掃瞄buffer pool來查詢要重新整理的髒頁的下行距離。預設為1024,該後台執行緒每秒都會執行一次。

4、當髒資料頁太多時,也會觸發將髒資料頁重新整理回磁碟。該機制可由引數innodb_nax_dirty_pages_pct控制,比如將其設定為75,表示,當buffer pool中的髒資料頁達到整體快取的75%時,觸發重新整理的動作。現實情況是該引數預設值為0。以此來禁用buffer pool早期的重新整理行為。

5、當redo log不可用時,也會強制髒頁列表中的髒頁重新整理回磁碟。這個機制同樣由乙個後台執行緒完成。

五、其他關於髒頁重新整理的知識點

重新整理臨接資料頁:意思是當mysql將某髒頁重新整理回磁碟時,是否也以相同的態度將該髒頁鄰接的髒頁一併重新整理回磁碟。

可以通過引數innodb_flush_neighbors控制該過程。

那如何選擇將其設定為哪種狀態呢?

你可以根據mysql例項所在機器的儲存型別來決定。如www.cppcns.com果為hdd儲存建議將其開啟,因為hdd的磁碟重新整理速率較低,開啟該引數後可以有效的減少io操作。相反如果使用ssd儲存,其本身就有高磁碟io的特性,建議禁用該引數。

mysql的恢復 MYSQL的恢復

恢復就簡單多了!只要執行該備份檔案就行了,該備份檔案是sql哦!恢復完全備份mysql uroot p backup.sql 就這麼簡單!恢復增量備份mysqlbinlog mysql bin.000002 mysql u root p 注意此次恢復過程亦會寫入日誌檔案,如果資料量很大,建議先關閉日...

mysql的查詢日誌 mysql

這篇文章總結了mysql中查詢日誌的知識點。mysql中,日誌可以按照功能分為如下幾類。錯誤日誌 查詢日誌 慢查詢日誌 二進位制日誌 中繼日誌 innodb儲存引擎級別的事務日誌 查詢日誌 查詢日誌在mysql中被稱之為general log 通用日誌 不要被 查詢日誌 的名字誤導,錯誤的以為查詢日...

mysql的定義 MySQL定義

什麼是sql sql是結構化查詢語言。什麼是資料庫 資料庫是用來儲存資料的。關聯式資料庫 多張表之間的關係。關聯式資料庫包含表 表名 列 主鍵,通過相應的關係列來產生連線關係。資料庫與資料倉儲 資料庫是用來做交易 transaction 資料倉儲是用來做分析 analytics 資料倉儲的作用在於 ...