MySQL 8.0 半同步插件加载须按版本分界:8.0.26前用rpl_semi_sync_master/slave,8.0.26起必须用rpl_semi_sync_source/replica;INSTALL PLUGIN需匹配SO文件名与路径,且仅SQL命令有效,plugin-load参数已废弃;装插件后必须SET GLOBAL启用变量并验证SHOW STATUS中对应Rpl_semi_sync_*_status为ON才算生效。

MySQL 8.0 加载 semisync_master.so 插件前必须确认版本分界点
MySQL 8.0.26 是插件命名的硬分水岭,不是所有 8.0 都能用 rpl_semi_sync_master。低于 8.0.26 的版本(如 8.0.25、8.0.19)才支持 rpl_semi_sync_master 和 rpl_semi_sync_slave;8.0.26 及之后(含当前最新 8.4.7)已废弃旧名,必须改用 rpl_semi_sync_source 和 rpl_semi_sync_replica。直接沿用老命令会静默失败——INSTALL PLUGIN 不报错,但 SHOW PLUGINS 里状态是 DISABLED 或根本不出现在结果中。
查清版本最可靠的方式是登录 MySQL 后执行:
SELECT VERSION();
别信 rpm 包名或 mysqld --version 输出,有些厂商打包会篡改显示版本。
INSTALL PLUGIN 命令必须匹配 SO 文件实际路径和名称
semisync_master.so 这个文件名本身不绝对可靠。它取决于 MySQL 编译时的平台和插件构建方式。在 Rocky Linux 9 / CentOS 8 上,常见路径是 /usr/lib64/mysql/plugin/semisync_master.so;但如果你用的是 MySQL 官方二进制包,SO 文件可能在 lib/plugin/ 子目录下。如果 INSTALL PLUGIN 报错 Can't open shared library,八成是路径不对或文件缺失。
验证插件文件是否存在:
find /usr -name "semisync*.so" 2>/dev/null
常见可选值包括:
-
semisync_master.so(8.0.25 及更早) -
semisync_source.so(8.0.26+) -
semisync_slave.so(8.0.25 及更早) -
semisync_replica.so(8.0.26+)
注意:SONAME 参数只写文件名,不写路径;MySQL 会自动在 plugin_dir 指向的目录里找。
my.cnf 里不能用 plugin-load-add 加载半同步插件
很多文档抄来抄去写 plugin-load-add = semisync_master.so,这在 MySQL 8.0 是无效甚至危险的。8.0 起 plugin_load 系列参数已被标记为废弃,且半同步插件明确不支持通过该机制加载。你加了这行,MySQL 启动时可能报 warning,也可能直接忽略,但插件绝不会被激活。
唯一合法方式只有 SQL 命令:
- 主库(8.0.25 及更早):
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; - 主库(8.0.26+):
INSTALL PLUGIN rpl_semi_sync_source SONAME 'semisync_source.so'; - 从库对应换为
rpl_semi_sync_slave或rpl_semi_sync_replica
执行后立刻查:
SELECT PLUGIN_NAME, PLUGIN_STATUS, PLUGIN_TYPE FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%semi%';
必须看到 PLUGIN_STATUS = 'ACTIVE' 且 PLUGIN_TYPE = 'SEMISYNCHRONOUS_REPLICATION' 才算成功。
装完插件不等于半同步就启用了
插件装上只是第一步。@@rpl_semi_sync_master_enabled 这个变量默认是 OFF,SET GLOBAL 开启后也只影响运行时状态;更重要的是,它依赖底层插件已加载。如果插件没装好,SET GLOBAL 会立刻回退,日志里出现 Unknown variable 或无提示静默失败。
真正启用的标志只有一个:运行时状态变量为 ON。
- 主库看:
Rpl_semi_sync_master_status(8.0.25)或Rpl_semi_sync_source_status(8.0.26+) - 从库看:
Rpl_semi_sync_slave_status或Rpl_semi_sync_replica_status
这些值必须来自 SHOW STATUS LIKE 'Rpl_semi_sync%',而不是 SHOW VARIABLES。变量开了 ≠ 状态开了,这是最容易漏掉的验证环节。


















