必须主从库分别安装对应插件并按序操作:先装插件再启配置,否则mysql启动失败或状态为off;8.0.26+用rpl_semi_sync_source与semisync_source.so,旧版用rpl_semi_sync_master与semisync_master.so;混用报错;需确认插件路径、安装后查状态为active;wait_point须设after_sync;从库需stop/start io_thread重载半同步;read_only=on、显式relay-log、唯一server-id为硬性条件;超时降级静默,需监控rpl_semi_sync_master_no_times等变量;timeout建议2000~5000ms;gtid环境下须在首次启动io线程前完成插件安装与启用。

必须在主库和从库分别安装对应插件,且顺序不能错:先装插件,再启配置,否则 MySQL 启动失败或状态始终 OFF。
主库插件安装与 wait_point 设置
MySQL 8.0.26+ 使用 rpl_semi_sync_source 和 semisync_source.so,旧版(≤8.0.25)用 rpl_semi_sync_master 和 semisync_master.so。混用会导致 INSTALL PLUGIN 报错或状态不激活。
- 执行前先确认插件路径:
SELECT @@plugin_dir;,确保semisync_source.so(或semisync_master.so)文件真实存在 - 安装后立刻查状态:
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%semi%';,PLUGIN_STATUS必须为ACTIVE -
rpl_semi_sync_source_wait_point(或rpl_semi_sync_master_wait_point)必须设为AFTER_SYNC才能实现“崩溃不丢已提交事务”;设成AFTER_COMMIT会退化为“伪无损”,主库提交后等 ACK,崩溃时已提交但未发出去的事务就丢了 - 该变量只对后续事务生效,不影响当前正在执行的事务
从库插件启用必须重启 IO 线程
Rpl_semi_sync_slave_status 长期为 OFF 的根本原因,不是插件没装,而是 IO 线程启动时没加载半同步逻辑 —— SET GLOBAL rpl_semi_sync_slave_enabled = 1 不触发重载。
- 必须执行:
STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;,让 IO 线程重建连接并完成半同步握手 - 从库还需同时满足三个硬性条件:
read_only = ON(防止 GTID 冲突)、显式配置relay-log(如relay-log = relay-bin,不能依赖默认值)、server-id唯一且不与主库重复 - 检查
SHOW SLAVE STATUS\G中Slave_IO_Running是Yes,否则插件不会初始化
超时降级行为与监控要点
半同步不是永远开启的,超时后自动降级为异步复制,但这个过程是静默的 —— Rpl_semi_sync_master_status 仍显示 ON,容易误判。
- 重点盯三个状态变量:
Rpl_semi_sync_master_status(当前是否启用)、Rpl_semi_sync_master_no_times(累计降级次数)、Rpl_semi_sync_master_off_times(因超时主动关闭次数) -
rpl_semi_sync_master_timeout建议设为2000~5000(毫秒),太小易误降级,太大阻塞写入;不能设为0(无限等待) - 降级后不会自动恢复,需下一个事务触发重试,或手动重启 IO 线程
最容易被忽略的是:如果主从已用 GTID 正常运行着,再临时装插件、SET 变量,IO 线程早已建连完成,半同步握手阶段已错过,Rpl_semi_sync_slave_status 就永远卡在 OFF —— 必须在首次启动 IO 线程前就完成插件安装和 rpl_semi_sync_slave_enabled = ON。











