半同步复制需主从分别安装对应插件(主库装rpl_semi_sync_master,从库装rpl_semi_sync_slave)、显式启用参数、重启io线程,缺一不可;确认插件存在需查@@plugin_dir并检查文件,装后show plugins应显示active,且从库必须执行stop/start slave io_thread才能生效。

半同步复制不会自动生效,必须主从分别安装对应插件、显式启用参数、重启IO线程,缺一不可。
怎么确认 semisync 插件文件是否存在
MySQL 5.7 官方二进制包自带 semisync_master.so 和 semisync_slave.so,但某些 Docker 镜像或精简版可能删了。别猜,直接查:
- 执行
SELECT @@plugin_dir;确认插件路径(如/usr/lib64/mysql/plugin/) - 在操作系统层面检查该目录下是否存在这两个文件:
ls -l $(mysql -Nse "SELECT @@plugin_dir;")/semi* - 若缺失,需手动拷贝对应架构的 so 文件(注意匹配 MySQL 版本和 CPU 架构,x86_64 vs aarch64)
INSTALL PLUGIN 命令必须分主从、用对 SONAME
主库和从库装错插件名会导致状态永远为 DISABLED,且错误不报明显提示:
- 主库只运行:
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; - 从库只运行:
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; - 不能在主库装
rpl_semi_sync_slave,也不能在从库装rpl_semi_sync_master - 装完立刻执行
SHOW PLUGINS LIKE '%semi%';,两行状态都必须是ACTIVE,否则后续所有配置无效
启用插件后必须重启从库 IO 线程
从库装完 rpl_semi_sync_slave 并设 rpl_semi_sync_slave_enabled = ON 后,不重启 IO 线程,半同步逻辑根本不会触发:
- 执行
STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;(不是STOP SLAVE; START SLAVE;) - 仅重启 SQL 线程或只 reload 配置都不起作用
- 验证是否生效:查
SHOW STATUS LIKE 'Rpl_semi_sync_slave_status';,返回值必须是ON - 主库上同时查
Rpl_semi_sync_master_clients,应 ≥ 1;若为 0,说明从库没真正接入半同步通道
为什么 SHOW PLUGINS 看起来装了却始终 DISABLED
常见真实原因不是语法错,而是权限或加载失败静默:
- 执行
INSTALL PLUGIN的账号缺少SUPER权限(普通 DBA 权限不够) -
have_dynamic_loading变量为NO(需在启动时加--plugin-load-add或确保配置中未禁用动态加载) - so 文件权限不对(MySQL 进程用户不可读,如 root 写入、mysql 用户无法 open)
- SELinux 或 AppArmor 拦截了 plugin_dir 下的 so 加载(CentOS/RHEL 上尤其常见)
最易被忽略的一点:半同步依赖从库的 IO 线程把 binlog 写入 relay log 并刷盘,如果从库 relay log 路径磁盘满、或 relay_log_recovery=ON 但 recovery 失败,Rpl_semi_sync_slave_status 会卡在 OFF,此时看插件状态仍是 ACTIVE,但实际已失效。











