1. Innodb_flush_log_at_trx_commit
爲了控制redo log的寫入策略,InnoDB提供了innodb_flush_log_at_trx_commit參數,它有三種可能取值:性能
-
設置爲0的時候,表示每次事務提交時都只是把redo log留在redo log buffer中; 每秒調用 flush + fsync 刷到磁盤spa
-
設置爲1的時候,表示每次事務提交時都將redo log直接持久化到磁盤;操作系統
-
設置爲2的時候,表示每次事務提交時都只是把redo log寫到page cache。 每秒執行一次 flush(刷到磁盤)操做線程
InnoDB有一個後臺線程,每隔1秒,就會把redo log buffer中的日誌,調用write寫到文件系統的page cache,而後調用fsync持久化到磁盤日誌
2.sync_binlog
write,指的就是指把日誌寫入到文件系統的page cache,並無把數據持久化到磁盤,因此速度比較快。事務
fsync,纔是將數據持久化到磁盤的操做。通常狀況下,咱們認爲fsync才佔磁盤的IOPSit
write 和fsync的時機,是由參數sync_binlog控制的:innodb
-
sync_binlog=0的時候,表示每次提交事務都只write,不fsync; 默認值 由操做系統決定 fsyncclass
-
sync_binlog=1的時候,表示每次提交事務都會執行fsync;後臺
-
sync_binlog=N(N>1)的時候,表示每次提交事務都write,但累積N個事務後才fsync。
在出現IO瓶頸的場景裏,將sync_binlog設置成一個比較大的值,能夠提高性能。在實際的業務場景中,考慮到丟失日誌量的可控性,通常不建議將這個參數設成0,比較常見的是將其設置爲100~1000中的某個數值。
可是,將sync_binlog設置爲N,對應的風險是:若是主機發生異常重啓,會丟失最近N個事務的binlog日誌。