mysql 參數 Innodb_flush_log_at_trx_commit 和 sync_binlog

1. Innodb_flush_log_at_trx_commit  

爲了控制redo log的寫入策略,InnoDB提供了innodb_flush_log_at_trx_commit參數,它有三種可能取值:

  1. 設置爲0的時候,表示每次事務提交時都只是把redo log留在redo log buffer中;    每秒調用 flush + fsync 刷到磁盤

  2. 設置爲1的時候,表示每次事務提交時都將redo log直接持久化到磁盤;

  3. 設置爲2的時候,表示每次事務提交時都只是把redo log寫到page cache。 每秒執行一次 flush(刷到磁盤)操

InnoDB有一個後臺線程,每隔1秒,就會把redo log buffer中的日誌,調用write寫到文件系統的page cache,然後調用fsync持久化到磁盤

2.sync_binlog

write,指的就是指把日誌寫入到文件系統的page cache,並沒有把數據持久化到磁盤,所以速度比較快。

fsync,纔是將數據持久化到磁盤的操作。一般情況下,我們認爲fsync才佔磁盤的IOPS

write 和fsync的時機,是由參數sync_binlog控制的:

  1. sync_binlog=0的時候,表示每次提交事務都只write,不fsync;  默認值  由操作系統決定 fsync

  2. sync_binlog=1的時候,表示每次提交事務都會執行fsync;

  3. sync_binlog=N(N>1)的時候,表示每次提交事務都write,但累積N個事務後才fsync。

在出現IO瓶頸的場景裏,將sync_binlog設置成一個比較大的值,可以提升性能。在實際的業務場景中,考慮到丟失日誌量的可控性,一般不建議將這個參數設成0,比較常見的是將其設置爲100~1000中的某個數值。

但是,將sync_binlog設置爲N,對應的風險是:如果主機發生異常重啓,會丟失最近N個事務的binlog日誌。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章