MySQL半同步复制需主从两端插件、参数、状态全部对齐才生效:5.5–5.7用rpl_semi_sync_master/slave插件,8.0.26+改用rpl_semi_sync_source/replica;必须动态INSTALL PLUGIN并SET GLOBAL启用,从库需重启IO线程,且my.cnf需补全plugin_load_add和对应enabled参数,版本不匹配或配置错误将导致静默失败。

半同步复制不是开个开关就生效的,主从两端插件、参数、状态必须全部对齐,缺一不可。
确认 MySQL 版本和插件支持
MySQL 5.5 起支持半同步,但插件名和行为在不同版本有差异:
- MySQL 5.5–5.7:主库用
rpl_semi_sync_master,从库用rpl_semi_sync_slave;插件文件名是semisync_master.so和semisync_slave.so - MySQL 8.0.26+:主库插件改名为
rpl_semi_sync_source,对应插件文件是semisync_source.so;从库仍为rpl_semi_sync_replica(注意不是slave) - 先查是否允许动态加载:
SELECT @@have_dynamic_loading;必须返回YES,否则插件无法在线安装 - 插件路径通常在
/usr/lib64/mysql/plugin/或/usr/local/mysql/lib/plugin/,用ls | grep semisync确认存在
主从分别安装并启用插件
插件必须在主从各自执行,且不能只靠配置文件——INSTALL PLUGIN 是硬性前提,否则 SET GLOBAL 会报错“Unknown system variable”。
主库(MySQL 8.0.26+):
INSTALL PLUGIN rpl_semi_sync_source SONAME 'semisync_source.so'; SET GLOBAL rpl_semi_sync_source_enabled = 1; SET GLOBAL rpl_semi_sync_source_timeout = 10000;
从库(MySQL 8.0.26+):
INSTALL PLUGIN rpl_semi_sync_replica SONAME 'semisync_replica.so'; SET GLOBAL rpl_semi_sync_replica_enabled = 1;
关键点:
- 安装后务必检查:
SELECT * FROM mysql.plugin WHERE name LIKE 'rpl%semi%';确保状态为ACTIVE - 从库启用后,必须重启 IO 线程才能生效:
STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;(仅重启 IO 线程,SQL 线程不受影响) - 超时值单位是毫秒,
rpl_semi_sync_source_timeout默认 10000(10 秒),设太小容易频繁降级,设太大则阻塞明显
验证半同步是否真正生效
光看 rpl_semi_sync_*_enabled 变量为 ON 不代表运行正常——它只表示“开关开了”,不反映实时链路状态。
必须查这两个状态变量:
-
Rpl_semi_sync_source_status:主库上应为ON,若为OFF,说明没有从库响应 ACK(常见于从库未启用插件、IO 线程没启、网络不通、防火墙拦截 3306 或专用 ACK 端口) -
Rpl_semi_sync_replica_status:从库上应为ON,若为OFF,说明插件已加载但未收到主库请求(常见于主库未启用插件、或主库server_id与从库CHANGE MASTER TO中指定的不一致) - 再查事务确认数:
Rpl_semi_sync_source_yes_tx应随写入递增;若长期为 0,说明所有事务都超时降级了
一个快速验证方法:停掉从库的 IO 线程,主库执行 INSERT,观察是否卡住(默认 10 秒后自动返回);再启 IO 线程,确认后续事务能立刻获得 ACK。
配置文件里必须补全的项
临时 SET GLOBAL 在 MySQL 重启后失效,所以 my.cnf 必须补全对应配置,且注意命名一致性:
主库配置段:
[mysqld] plugin_load_add = "semisync_source.so" rpl_semi_sync_source_enabled = 1 rpl_semi_sync_source_timeout = 10000
从库配置段:
[mysqld] plugin_load_add = "semisync_replica.so" rpl_semi_sync_replica_enabled = 1
注意:
-
plugin_load_add是加载插件的配置项,不是loose_*前缀,也不是early_plugin_load(后者用于 mysqld 启动早期加载,一般不需要) - MySQL 5.7 及更早版本,对应项是
rpl_semi_sync_master_enabled和rpl_semi_sync_slave_enabled,拼写错误会导致插件静默失败 - 不要漏掉
server_id和log_bin—— 半同步依赖标准主从基础,这些缺失会导致插件初始化失败
最常被忽略的是:插件加载顺序和配置项命名随版本漂移,同一套 SQL 脚本在 5.7 和 8.0.33 上可能一个成功一个报错。动手前先 SELECT VERSION(); 确认版本,再查对应文档里的插件名和变量名。


















