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运行时会忽略这些数据.函数

当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