必须主从分别安装对应插件(主库rpl_semi_sync_master/源端rpl_semi_sync_source,从库rpl_semi_sync_slave/副本端rpl_semi_sync_replica),再启用参数并配置relay-log和read_only,缺一不可;仅改参数或只装一边插件,复制仍为异步。

半同步复制插件必须在主从两端**分别安装对应插件文件**,只装主库或只配参数,复制仍是异步的——这是最常被忽略的前提。
主库必须先 INSTALL PLUGIN 再启用配置
MySQL 8.0 默认不加载半同步插件,rpl_semi_sync_master_enabled=ON 这类变量只有在插件已安装的前提下才被识别。如果先在 /etc/my.cnf 里写好配置再启动 mysqld,会直接报错退出,日志中出现类似 Unknown variable 'rpl_semi_sync_master_enabled' 的错误。
- 登录主库 MySQL,执行:
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; - 验证是否成功:
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'rpl_semi_sync_master';—— 状态必须为ACTIVE - 之后再编辑配置文件,添加:
rpl_semi_sync_master_enabled = ON和rpl_semi_sync_master_timeout = 3000(单位毫秒,不建议设为 0)
从库要装 rpl_semi_sync_slave 插件,且不能漏掉三项关键配置
仅执行 INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; 是不够的。从库必须同时满足:插件已装、relay-log 已启用、read_only = ON,否则 Rpl_semi_sync_slave_status 永远是 OFF。
- 插件名必须严格匹配:
semisync_slave.so(不是semisync_master.so) -
relay-log必须显式配置,例如:relay-log = relay-bin;仅靠默认值不生效 -
read_only = ON是强制要求,防止误写导致 GTID 冲突或数据漂移 - 插件启用后,需执行
START SLAVE;(不是仅START SLAVE IO_THREAD)
MySQL 8.0.26+ 版本插件名已变更,别用错
如果你用的是 MySQL 8.0.26 或更高版本(当前最新稳定版已是 8.0.34),旧插件名会失败。必须改用新命名体系:
- 主库插件:改用
INSTALL PLUGIN rpl_semi_sync_source SONAME 'semisync_source.so'; - 从库插件:改用
INSTALL PLUGIN rpl_semi_sync_replica SONAME 'semisync_replica.so'; - 对应状态变量也变了:
Rpl_semi_sync_source_status和Rpl_semi_sync_replica_status - 配置项名保持不变(
rpl_semi_sync_source_enabled仍可写作rpl_semi_sync_master_enabled兼容,但推荐统一用新前缀)
最容易被跳过的其实是 relay-log 显式配置和 read_only 开启——这两个不满足,哪怕插件装了、rpl_semi_sync_slave_enabled = ON 也写了,SHOW STATUS LIKE 'Rpl_semi_sync%' 里从库状态永远是 OFF。











