MySQL半同步复制需主从两端同时启用插件及参数:主库执行INSTALL PLUGIN rpl_semi_sync_master并设rpl_semi_sync_master_enabled=1,从库执行INSTALL PLUGIN rpl_semi_sync_slave并设rpl_semi_sync_slave_enabled=1,且从库IO线程正常运行、能返回ACK,主库Rpl_semi_sync_master_status才为ON。

MySQL异步复制如何切换为半同步:只开 rpl_semi_sync_master_enabled 不够
只在 Master 上执行 SET GLOBAL rpl_semi_sync_master_enabled = 1,复制**不会变成半同步**。这是最常踩的坑——插件没装、从库没配、参数没生效,命令看似成功,实际仍是异步。
必须同时满足的三个前提条件
半同步不是“开关一按就生效”,它依赖主从两端协同:
-
rpl_semi_sync_master_enabled和rpl_semi_sync_slave_enabled必须**分别在主库和从库上启用**,缺一不可 - 主库和从库都必须已安装半同步插件:
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'(主) /INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'(从) - 从库的
CHANGE MASTER TO ... MASTER_AUTO_POSITION = 1或显式指定MASTER_LOG_FILE/MASTER_LOG_POS后,需执行START SLAVE,且SHOW SLAVE STATUS\G中Seconds_Behind_Master不为NULL,表示 IO 线程已连上并开始拉日志
rpl_semi_sync_master_enabled 开启后为什么还是异步?
常见现象:主库执行了 SET GLOBAL rpl_semi_sync_master_enabled = 1,但 SHOW VARIABLES LIKE 'rpl_semi_sync%' 显示 rpl_semi_sync_master_status 仍为 OFF。原因通常是:
- 从库未启用
rpl_semi_sync_slave_enabled,主库收不到任何 ACK,自动降级为异步(这是 MySQL 半同步的默认保底行为) - 主库的
timeout参数太小(默认 10000ms),网络稍有延迟或从库负载高,导致等待超时后主动切回异步 - 从库 relay log 写入失败(如磁盘满、权限不足),
SQL Thread报错停止,IO 线程虽在运行,但无法触发 ACK
验证是否真正进入半同步的关键指标
不要只看变量开关,盯住这两个状态值:
- 主库执行
SHOW STATUS LIKE 'Rpl_semi_sync_master_status'→ 返回ON才算激活成功 - 主库执行
SHOW STATUS LIKE 'Rpl_semi_sync_master_yes_tx'→ 该值随写事务递增,且Rpl_semi_sync_master_no_tx增长缓慢或为 0,说明大部分事务走的是半同步路径 - 从库执行
SHOW STATUS LIKE 'Rpl_semi_sync_slave_status'→ 必须是ON,否则主库永远收不到 ACK
真正难的是让 Rpl_semi_sync_master_status 长期稳定为 ON,这要求主从网络低延迟、从库 I/O 和 SQL 线程无积压、磁盘空间充足——任何一个环节卡住,MySQL 就会默默切回异步,且不报错。


















