怎样在MySQL8.0中配置双一机制保障事务持久性

小磊吖_4194

小磊吖_4194

2026-10-05

584人浏览

原创

“双一机制”指sync_binlog=1且innodb_flush_log_at_trx_commit=1,二者缺一不可:仅前者为1而后者非1会导致主从不一致;仅后者为1而前者非1则崩溃后binlog丢失致复制中断;两者均为1才满足crash-safe replication与gtid稳定运行前提,但性能显著下降。

怎样在mysql8.0中配置双一机制保障事务持久性

MySQL 8.0 中没有“双一机制”这个官方术语,它其实是民间对 sync_binlog = 1 和 innodb_flush_log_at_trx_commit = 1 这两个参数的合称。只有这两个值同时为 1,才能在崩溃后最大程度保证已提交事务不丢失——但代价是写性能明显下降。

确认 innodb_flush_log_at_trx_commit=1(InnoDB 日志刷盘策略)

这个参数控制 InnoDB 的 redo log 是否在每次事务提交时强制刷到磁盘:

  • 值为 1:最安全。每次 COMMIT 都触发 fsync(),崩溃后不会丢已提交事务
  • 值为 0 或 2:都可能丢事务。0 是每秒刷一次,2 是写入 OS 缓存但不 fsync,断电即丢
  • 检查命令:SHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit';,输出必须是 1
  • 动态设置无效(只读变量),必须写入 [mysqld] 段并重启;或用 SET PERSIST(需权限)

确认 sync_binlog=1(binlog 刷盘策略)

这个参数决定 binlog 是否同步写入磁盘,和上一个参数配合才构成完整持久性保障:

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载
  • 值为 1:每次事务提交都 fsync binlog 文件,避免 binlog 缓存在 OS 中未落盘
  • 值为 0:依赖 OS 刷盘,崩溃可能丢 binlog,导致主从不一致或恢复失败
  • 值为 N>1:每 N 次提交刷一次,中间 crash 会丢最多 N-1 个事务的 binlog
  • 检查命令:SHOW VARIABLES LIKE 'sync_binlog';,输出必须是 1
  • 可动态设置:SET GLOBAL sync_binlog = 1;,但建议写入配置文件并重启,避免重启后失效

为什么两个都得是 1?缺一不可

单独设其中一个为 1 不够,因为 MySQL 提交事务是两阶段过程(prepare + commit),需要两个日志协同:

  • 若 innodb_flush_log_at_trx_commit=1 但 sync_binlog=0:redo log 落盘了,但 binlog 还卡在 OS 缓存里。崩溃后 InnoDB 可恢复数据,但 binlog 缺失 → 主从复制中断、备份无法按位点恢复
  • 若 sync_binlog=1 但 innodb_flush_log_at_trx_commit=0:binlog 写全了,但 redo log 没刷盘。崩溃后 MySQL 启动时回滚该事务(因 redo 无记录),但从库已执行 → 主从数据不一致
  • 两者都是 1 才满足“Crash-Safe Replication”前提,也是 GTID 复制稳定运行的基础

性能影响与折中方案

两个 1 带来的是磁盘 I/O 压力倍增,尤其在高并发小事务场景下:

  • 不要在 SSD 性能差或 I/O 已饱和的机器上盲目开启,先压测 TPS 下降幅度
  • 如果业务允许极小概率丢事务(如日志类、埋点类),可考虑 innodb_flush_log_at_trx_commit=2 + sync_binlog=1,但必须接受断电丢最近 1 秒事务的风险
  • sync_binlog=1 对 binlog 文件所在磁盘有强依赖,务必确保该路径不在系统盘或低速 RAID 0 上
  • 启用 binlog_group_commit_sync_delay(8.0.26+)可缓解压力:允许最多延迟 100 微秒攒一批事务一起刷盘,微损一致性换吞吐

真正难的不是配这两个 1,而是确认它们生效后,你的存储设备是否真能扛住持续 fsync。很多线上故障不是参数没设对,而是磁盘响应超时导致 MySQL 主动 kill 自己的写线程。上线前务必用 fio 测过目标路径的 fsync 延迟稳定性。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

mysql

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

4003

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

851

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1049

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

5861

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

2783

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

5840

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

7761

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1050

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

932

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 178人学习

使用phpenv集成环境安装极致CMS
使用phpenv集成环境安装极致CMS

共2课时 | 285人学习