MySql學習(專項篇)記憶體資料落盤

2021-10-04 10:17:30 字數 4659 閱讀 8831

重做日誌落盤

innodb記憶體緩衝池中的資料page要完成持久化的話,是通過兩個流程來完成的,乙個是髒頁落

盤;乙個是預寫redo log日誌。

當緩衝池中的頁的版本比磁碟要新時,資料庫需要將新版本的頁從緩衝池重新整理到磁碟。但是如果

每次乙個頁傳送變化,就進行重新整理,那麼效能開發是非常大的,於是innodb採用了write ahead

log(wal)策略和force log at commit機制實現事務級別下資料的永續性。

wal要求資料的變更寫入到磁碟前,首先必須將記憶體中的日誌寫入到磁碟;

force-log-at-commit要求當乙個事務提交時,所有產生的日誌都必須重新整理到磁碟上,如果日誌刷

新成功後,緩衝池中的資料重新整理到磁碟前資料庫發生了宕機,那麼重啟時,資料庫可以從日誌中 恢復資料。

為了確保每次日誌都寫入到重做日誌檔案,在每次將重做日誌緩衝寫入重做日誌後,必須呼叫一

次fsync操作,將緩衝檔案從檔案系統快取中真正寫入磁碟。 可以通過 innodb_flush_log_at_trx_commit

來控制重做日誌重新整理到磁碟的策略。

在資料庫中進行讀取操作,將從磁碟中讀到的頁放在緩衝池中,下次再讀相同的頁時,首先判斷

該頁是否在緩衝池中。若在緩衝池中,稱該頁在緩衝池中被命中,直接讀取該頁。否則,讀取磁 盤上的頁。

對於資料庫中頁的修改操作,則首先修改在緩衝池中的頁,然後再以一定的頻率重新整理到磁碟上。

頁從緩衝池重新整理回磁碟的操作並不是在每次頁發生更新時觸發,而是通過一種稱為checkpoint的 機制重新整理回磁碟。

checkpoint是為了解決下面幾個問題:

縮短資料庫的恢復時間;

緩衝池不夠用時,將髒頁重新整理到磁碟;

重做日誌不可用時,重新整理髒頁

當資料庫發生宕機時,資料庫不需要重做所有的日誌,因為checkpoint之前的頁都已經重新整理回磁

盤。資料庫只需對checkpoint後的重做日誌進行恢復,這樣就大大縮短了恢復的時間。

當緩衝池不夠用時,根據lru演算法(最少最近使用原則)會溢位最近最少使用的頁,若此頁為髒頁,那麼需要強制執行

checkpoint,將髒頁也就是頁的新版本刷回磁碟。

當重做日誌出現不可用時,因為當前事務資料庫系統對重做日誌的設計都是迴圈使用的,並不是讓

其無限增大的。重做日誌可以被重用的部分是指這些重做日誌已經不再需要,當資料庫發生宕機

時,資料庫恢復操作不需要這部分的重做日誌,因此這部分就可以被覆蓋重用。如果重做日誌還需

要使用,那麼必須強制checkpoint,將緩衝池中的頁至少重新整理到當前重做日誌的位置。

checkpoint分類

在innodb儲存引擎內部,有兩種checkpoint,分別為:sharp checkpoint、fuzzy checkpoint

sharp checkpoint:在關閉資料庫的時候,將buffer pool中的髒頁全部重新整理到磁碟中

fuzzy checkpoint:資料庫正常執行時,在不同的時機,將部分髒頁寫入磁碟。僅重新整理部分髒頁

到磁碟,也是為了避免一次重新整理全部的髒頁造成的效能問題。

fuzzy checkpoint

fuzzy checkpoint分為以下幾種:

master thread checkpoint

flush_lru_list checkpoint

async/sync flush checkpoint

dirty page too much checkpoint

master thread checkpoint

在master thread中,會以每秒或者每10秒一次的頻率,將部分髒頁從記憶體中重新整理到磁碟,這個過程是

非同步的。正常的使用者執行緒對資料的操作不會被阻塞。

flush_lru_list checkpoint

flush_lru_list checkpoint是在單獨的page cleaner執行緒中執行的。

mysql對快取的管理是通過buffer pool中的lru列表實現的,lru 空閒列表中要保留一定數量的

空閒頁面,來保證buffer pool中有足夠的空閒頁面來相應外界對資料庫的請求。

當這個空間頁面數量不足的時候,發生flush_lru_list checkpoint。

空閒頁的數量由innodb_lru_scan_depth參數列來控制的,因此在空閒列表頁面數量少於配置的

值的時候,會發生checkpoint,剔除部分lru列表尾端的頁面。

async/sync flush checkpoint

async/sync flush checkpoint是在單獨的page cleaner執行緒中執行的。

