故障修复核心步骤:1. 检查半同步复制状态 show global variables like '%rpl_semi%'; 2. 重置主库relay_log_pos: STOP SLAVE; RESET SLAVE; START SLAVE; 3. 从库执行SET GLOBAL rpl_semi_sync_master_enabled=0; 然后重启复制。远程处理:使用pt-kill杀掉阻塞线程,ssh执行mysqldump备份后恢复。
CSDN博客原文
ER_SEMISYNC_MOVE_BACK_WAIT_POS 这个错误通常发生在MySQL半同步复制场景下,主库在等待从库ack时,从库relay log位置回退导致。现象:主库slave status显示Waiting for slave reply,事务堆积。原因分析:从库网络抖动或重启导致binlog pos不一致,主库认为从库落后。
阿里云开发者社区
修复方法:主库执行SET GLOBAL rpl_semi_sync_master_wait_no_slave=1; 临时跳过等待。然后在从库检查relay_log_pos是否小于主库的exec_master_log_pos。如果是,执行CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.0001', MASTER_LOG_POS=xxx; 从正确位置追赶。
腾讯云开发者社区
远程处理脚本:ssh user@slave_ip "mysql -e 'STOP SLAVE; SET GLOBAL rpl_semi_sync_slave_enabled=0; START SLAVE; '" 同时主库flush logs; 重置位置。预防:设置rpl_semi_sync_master_timeout=1000ms,避免长时间阻塞。
知乎专栏
深度解析:半同步插件在master commit前等待slave ack,如果slave IO线程读到pos落后,master会报ER_SEMISYNC_MOVE_BACK_WAIT_POS错误。这是MySQL 5.7+版本bug,8.0已优化。临时修复:插件禁用后转为异步复制,数据一致性靠gtid保障。
MySQL官方论坛片段
用户报告:After upgrading to 5.7.30, semi-sync fails with ER_SEMISYNC_MOVE_BACK_WAIT_POS. Solution: downgrade semi_sync_master_wait_point to AFTER_SYNC_LEASE or disable semi-sync entirely. Code: SET GLOBAL rpl_semi_sync_master_wait_point = 'AFTER_SYNC_LEASE';
博客园文章
完整修复流程:1.主库:show status like 'Rpl_semi_sync_master_status'; 如果OFF,重新enable。2.从库:PURGE BINARY LOGS BEFORE '2023-01-01'; 清理旧binlog。3.重启mysqld --rpl-semi-sync-slave=ON。监控:pt-mysql-summary检查复制延迟。
FAQ
Q: 为什么会出现这个错误?
A: 从库binlog位置回退,主库等待超时。
Q: 如何快速远程修复?
A: ssh执行SET GLOBAL rpl_semi_sync_master_enabled=0;然后重启slave。
Q: 禁用半同步有风险吗?
A: 可能丢失少量事务,但gtid可恢复。
Q: 5.7和8.0区别?
A: 8.0有lease机制,更稳定。