MySQL 数据库中有两个非常重要的参数,一个是innodb_flush_log_at_trx_commit,另外一个是sync_binlog,这两个参数称之为双一参数,前者控制了redo log 的刷盘机制,后者控制了binlog 的刷盘机制。
这两个参数取值不同时,会影响数据库性能以及安全。
参数名称 | 允许值 |
---|---|
innodb_flush_log_at_trx_commit | 0, 1, 2 |
sync_binlog | 0,1, N |
-
0:binlog 不刷盘,依赖于操作系统的刷盘机制,在断电或者是操做系统崩溃的情况下,这些事务将全部丢失。
-
1:这是最安全的方式,binlog 在 binlog 组提交的 sync 阶段都进行刷盘操作,在断电或操作系统崩溃的情况下,二进制日志中丢失的事务仅处于准备状态,在恢复的时候直接回滚掉。
-
N:binlog 将在 N 次 sync 队列形成后进行 sync 刷盘。
-
0 :log buffer每秒写入log file一次(数据库),并且logfile的磁盘flush刷新同步进行(系统),这种情况下,log buffer仅仅在master thread 的每秒循环中执行
-
1: 每次事务提交都会进行log buffer的写入log file(数据库),并且flush到磁盘中(系统)
-
2:每次事务提交都会进行log buffer的写入到file system buffer(系统缓存),但是flush操作是每秒进行一次(系统)
如下图:
需要注意的是:
-
当设置为0时,速度最快,安全性最差,mysqld进程的崩溃最多会导致上一秒钟所有事务数据的丢失。
-
当设置为1,该模式是最安全的,对数据库的性能影响也最大,即使宕机也不会丢失事务。
-
当设置为2,该模式速度较快,较取值为0情况下更安全,mysqld crash不会丢失事务,但宕机则可能丢失事务。
您可以按照您的业务场景,根据下表来选择最适合您的配置。
innodb_flush_log_at_trx_commit | sync_binlog | 描述 |
---|---|---|
1 | 1 | 适用于对数据安全性要求非常高,同时磁盘有足够的写入能力的场景。这种模式下性能最差 |
1 | 0 | 适用于对数据安全性要求高,但是磁盘写入能力有限的场景。 |
2 | N | 对数据安全性要求低,此时性能最佳 |
0 | 0 | 对数据安全性要求不高,应用需要较快的写入能力 |
如果您有其他问题,欢迎您联系火山引擎技术支持服务