async/sync flush checkpoint 發生在重做日誌不可用的時候,將buffer pool中的一部分髒頁刷

新到磁碟中,在髒頁寫入磁碟之後,事物對應的重做日誌也就可以釋放了。

關於redo_log檔案的的大小,可以通過 innodb_log_file_size 來配置。

對於是執行async flush checkpoint還是sync flush checkpoint,由checkpoint_age以及

async_water_mark和sync_water_mark來決定。

async_water_mark=75%*innodb_log_file_size

sync_water_mark=90%*innodb_log_file_size

當checkpoint_age

當async_water_mark

當checkpoint_age>sync_water_mark的時候,執行sync flush checkpoint。也就說,redo

log剩餘空間不足10%的時候,執行sync flush checkpoint,重新整理到滿足條件1。

在mysql 5.6之後,不管是async flush checkpoint還是sync flush checkpoint,都不會阻

塞使用者的查詢程序。

由於磁碟是一種相對較慢的儲存裝置,記憶體與磁碟的互動是乙個相對較慢的過程

由於innodb_log_file_size定義的是乙個相對較大的值,正常情況下,由前面兩種checkpoint重新整理

髒頁到磁碟,在前面兩種checkpoint重新整理髒頁到磁碟之後,髒頁對應的redo log空間隨即釋放,

一般不會發生async/sync flush checkpoint。同時也要意識到,為了避免頻繁低發生async/sync

flush checkpoint,也應該將innodb_log_file_size配置的相對較大一些。

dirty page too much checkpoint

dirty page too much checkpoint是在master thread 執行緒中每秒一次的頻率實現的。

dirty page too much 意味著buffer pool中的髒頁過多,執行checkpoint髒頁刷入磁碟,保證

buffer pool中有足夠的可用頁面。

dirty page 由innodb_max_dirty_pages_pct配置,innodb_max_dirty_pages_pct的預設值在

innodb 1.0之前是90%,之後是75%

innodb儲存引擎會首先將重做日誌資訊先放入重做日誌緩衝中,然後再按照一定頻率將其重新整理到

重做日誌檔案。重做日誌緩衝一般不需要設定得很大,因為一般情況每一秒鐘都會講重做日誌緩 沖刷新到日誌檔案中。可通過配置引數

innodb_log_buffer_size 控制,預設為8mb。

作業系統的檔案系統是帶有快取的,當innodb向磁碟寫入資料時,有可能只是寫入到了檔案系統的緩

存中,沒有真正的「落袋為安」。

innodb的innodb_flush_log_at_trx_commit屬性可以控制每次事務提交時innodb的行為。

當屬性值為0時,事務提交時,不會對重做日誌進行寫入操作,而是等待主線程按時寫入;

當屬性值為1時,事務提交時,會將重做日誌寫入檔案系統快取,並且呼叫檔案系統的fsync,將文

件系統緩衝中的資料真正寫入磁碟儲存,確保不會出現資料丟失;

當屬性值為2時,事務提交時,也會將日誌檔案寫入檔案系統快取,但是不會呼叫fsync,而是讓文

件系統自己去判斷何時將快取寫入磁碟。

innodb_flush_log_at_commit是innodb效能調優的乙個基礎引數,涉及innodb的寫入效率和數

據安全。當引數值為0時,寫入效率最高,但是資料安全最低;引數值為1時,寫入效率最低,但

是資料安全最高;引數值為2時,二者都是中等水平。一般建議將該屬性值設定為1,以獲得較高

的資料安全性,而且也只有設定為1,才能保證事務的永續性。

Mysql學習 基礎篇

一.一條sql語句在mysql中如何執行的?客戶端請求 聯結器 驗證身份,給予許可權 查詢快取 存在則直接返回 不存在則執行後續操作 分析器 對sql進行詞法分析和語句分析操作 優化器 主要對執行的sql優化選擇最優的執行方法 執行器 執行時會看使用者是否有執行許可權,有才去使用這個引擎提供的介面 ...

MySql基礎篇學習

用於儲存和管理資料的倉庫 1.持久化儲存資料,其實資料庫就是乙個檔案系統 2.方便儲存和管理資料 3.使用了統一的方式運算元據庫 sql 1.去mysql的安裝目錄找到my.ini檔案 複製 datadir c programdata mysql mysql server 5.5 data 2.解除...

學習篇 C 基礎 記憶體分割槽

二 程式執行後 三 new操作符 四 一些tips 程式在執行時,將記憶體大方向劃分為4個區域 區 存放 函式體的二進位制 由作業系統進行管理 全域性區 存放 全域性變數和 靜態變數以及 常量棧區 由 編譯器自動分配釋放,存放函式的引數值 區域性變數等 堆區 由 程式設計師分配和釋放,若程式設計師不...