Rpl_semi_sync_master_status为OFF的首要原因是GTID未预先启用:必须在MySQL启动前配置gtid_mode=ON、enforce_gtid_consistency=ON、log-bin和server-id,否则即使后续INSTALL PLUGIN,rpl_semi_sync_master_enabled也会被忽略且无报错。

必须先启用 GTID,再加载半同步插件;顺序反了会导致 rpl_semi_sync_master_enabled 无法生效,且无报错提示。
为什么 rpl_semi_sync_master_enabled 总是显示 OFF?
常见原因是插件加载时机错误:MySQL 启动时若未先启用 GTID(gtid_mode=ON 和 enforce_gtid_consistency=ON),后续即使手动 INSTALL PLUGIN,半同步参数也可能被忽略。
- 启动前确保配置文件中已写入:
gtid_mode=ON、enforce_gtid_consistency=ON、log-bin、server-id - 不要在运行中的实例上仅靠
SET GLOBAL开启 GTID —— MySQL 8.0 不支持动态开启 GTID,必须重启 - 插件加载语句必须在 GTID 生效后执行:
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so' - 检查插件路径是否正确:
SELECT @@plugin_dir,确认semisync_master.so文件真实存在
semisync_master.so 加载失败的典型现象与修复
错误日志里出现 Plugin 'rpl_semi_sync_master' init function returned error 或状态查询返回 NULL,大概率是插件依赖未满足。
- GTID 必须已启用,且
binlog_format=ROW(MIXED或STATEMENT会拒绝加载) - 主库和从库都需分别加载对应插件:
semisync_master.so(主)和semisync_slave.so(从) - Linux 下注意 SELinux 或文件权限:确保 mysqld 进程有读取
.so文件的权限 - macOS(如 M1/M2)用户注意:MySQL 官方 ARM64 包自带插件,但路径可能为
lib/plugin/semisync_master.dylib,需用SONAME指定正确后缀
验证半同步是否真正起作用的关键检查点
只看 SHOW VARIABLES LIKE 'rpl_semi_sync%' 不够,必须结合运行时状态和网络行为判断。
- 主库执行:
SELECT * FROM performance_schema.replication_applier_status_by_coordinator,确认THREAD_ID非 NULL 且APPLIER_STATE为ACTIVE - 主库执行:
SHOW STATUS LIKE 'Rpl_semi_sync%',重点关注:Rpl_semi_sync_master_status(应为ON)、Rpl_semi_sync_master_yes_tx(应随写入递增) - 从库上执行:
STOP SLAVE IO_THREAD,再在主库插入一行;若事务卡住超时(默认 5000ms),说明半同步在拦截 —— 这才是有效证据 - 超时时间由
rpl_semi_sync_master_timeout控制,设太小(如 100)会导致频繁退化为异步,设太大(如 30000)又影响业务响应
最容易被忽略的是从库的 rpl_semi_sync_slave_enabled 必须为 ON,且主从之间 TCP 3306 端口双向可达 —— 很多环境防火墙只放开主→从,忘了从→主的 ACK 回包路径。


















