MySQL 8.4 LTS中半同步复制默认不启用,必须手动安装插件、设置参数并重启从库I/O线程,否则Rpl_semi_sync_master_status始终为OFF;主从需先确保异步复制正常、log_bin与relay_log开启、server_id唯一、时间同步,并分别在主库装rpl_semi_sync_master、从库装rpl_semi_sync_slave,最后通过SHOW STATUS验证状态。

MySQL 8.4 LTS 中半同步复制默认不启用,必须手动安装插件、设置参数并重启 I/O 线程,否则 SHOW STATUS 查到的 Rpl_semi_sync_master_status 始终为 OFF —— 这是最常见的“配了却没生效”原因。
确认主从已跑通异步复制再动半同步
半同步不是独立复制模式,它只是在已有异步复制链路上加一层确认机制。如果 SHOW SLAVE STATUS\G 中 Slave_IO_Running 或 Slave_SQL_Running 不是 Yes,强行启半同步只会让主库事务卡住或超时降级。
- 主库必须开启
log_bin,且binlog_format推荐设为ROW(避免语句级复制的不确定性) - 从库必须开启
relay_log(MySQL 8.4 默认开启,但需确认未被显式禁用) - 主从
server_id必须唯一,且不能为0或重复值 - 时间不同步会导致
rpl_semi_sync_master_timeout判断失准,建议用chronyd统一校时
主库和从库分别装对插件,不能互换
rpl_semi_sync_master 只能在主库装,rpl_semi_sync_slave 只能在从库装——插件名写错、SO 文件名拼错(比如写成 semisync_slave.so 但实际是 semisync_slave.so 或 semisync_slave.dll)都会报 Plugin 'xxx' is not loaded。
- 主库执行:
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';<br>SET GLOBAL rpl_semi_sync_master_enabled = 1;<br>SET GLOBAL rpl_semi_sync_master_timeout = 10000;
- 从库执行:
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';<br>SET GLOBAL rpl_semi_sync_slave_enabled = 1;
- 关键:从库启用后必须执行
STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;,仅START SLAVE不会触发半同步握手
验证状态要看对变量,别只信 SHOW SLAVE STATUS
SHOW SLAVE STATUS 里没有半同步相关字段,全靠 SHOW STATUS 查插件运行态。容易漏看的是从库的 Rpl_semi_sync_slave_status 和主库的 Rpl_semi_sync_master_clients。
- 主库查:
SHOW STATUS LIKE 'Rpl_semi_sync_master%';——Rpl_semi_sync_master_status为ON且Rpl_semi_sync_master_clients > 0才算连上 - 从库查:
SHOW STATUS LIKE 'Rpl_semi_sync_slave_status';—— 必须是ON,否则说明插件虽加载但未参与通信 - 若主库
Rpl_semi_sync_master_status是ON但Rpl_semi_sync_master_clients = 0,大概率是防火墙挡了 3306 或从库没连上来(检查SHOW PROCESSLIST是否有Binlog Dump GTID线程)
my.cnf 里必须写 plugin 加载指令,否则重启就失效
INSTALL PLUGIN 和 SET GLOBAL 都是运行时操作,MySQL 服务重启后全部丢失。持久化必须靠配置文件,而且顺序不能错。
- 主库
my.cnf的[mysqld]段加:plugin_load_add = semisync_master.so<br>rpl_semi_sync_master_enabled = 1<br>rpl_semi_sync_master_timeout = 10000
- 从库
my.cnf加:plugin_load_add = semisync_slave.so<br>rpl_semi_sync_slave_enabled = 1
- 注意:
plugin_load_add必须写在rpl_semi_sync_*参数之前,否则 MySQL 启动时找不到插件会直接报错退出 - 改完配置必须重启 mysqld,不能只 reload
最易被忽略的一点:半同步不保证 SQL 线程执行成功,只保证 relay log 写入完成。如果从库 SQL 线程因唯一键冲突、DDL 不兼容等问题卡住,Slave_SQL_Running 变 No,但半同步状态仍可能显示正常——这时主库还在等“下一个”事务的 relay log 确认,而旧事务早已堆积在中继日志里不动了。


















