错误,rpl_semi_sync_master_wait_point 必须设为 after_sync 才能实现数据零丢失;after_commit 会导致主库提交后等待 ack,崩溃时已提交事务可能未同步至从库而丢失。

rpl_semi_sync_master_wait_point 必须设为 AFTER_COMMIT,否则无法实现“无损”语义。MySQL 8.0 默认是 AFTER_SYNC,它会让主库在收到从库 ACK 后、本地事务提交前就返回客户端成功——此时若主库崩溃,事务已写入从库 relay log 但未提交,切换后会出现客户端以为失败、实际已存在(幽灵事务)。改成 AFTER_COMMIT 后,主库先本地提交、再等 ACK,即使崩溃,客户端也明确收到了失败响应,数据状态可判定,这才是真正可控的“无损”。
主库插件装错名或没装,半同步就是摆设
-
INSTALL PLUGIN命令中插件名必须与 MySQL 版本严格匹配:8.0.26+ 要用semisync_master(不是rpl_semi_sync_master),旧版 8.0.x 用rpl_semi_sync_master -
SONAME必须是'semisync_master.so',大小写敏感,路径必须在@@plugin_dir下 - 执行后立刻查:
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%semi%';,状态必须是ACTIVE,否则后续所有配置都无效
从库启用半同步的关键三步缺一不可
- 插件必须安装:
INSTALL PLUGIN semisync_slave SONAME 'semisync_slave.so';(8.0.26+)或rpl_semi_sync_slave(旧版) -
relay-log必须显式配置(如relay-log = relay-bin),不能依赖默认值;否则Rpl_semi_sync_slave_status永远为OFF -
read_only = ON是硬性要求,不设则插件拒绝激活,防止误写破坏 GTID 一致性
超时降级静默发生,只看 Rpl_semi_sync_master_status 会误判
- 主库执行
SHOW STATUS LIKE 'Rpl_semi_sync%';,重点盯三个指标:-
Rpl_semi_sync_master_status:当前是否启用(ON/OFF) -
Rpl_semi_sync_master_no_times:累计降级次数(非零说明出过问题) -
Rpl_semi_sync_master_off_times:因超时主动关闭的次数
-
-
rpl_semi_sync_master_timeout建议设为2000~5000(毫秒),太短易误降级,太长阻塞业务 - 降级后不会自动恢复,需下一个事务触发重试,或手动重启 IO 线程:
STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;
真正容易被忽略的是:从库必须在启动 IO 线程前就装好插件并启用 rpl_semi_sync_slave_enabled。如果主从已用 GTID 运行着,再临时装插件、SET 变量,IO 线程已经建连完成,半同步握手阶段已错过,Rpl_semi_sync_slave_status 就永远卡在 OFF。











