MySQL參數: innodb_flush_log_at_trx_commit和sync_binlog
innodb_flush_log_at_trx_commit
和sync_binlog
是MySQL控制磁盤寫入策略的重要參數.
-
innodb_flush_log_at_trx_commit
-
當
innodb_flush_log_at_trx_commit=0
時, log buffer將每秒一次地寫入log file, 並且log file的flush(刷新到disk)操作同時進行. 此時, 事務提交是不會主動觸發寫入磁盤的操作. -
當
innodb_flush_log_at_trx_commit=1
時(默認), 每次事務提交時, MySQL會把log buffer的數據寫入log file, 並且將log file flush(刷新到disk)中去. -
當
innodb_flush_log_at_trx_commit=2
時, 每次事務提交時, MySQL會把log buffer的數據寫入log file, 但不會主動觸發flush(刷新到disk)操作同時進行. 然而, MySQL會每秒執行一次flush(刷新到disk)操作.然而, 每秒flush並不能確保100%每秒發生, 因為os調度問題.
默認的1可以獲得更好地數據安全, 但性能會打折扣. 不過非1時, 在遇到crash可能會丟失1秒的事務; 設置為0時, 任何mysqld進程crash會丟失上1秒的事務; 設置為2時, 任何os crash或者機器掉電會丟失上1秒的事務; InnoDB的crash recovery運行時會忽略這些數據.
-
-
sync_binlog

-
當
sync_binlog=0
時(默認), 如os刷新其他文件的機制一樣, MySQL不會刷新log buffer到disk中去, 而是依賴os機制刷新log buffer數據到binary log中. -
當
sync_binlog=1
時, MySQL在寫1次二進制日志binary log時, 會使用fdatasync()函數將二進制binary log同步到disk中去.(安全性最高的配置) -
當
sync_binlog=N(N>1)
時, MySQL在寫N次二進制日志binary log時, 會使用fdatasync()函數將二進制binary log同步到disk中去.
-
當兩個參數設置為雙1的時候, 寫入性能最差. 當sync_binlog=N(N>1) && innodb_flush_log_at_trx_commit=2, MySQL的寫操作才能達到最高性能.
ref:
https://dev.mysql.com/doc/refman/5.5/en/innodb-parameters.html