文档首页 > > 最佳实践> MySQL> innodb_flush_log_at_trx_commit和sync_binlog参数详解

innodb_flush_log_at_trx_commit和sync_binlog参数详解

分享
更新时间:2020/06/20 GMT+08:00

“innodb_flush_log_at_trx_commit”“sync_binlog”两个参数是控制MySQL磁盘写入策略以及数据安全性的关键参数。当两个参数为不同值时,在性能,安全角度下会产生不同的影响。

表1 参数说明

参数名称

允许值

描述

innodb_flush_log_at_trx_commit

0, 1, 2

当重新安排并批量处理与提交相关的I/O操作时,可以控制提交操作在严格遵守ACID合规性和高性能之间的平衡。当值设为0时,每秒把事务日志缓存区的数据写入日志文件并刷新到磁盘;当设为默认值1时,是为了保证完整的ACID,每次提交事务时,把事务日志从缓存区写到日志文件中,并刷新日志文件的数据到磁盘上;如果设为2,每次提交事务都会把事务日志从缓存区写入日志文件,大约每隔一秒会刷新到磁盘。

sync_binlog

0~4,294,967,295

同步binlog(MySQL持久化到硬盘,或依赖于操作系统)。

参数解析

innodb_flush_log_at_trx_commit

  • 0:日志缓存区将每隔一秒写到日志文件中,并且将日志文件的数据刷新到磁盘上。该模式下在事务提交的时候,不会主动触发写入磁盘的操作;
  • 1:每次事务提交时MySQL都会把日志缓存区的数据写入日志文件中,并且刷新到磁盘中,该模式为系统默认;
  • 2:每次事务提交时MySQL都会把日志缓存区的数据写入日志文件中,但是并不会同时刷新到磁盘上。该模式下,MySQL会每秒执行一次刷新磁盘操作;
    • 当设置为0,该模式速度最快,但不太安全,mysqld进程的崩溃会导致上一秒钟所有事务数据的丢失;
    • 当设置为1,该模式是最安全的,但也是最慢的一种方式。在mysqld服务崩溃或者服务器主机宕机的情况下,日志缓存区只有可能丢失最多一个语句或者一个事务;
    • 当设置为2,该模式速度较快,也比0安全,只有在操作系统崩溃或者系统断电的情况下,上一秒钟所有事务数据才可能丢失;

sync_binlog=1 or N:

默认情况下,并不是每次写入时都将binlog日志文件与磁盘同步。因此如果操作系统或服务器崩溃,有可能binlog中最后的语句丢失。

为了防止这种情况,你可以使用“sync_binlog”全局变量(1是最安全的值,但也是最慢的),使binlog在每N次binlog日志文件写入后与磁盘同步。

推荐配置组合

表2 配置组合

innodb_flush_log_at_trx_commit

sync_binlog

描述

1

1

适合数据安全性要求非常高,而且磁盘写入能力足够支持业务。

1

0

适合数据安全性要求高,磁盘写入能力支持业务不足,允许备库落后或无复制。

2

0/N(0<N<100)

适合数据安全性要求低,允许丢失一点事务日志,允许复制延迟。

0

0

磁盘写能力有限,无复制或允许复制延迟较长。

  • “innodb_flush_log_at_trx_commit”“sync_binlog”两个参数设置为1的时候,安全性最高,写入性能最差。在mysqld服务崩溃或者服务器主机宕机的情况下,日志缓存区只有可能丢失最多一个语句或者一个事务。但是会导致频繁的磁盘写入操作,因此该模式也是最慢的一种方式。
  • 当sync_binlog=N(N>1 ),innodb_flush_log_at_trx_commit=2时,在当前模式下MySQL的写操作才能达到最高性能。
分享:

    相关文档

    相关产品

文档是否有解决您的问题?

提交成功!

非常感谢您的反馈,我们会继续努力做到更好!

反馈提交失败,请稍后再试!

*必选

请至少选择或填写一项反馈信息

字符长度不能超过200

提交反馈 取消

如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨

智能客服提问云社区提问