升级mysql后半同步复制大概率降级为异步,根本原因是插件名、so文件及变量名随版本变更:5.7/8.0.25用rpl_semi_sync_master/slave和semisync_master.so,8.0.26+必须改用rpl_semi_sync_source/replica和semisync_source.so;需重装插件、重启从库io线程、更新my.cnf参数并验证rpl_semi_sync_source_clients≥1。

升级 MySQL 时半同步复制大概率会降级,这不是配置错了,而是插件名、SO 文件、加载时机全变了——必须按版本重装、重启 IO 线程、验证状态,否则 Rpl_semi_sync_master_status 一直为 OFF。
MySQL 5.7 → 8.0.25 升级后半同步失效的典型现象
主库执行 SHOW STATUS LIKE 'Rpl_semi_sync_master_status' 返回 OFF,但从库 SHOW SLAVE STATUS\G 显示一切正常;SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%semi%' 查不到插件,或状态是 DISABLED。这不是网络问题,也不是超时设置不对,而是插件根本没加载成功。
- 5.7 的插件名是
rpl_semi_sync_master/rpl_semi_sync_slave,8.0.25 及之前仍兼容 - 8.0.26+ 彻底废弃旧名,必须用
rpl_semi_sync_source和rpl_semi_sync_replica - SO 文件名也变了:5.7/8.0.25 是
semisync_master.so,8.0.26+ 是semisync_source.so - 升级后
plugin_dir下可能残留旧 SO 文件,但新版插件找不到对应文件,加载静默失败
升级后必须重走安装流程,不能只改配置
升级不是“配置继承”,插件要重新 INSTALL,且顺序不能错。尤其从库,插件必须在 IO 线程启动前就位,否则握手阶段错过,永远进不了半同步。
- 主库先查版本:
SELECT VERSION(),再决定插件名 - 主库执行:
INSTALL PLUGIN rpl_semi_sync_source SONAME 'semisync_source.so'(8.0.26+)或INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'(≤8.0.25) - 从库同样查版本,再执行对应
INSTALL PLUGIN命令,注意从库用rpl_semi_sync_replica(8.0.26+)或rpl_semi_sync_slave(≤8.0.25) - 从库必须立刻执行:
STOP SLAVE IO_THREAD; START SLAVE IO_THREAD,仅SET GLOBAL rpl_semi_sync_replica_enabled = 1不生效 - 验证两库都返回
ACTIVE:SHOW PLUGINS LIKE '%semi%'
my.cnf 配置项也要跟着版本更新
配置文件里写的变量名和值,在新版本里可能已弃用或语义变更。写错会导致启动报错或插件不加载。
- 8.0.26+ 必须用
rpl_semi_sync_source_enabled = 1替代rpl_semi_sync_master_enabled = 1 - 从库对应改为
rpl_semi_sync_replica_enabled = 1,不是slave -
rpl_semi_sync_master_wait_point在 8.0.26+ 已移至 source 插件下,主库设rpl_semi_sync_source_wait_point = 'AFTER_SYNC' -
rpl_semi_sync_master_timeout同样改为rpl_semi_sync_source_timeout - 所有参数必须写在
[mysqld]段下,且重启 mysqld 或动态 SET 才生效
最容易被忽略的降级诱因:GTID + 升级后 IO 线程未重建
如果原环境启用了 GTID,升级后直接 START SLAVE,IO 线程会沿用旧连接上下文,半同步握手根本不会触发——因为插件是在连接建立时协商的,而升级后的插件还没加载进去。
- 升级后从库第一步不是 START SLAVE,而是先装插件、设变量、再
STOP SLAVE IO_THREAD - 确保
CHANGE MASTER TO MASTER_AUTO_POSITION = 1已存在,再START SLAVE IO_THREAD - 检查从库日志,确认出现
Start semi-sync replication to master,而不是只有Started replication I/O thread - 主库查
Rpl_semi_sync_source_clients,值 ≥1 才算真正接入;若为 0,说明从库压根没完成半同步握手
升级后半同步是否启用,不能只看配置文件有没有那几行,也不能只信 SHOW SLAVE STATUS 的表面正常——必须查插件状态、查变量值、查客户端数、查 IO 线程日志。任何一环断掉,它就在你眼皮底下悄悄退化成异步。











