主从同步停止了怎么办?

数据同步问题

前面我们聊过 基于 MySQL 主从复制实现配置数据与测试数据分离的架构设计 ,虽然主从复制解决了数据分离的问题,但数据同步本身也会带来新的麻烦。最常遇到的情况就是:主库删除某条数据时,发现从库压根就没有这条数据,于是主从同步就卡住了。

Worker 1 failed executing transaction ‘ANONYMOUS’ at master log mysql-bin.000034, end_log_pos 230154447; Could not execute Delete_rows event on table xx.tablename; Can’t find record in ‘tablename’, Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event’s master log mysql-bin.000034, end_log_pos 230154447

这篇文章就来说说怎么手动处理这类同步问题。

手动解决同步问题

遇到同步问题其实不难解决,掌握下面的操作就行了,就是处理起来比较麻烦。

1. 先看看到底出了什么错

1
2
select LAST_ERROR_MESSAGE 
from performance_schema.replication_applier_status_by_worker;

这个SQL返回的错误信息跟前面提到的 Worker 1 failed executing transaction… 差不多。其中 HA_ERR_KEY_NOT_FOUND 是最常见的一种情况,就是主库要删除的数据在从库根本不存在。这种错误通常可以直接跳过,但遇到其他问题时还是要具体分析一下。

2. 能直接跳过的情况

像上面这种找不到记录的错误,一般可以直接跳过,执行下面几条SQL就行:

1
2
3
stop slave;
SET GLOBAL sql_slave_skip_counter = 1;
start slave;

这里的 sql_slave_skip_counter = 1 会跳过同步中的下一个事件,也就是当前出错的这部分。跳过后可以再用第一步的方法看看还有没有其他问题。

3. 需要手动修复的情况

如果是主键不存在导致的问题,你也可以手动在从库里插入对应的数据来解决。

如果遇到表结构不一致的问题,也可以手动调整成一致的。

当手动修复完问题后,重新启动同步即可:

1
2
stop slave;
start slave;

总结

上面这些操作基本能搞定所有的同步问题,但手工处理确实挺繁琐的,而且做不到实时监控。另外,遇到同步错误时,还可以用 MySQL 的 mysqlbinlog 工具来确定具体是哪条数据出了问题,这个工具还能用来恢复数据。后面我会从多个角度来聊聊 MySQL 主从的各种问题,也会分享一些实用的操作技巧和小工具来简化处理过程。


主从同步停止了怎么办?
https://blog.mybatis.io/post/02f041d1.html
作者
Liuzh
发布于
2025年6月24日
许可协议