innodb_flush_log_at_trx_commit
和sync_binlog
是MySQL控制磁盤寫入策略的重要參數.html
當innodb_flush_log_at_trx_commit=0
時, log buffer將每秒一次地寫入log file, 而且log file的flush(刷新到disk)操做同時進行. 此時, 事務提交是不會主動觸發寫入磁盤的操做.mysql
當innodb_flush_log_at_trx_commit=1
時(默認), 每次事務提交時, MySQL會把log buffer的數據寫入log file, 而且將log file flush(刷新到disk)中去.sql
當innodb_flush_log_at_trx_commit=2
時, 每次事務提交時, MySQL會把log buffer的數據寫入log file, 但不會主動觸發flush(刷新到disk)操做同時進行. 然而, MySQL會每秒執行一次flush(刷新到disk)操做.安全
然而, 每秒flush並不能確保100%每秒發生, 由於os調度問題.async
默認的1能夠得到更好地數據安全, 但性能會打折扣. 不過非1時, 在遇到crash可能會丟失1秒的事務; 設置爲0時, 任何mysqld進程crash會丟失上1秒的事務; 設置爲2時, 任何os crash或者機器掉電會丟失上1秒的事務; InnoDB的crash recovery運行時會忽略這些數據.函數
![](http://images2015.cnblogs.com/blog/748358/201603/748358-20160327131735761-1330837796.png)
當sync_binlog=0
時(默認), 如os刷新其餘文件的機制同樣, MySQL不會刷新log buffer到disk中去, 而是依賴os機制刷新log buffer數據到binary log中.性能
當sync_binlog=1
時, MySQL在寫1次二進制日誌binary log時, 會使用fdatasync()函數將二進制binary log同步到disk中去.(安全性最高的配置)3d
當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的寫操做才能達到最高性能.code
ref:
https://dev.mysql.com/doc/refman/5.5/en/innodb-parameters.html