sync_binlog和innodb_flush_log_at_trx_commit解析

神諭丶發表於2016-03-31
sync_binlog:

其值預設為0,範圍為0~4294967295(mysql 5.6)
〇 為0時,即mysqld不去控制磁碟的同步,而是等待作業系統的fdatasync從記憶體flush到磁碟。(與作業系統同步)。在複製結構中,dump執行緒會在flush階段進行binlog傳輸。
〇 最安全的設定為1,在開啟了autocommit的情況下,如果mysqld或者os此時crash掉,會至多遺失一個事務。(同時也是最慢的設定)。在複製結構中,dump執行緒會在sync階段進行binlog傳輸。
〇 當值為範圍內其他值時,如100,即意味著mysql在寫100次binlog時,再將快取刷到磁碟。在複製結構中,dump執行緒會在flush階段進行binlog傳輸。

將該值設定為稍大的情況下,可以提高tps,並且需要使用battery-backed cache防止異常斷電。




innodb_flush_log_at_trx_commit:
(控制REDO log刷盤策略)
其預設值為1,其他可取值為0和2。
〇 當為1時,每個事務提交,將會使log buffer的內容寫到log file中,同時將被flush到磁碟,這也是最安全的做法。可以完全遵從ACID。(the contents of the InnoDB log buffer are written out to the log file at each transaction commit and the log file is flushed to disk.)
〇 當為0時,每個事務提交,會寫入mysqld自己的log buffer中,每隔1秒將log buffer的內容寫到log file中,然後flush到磁碟。
〇 當為2時,每個事務提交,就會被寫到log file(OS cache),但是log file每隔1秒才會被flush到磁碟,當作業系統crash或斷電時,此時至多丟失1秒的事務。


0和2的區別是,
為0時,mysqld或作業系統crash則會導致1秒內的事務被丟失。
為2時,當作業系統crash或斷電會導致1秒內的事務被丟失。

效能而言(由快至慢):
0>2>1
安全性而言(由好至差):
1>2>0



圖自:楊奇龍

此外,這兩個引數都是Dynamic Variable,修改其值不需要重啟mysqld。





參考文件:
〇 【MySQL】sync_binlog innodb_flush_log_at_trx_commit 淺析  —— 楊奇龍

〇 MySQL 5.6 Reference Manual Chapter 5 MySQL Server Administration sync_binlog & innodb_flush_log_at_trx_commit 


作者微信公眾號(持續更新)

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29773961/viewspace-2072954/,如需轉載,請註明出處,否則將追究法律責任。

相關文章