MySQL "双1" 参数详解

MySQL
前言

MySQL 数据库中有两个非常重要的参数,一个是innodb_flush_log_at_trx_commit,另外一个是sync_binlog,这两个参数称之为双一参数,前者控制了redo log 的刷盘机制,后者控制了binlog 的刷盘机制。

这两个参数取值不同时,会影响数据库性能以及安全。

参数名称允许值
innodb_flush_log_at_trx_commit0, 1, 2
sync_binlog0,1, N
sync_binlog
  • 0:binlog 不刷盘,依赖于操作系统的刷盘机制,在断电或者是操做系统崩溃的情况下,这些事务将全部丢失。

  • 1:这是最安全的方式,binlog 在 binlog 组提交的 sync 阶段都进行刷盘操作,在断电或操作系统崩溃的情况下,二进制日志中丢失的事务仅处于准备状态,在恢复的时候直接回滚掉。

  • N:binlog 将在 N 次 sync 队列形成后进行 sync 刷盘。

innodb_flush_log_at_trx_commit
  • 0 :log buffer每秒写入log file一次(数据库),并且logfile的磁盘flush刷新同步进行(系统),这种情况下,log buffer仅仅在master thread 的每秒循环中执行

  • 1: 每次事务提交都会进行log buffer的写入log file(数据库),并且flush到磁盘中(系统)

  • 2:每次事务提交都会进行log buffer的写入到file system buffer(系统缓存),但是flush操作是每秒进行一次(系统)

如下图:

alt

需要注意的是:

  • 当设置为0时,速度最快,安全性最差,mysqld进程的崩溃最多会导致上一秒钟所有事务数据的丢失。

  • 当设置为1,该模式是最安全的,对数据库的性能影响也最大,即使宕机也不会丢失事务。

  • 当设置为2,该模式速度较快,较取值为0情况下更安全,mysqld crash不会丢失事务,但宕机则可能丢失事务。

最佳实践

您可以按照您的业务场景,根据下表来选择最适合您的配置。

innodb_flush_log_at_trx_commitsync_binlog描述
11适用于对数据安全性要求非常高,同时磁盘有足够的写入能力的场景。这种模式下性能最差
10适用于对数据安全性要求高,但是磁盘写入能力有限的场景。
2N对数据安全性要求低,此时性能最佳
00对数据安全性要求不高,应用需要较快的写入能力

如果您有其他问题,欢迎您联系火山引擎技术支持服务

1045
1
0
0
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论