[MySQL] 参数: innodb_flush_log_at_trx_commit和sync_binlog

时间:2021-09-08 16:40:07

MySQL参数: innodb_flush_log_at_trx_commit和sync_binlog

innodb_flush_log_at_trx_commitsync_binlog是MySQL控制磁盘写入策略的重要参数.

  • innodb_flush_log_at_trx_commit

    [MySQL] 参数: innodb_flush_log_at_trx_commit和sync_binlog

    1. innodb_flush_log_at_trx_commit=0时, log buffer将每秒一次地写入log file, 并且log file的flush(刷新到disk)操作同时进行. 此时, 事务提交是不会主动触发写入磁盘的操作.

    2. innodb_flush_log_at_trx_commit=1时(默认), 每次事务提交时, MySQL会把log buffer的数据写入log file, 并且将log file flush(刷新到disk)中去.

    3. 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

      ![](http://images2015.cnblogs.com/blog/748358/201603/748358-20160327131735761-1330837796.png)
    1. sync_binlog=0时(默认), 如os刷新其他文件的机制一样, MySQL不会刷新log buffer到disk中去, 而是依赖os机制刷新log buffer数据到binary log中.

    2. sync_binlog=1时, MySQL在写1次二进制日志binary log时, 会使用fdatasync()函数将二进制binary log同步到disk中去.(安全性最高的配置)

    3. 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的写操作才能达到最高性能.

[MySQL] 参数: innodb_flush_log_at_trx_commit和sync_binlog


ref:

https://dev.mysql.com/doc/refman/5.5/en/innodb-parameters.html