red log buffer、data buffer、binlog cache。在O和M中,講究日誌先行策略,就是一條DML語句進入數據庫以後,都會先寫日誌,再寫數據文件。數據庫
1.red log,安全
重作日誌文件,用於記錄事務操做的變化,記錄的是數據修改以後的值,無論事務是否提交都會記錄下來。在實例和介質失敗時,重作日誌文件就能派上用場,如數據庫掉電,InnoDB存儲引擎會使用重作日誌恢復到掉電前的時刻,以此來保證數據的完整性。性能
默認狀況下至少有兩個red log文件,在磁盤上用ib_logfile(0-N)命名。spa
red log寫的方式是順序和循環寫,當寫滿最後一個文件時,會從新從第一個文件開始寫,寫滿日誌文件會產生切換操做,並執行 checkpoint,觸發髒頁的刷新。MySQL數據庫重啓過程當中,若是參數文件中的red log值大小與當前redo log值不一致,會把現有redo log 刪除,並按照參數文件中設置的大小,從新生成新的redo log文件。日誌
(1)在磁盤中生成 red log文件以前,數據是先寫在red log buffer中的。進程
三種模式下:事務
0性能最好,可是不安全,MySQL進程一旦崩潰會致使丟失一秒的數據。同步
1是安生性最高,但數據庫性能最慢。it
2是介於二者之間。io
(2)master thread:每秒進行刷新
(3)redo log buffer:使用超過一半的時候會觸發刷新。
2.binlog
DML語句既會寫red log 文件,也會寫binlog文件。功能主要用於備份恢復和主從複製。
從binlog cache刷新到磁盤的binlog文件中,須要經過sync_binlog參數來決定。
a.sync_binlog=0,當事務提交以後,MySQL不作fsync之類的磁盤同步指令刷新binlog_cache中的信息來到磁盤,而讓Filesystem自行決定何時來作同步,或都cache滿了以後才同步到磁盤。
b.sync_binlog=N,每進行N次事務提交以後,MySQL將進行一次fsync之類的磁盤同步指令來將binlog_cache中的數據強制寫入磁盤。
++++++++++++++++++++++++++++++++++red log和binlog區別++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
兩都都是記錄了對數據真實的修改的語句。同時有如下區別:
1.記錄內容的不一樣。
binlog是邏輯日誌,記錄全部數據的改變信息。
red log記錄的是物理日誌,記錄全部InnoDB表數據的變化。
2.記錄內容的時間不一樣。
binlog 記錄commit完畢以後的DML和DDLSQL語句。
red log記錄事務發起以後的DML和DDL SQL語句。
3.文件使用方式的不一樣。
binlog不是循環使用,在寫滿或者實例重啓以後,會生成新的binlog文件。
red log是循環使用,最後一個文件寫滿以後,會從新寫第一個文件。
4.做用不一樣。
binlog能夠做爲恢復數據使用,主從複製搭建。
red log做爲異常宕機中都介質故障後的數據恢復使用。
有如下關聯:
在主從環境中,從庫須要經過二進制日誌來應用主庫提交的事務,但若是主庫red log已經提交而二進制日誌沒有保持一致,則會形成從庫數據丟失,主從數據不一致的狀況,見如下分析:
MySQL兩階段提交過程:
a.準備階段(transaction prepare):事務SQL語句先寫入redo log buffer,而後作一個事務準備標記,再將log buffer中的數據刷新到redo log.
b.提交階段(commit):將事務產生的binlog寫入文件,刷入磁盤。
再在redo log中作一個事務提交的標記,並把binlog寫成功的標記也一併寫入red log文件。
結合如下兩場景分析兩階段如何保持數據庫的一致性:
Sense one:
準備階段,redo log刷新到磁盤了,可是binlog寫盤前發生了MySQL實例crash,這是會發生怎麼的操做呢?
即便redo log寫盤成功了,但因爲binlog未寫入成功,咱們須要執行回滾操做來保證數據的一致性。
Sense two:
提交階段,binlog寫盤成功了,此時MySQL實例發生crash,此時binlog已經確保寫成功了,咱們在重啓實例進行恢復時,只須要讓redo log重作一次就能夠了。
總結一下:
其實只要binlog寫入完成,則在主從複製環境中,都會正常完成事務。
最後看一下髒頁的刷新條件:
(1)重作日誌ib_logfile文件寫滿後,在切換的過程當中會執行checkpoint,會觸發髒頁的刷新。
(2)經過innodb_max_dirty_pages_pct參數的值控制。該參數是指在buffer pool中dirty page所佔的百分比,達到設置的值,就會觸發髒頁的刷新。
(3)由innodb_adaptive_flushing參數控制。