重做日誌落盤
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向磁碟寫入資料時,有可能只是寫入到了檔案系統的緩重做日誌檔案。重做日誌緩衝一般不需要設定得很大,因為一般情況每一秒鐘都會講重做日誌緩 沖刷新到日誌檔案中。可通過配置引數
innodb_log_buffer_size 控制,預設為8mb。
存中,沒有真正的「落袋為安」。
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個區域 區 存放 函式體的二進位制 由作業系統進行管理 全域性區 存放 全域性變數和 靜態變數以及 常量棧區 由 編譯器自動分配釋放,存放函式的引數值 區域性變數等 堆區 由 程式設計師分配和釋放,若程式設計師不...