必须在主库启用rpl_semi_sync_master_enabled、从库启用rpl_semi_sync_slave_enabled(5.7/8.0.25及之前)或rpl_semi_sync_source_enabled/rpl_semi_sync_replica_enabled(8.0.26+),插件安装后还需set global开启变量并验证show status中对应rpl_semi_sync_*_status为on才真正生效。

rpl_semi_sync_master_enabled 必须在主库启用,rpl_semi_sync_slave_enabled 必须在从库启用,否则半同步复制不会生效——哪怕插件已安装、配置文件写了参数,只要对应变量没设为 ON,实际就是异步复制。
INSTALL PLUGIN 命令在不同 MySQL 版本中不兼容
MySQL 5.7 和 8.0.25 及之前版本用的是 rpl_semi_sync_master / rpl_semi_sync_slave;
MySQL 8.0.26+(含 8.1)改名了:主库插件是 rpl_semi_sync_source,从库是 rpl_semi_sync_replica。
- 错误示例(8.0.26+ 环境执行旧命令):
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'→ 报错ERROR 1126 (HY000): Can't open shared library - 正确做法:先查版本
SELECT VERSION();
再匹配插件名:- ≤ 8.0.25:用
semisync_master.so和semisync_slave.so - ≥ 8.0.26:用
semisync_source.so和semisync_replica.so
- ≤ 8.0.25:用
- 插件文件路径通常为:
/usr/lib64/mysql/plugin/或/usr/local/mysql/lib/plugin/,需确认存在再安装
SET GLOBAL 开启后仍显示 OFF?检查这三点
常见现象:执行了 SET GLOBAL rpl_semi_sync_master_enabled = 1;,但 SHOW STATUS LIKE 'Rpl_semi_sync_master_status'; 返回 OFF。
- 插件未真正加载成功:
SELECT * FROM mysql.plugin WHERE name LIKE '%semi%';应有对应记录;若为空,说明INSTALL PLUGIN失败或路径不对 - 主从复制链未就绪:
半同步依赖底层异步复制正常运行,SHOW SLAVE STATUS\G中Slave_IO_Running和Slave_SQL_Running必须都是Yes - 从库未重启 IO 线程(仅限旧版 MySQL):
STOP SLAVE IO_THREAD;→START SLAVE IO_THREAD;是必须步骤;新版(8.0.26+)自动接管,但旧版不执行这步,rpl_semi_sync_slave_enabled不生效
超时降级行为不可忽略,rpl_semi_sync_master_timeout 默认值很危险
默认超时是 10000 毫秒(10 秒),意味着主库会卡住最多 10 秒才降级。生产环境往往不能接受这种延迟。
- 建议设为 1000–3000 毫秒(1–3 秒),根据网络 RTT 调整
- 降级后主库不报错、不告警,只默默切回异步——你得靠监控
Rpl_semi_sync_master_no_tx和Rpl_semi_sync_master_yes_tx差值来发现 - 降级不是永久的:只要有一个从库恢复响应并 ACK,主库自动切回半同步;但期间写入的数据已按异步方式落盘,无法回溯
半同步复制真正的难点不在配置步骤,而在于“它看起来开了,其实没开”——状态变量容易被误读,插件名随版本漂移,IO 线程重启时机隐蔽,超时行为又静默发生。线上启用前,务必用 INSERT + STOP SLAVE IO_THREAD + 观察客户端阻塞时间,实测验证是否真生效。











