mysql 5.7半同步复制需主从分别安装对应插件(rpl_semi_sync_master/rpl_semi_sync_slave)、显式启用参数、重启从库io线程三步缺一不可;仅改配置或只装插件无法生效,必须验证show plugins状态为active且show status中各rpl_semi_sync_*值均为on且clients≥1。

MySQL 5.7 的半同步复制不是靠改几个配置就能自动生效的,必须主从分别安装插件、显式启用、再重启 IO 线程,缺一不可。只改 rpl_semi_sync_master_enabled = ON 却没装插件,状态永远是 OFF。
确认插件是否已安装并处于 ACTIVE 状态
半同步插件不会随 MySQL 启动自动加载,必须手动 INSTALL PLUGIN。只看配置文件或 SHOW VARIABLES 没用,得查实际运行状态:
- 在主库执行
SHOW PLUGINS LIKE 'rpl_semi_sync_master';,状态必须是ACTIVE,不能是DISABLED或查不到 - 在从库执行
SHOW PLUGINS LIKE 'rpl_semi_sync_slave';,同样要求状态为ACTIVE - 如果缺失,先确认
SELECT @@plugin_dir;下是否存在semisync_master.so(主库)和semisync_slave.so(从库);某些 Docker 镜像或精简版会删掉这两个文件,需手动补入 - 主库装
rpl_semi_sync_master,从库装rpl_semi_sync_slave——装反或只装一边,直接失效
关键参数必须动态 SET GLOBAL 或写进 my.cnf 并重启
插件装好只是第一步,四个核心参数不设对,半同步逻辑根本不会触发:
-
rpl_semi_sync_master_enabled = ON(主库),rpl_semi_sync_slave_enabled = ON(从库):仅靠INSTALL PLUGIN不会自动开启,必须显式设为ON -
rpl_semi_sync_master_timeout = 10000(毫秒):默认 100000(100 秒),太长会导致主库长时间卡住;建议调成 10 秒,超时后自动降级为异步,避免业务阻塞 -
rpl_semi_sync_master_wait_for_slave_count = 1:默认就是 1,表示只要 1 个从库确认即可提交;除非你真有多个从库且强依赖全部确认,否则别改成大于 1 - 改完立即执行
SET GLOBAL生效,或写入[mysqld]段后重启 mysqld;仅写配置不执行 SET 或不重启,变量值不会变
从库必须重启 IO 线程才能激活半同步通信
很多故障都卡在这一步:插件装了、参数也设了,但 Rpl_semi_sync_slave_status 始终是 OFF。原因就是从库没重载复制通道:
- 从库执行
STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;,不是STOP SLAVE; START SLAVE; - 只停启 SQL_THREAD 不够,ACK 通信由 IO_THREAD 负责,必须让它重新握手建立半同步通道
- 若从库启用了 GTID,还需确认
log_slave_updates = ON,否则 relay log 不写 binlog,主库收不到 ACK - 防火墙要放行主从之间的 3306 端口,且
rpl_semi_sync_master_clients在主库上必须 > 0,否则说明从库根本没连上来
验证状态时要看 Rpl_semi_sync_* STATUS,不是 VARIABLES
SHOW VARIABLES LIKE 'rpl_semi_sync%' 只显示配置值,真正反映运行状态的是 SHOW STATUS:
- 主库查
SHOW STATUS LIKE 'Rpl_semi_sync_master_status';,结果必须是ON(不是1) - 主库查
SHOW STATUS LIKE 'Rpl_semi_sync_master_clients';,值必须 ≥ 1 - 从库查
SHOW STATUS LIKE 'Rpl_semi_sync_slave_status';,结果必须是ON - 任意一个为
OFF,就说明半同步未真正工作;此时写入仍是异步,数据一致性无保障
最容易被忽略的是 rpl_semi_sync_master_wait_point:MySQL 5.7 默认是 AFTER_SYNC(无损模式),但如果有人手动设成 AFTER_COMMIT,主库 crash 时仍可能丢事务。别只盯着“开了半同步”,得确认它开的是哪种语义。











