mysql半同步复制需主从分别安装对应插件并动态启用变量,版本≥5.5且have_dynamic_loading为yes;主库装rpl_semi_sync_master,从库装rpl_semi_sync_slave并重启io线程;验证需检查variables和status中相关on状态及客户端数。

MySQL 半同步复制必须手动安装插件并显式启用参数,不能仅靠配置文件生效;主从两端插件名、变量名和启用时机都不同,配错会导致 rpl_semi_sync_master_enabled 或 rpl_semi_sync_slave_enabled 始终为 OFF。
确认 MySQL 版本和动态加载能力
半同步依赖插件机制,MySQL 必须 ≥ 5.5 且支持运行时加载。执行:
SHOW VARIABLES LIKE 'have_dynamic_loading';
返回 YES 才能继续。如果为 NO,说明 mysqld 编译时禁用了插件支持(常见于某些精简版或容器镜像),此时无法启用半同步。
同时确认版本:
SELECT VERSION();
低于 5.5 直接放弃 —— 半同步在 5.5 才首次引入。
主库安装 rpl_semi_sync_master 插件
主库只需装 rpl_semi_sync_master.so(Linux)或 semisync_master.dll(Windows),不装 slave 插件。路径需准确,常见位置包括:
/usr/lib64/mysql/plugin/semisync_master.so/usr/local/mysql/lib/plugin/semisync_master.so- 用
find /usr -name "semisync_master.*" 2>/dev/null实际查找
安装命令(注意引号和空格):
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
若报错 Plugin 'rpl_semi_sync_master' is not loaded,大概率是 SONAME 路径不对或文件不存在;若报错 Unknown plugin,说明插件未编译进当前 MySQL 安装包(需换官方二进制包)。
安装后必须设变量才真正启用:
SET GLOBAL rpl_semi_sync_master_enabled = 1;
该设置重启失效,如需持久化,加到 my.cnf 的 [mysqld] 段:
rpl_semi_sync_master_enabled = 1
从库安装 rpl_semi_sync_slave 插件并重启 IO 线程
从库装的是 rpl_semi_sync_slave.so,不是 master 插件:
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
同样要检查插件路径。启用变量:
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
⚠️ 关键一步:变量生效后,必须重启从库的 IO 线程才能进入半同步模式:
STOP SLAVE IO_THREAD;<br>START SLAVE IO_THREAD;
只执行 START SLAVE 不行 —— SQL 线程不影响半同步,但 IO 线程必须重连才能协商使用半同步协议。若跳过这步,SHOW SLAVE STATUS 中仍显示 Seconds_Behind_Master 正常,但主库实际仍是异步发送。
验证是否真生效 & 常见失效点
主库执行:
SHOW VARIABLES LIKE '%semi%';<br>SHOW STATUS LIKE 'Rpl_semi_sync%';
重点看:
-
rpl_semi_sync_master_enabled和rpl_semi_sync_slave_enabled都为ON -
Rpl_semi_sync_master_status为ON(表示当前处于半同步) -
Rpl_semi_sync_master_clients≥ 1(说明至少一个从库已注册)
容易被忽略的失效点:
- 防火墙或网络策略拦截了主库向从库的
3306外连(dump thread 主动发数据,不是从库拉取) - 从库
relay_log空间不足,写 relay log 失败导致无法发 ACK -
rpl_semi_sync_master_timeout默认 10000ms(10秒),超时后自动降级为异步,Rpl_semi_sync_master_status变为OFF,但变量仍为ON—— 这个状态切换是静默的,必须查 status 才知道
真正麻烦的是:半同步只保证 binlog 写入 relay log,不保证 SQL 线程已执行。所以即使 Rpl_semi_sync_master_status=ON,也不能等同于“数据已落盘”或“查询可见”。











