必须同时设置sync_binlog=1和innodb_flush_log_at_trx_commit=1才构成真正“双一”,缺一则崩溃时数据仍可能丢失;需通过show variables确认运行值而非仅看配置文件,且二者均为静态参数,修改后必须重启mysqld生效。

必须同时设置 sync_binlog=1 和 innodb_flush_log_at_trx_commit=1,缺一不可;否则“双一”只是名义上的,数据仍可能在崩溃时丢失。
确认 MySQL 8.0 实例当前刷盘状态
先查实际值,别信配置文件里写了就算生效。MySQL 启动后只读取一次配置,改了没重启等于白改。
- 执行
show variables like 'sync_binlog';—— 若返回值不是1,Binlog 不保证每事务落盘 - 执行
show variables like 'innodb_flush_log_at_trx_commit';—— 若返回值不是1,Redo Log 可能仅写入 OS 缓存 - 执行
show variables like '%log_bin%';确保log_bin是ON;若为OFF,sync_binlog直接无效
在 my.cnf 的 [mysqld] 段中正确添加双一参数
Windows 下是 my.ini,Linux 下通常是 /etc/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf。路径不重要,关键是要写在 [mysqld] 下方,且不能拼错参数名。
-
sync_binlog=1—— 必须是整数1,不能是ON、True或空格 -
innodb_flush_log_at_trx_commit=1—— 注意是下划线,不是短横或驼峰;值只能是0、1或2,只有1满足双一 - 两项都必须在同一个
[mysqld]段内,不能一个在[client]、一个在[mysql]
示例片段:
[mysqld] server-id=1 log-bin=mysql-bin binlog-format=ROW sync_binlog=1 innodb_flush_log_at_trx_commit=1
重启后验证是否真正生效
很多人改完配置就以为完事了,但 MySQL 不会热加载这两个参数——它们属于静态参数,必须重启 mysqld 进程。
- Windows:用管理员权限运行
net stop mysql→net start mysql(服务名以实际为准) - Linux:用
systemctl restart mysqld或service mysql restart,别只 kill 进程 - 重启后再次执行那两条
show variables查询,确认返回值均为1 - 额外建议:执行一条简单事务(如
begin; insert into t values(1); commit;),再立刻断电模拟崩溃(测试环境),验证能否完整恢复 —— 这才是双一的终极检验
最容易被忽略的是:即使两个参数都设为 1,若磁盘本身启用了 write cache(尤其某些 SATA SSD 或 RAID 卡默认开启),操作系统或固件仍可能延迟落盘。生产环境务必确认存储层也禁用 write cache,或使用带掉电保护(PLP)的企业级 SSD。











