主从同步停止了怎么办?
数据同步问题
前面我们聊过 基于 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 |
|
这个SQL返回的错误信息跟前面提到的 Worker 1 failed executing transaction… 差不多。其中 HA_ERR_KEY_NOT_FOUND
是最常见的一种情况,就是主库要删除的数据在从库根本不存在。这种错误通常可以直接跳过,但遇到其他问题时还是要具体分析一下。
2. 能直接跳过的情况
像上面这种找不到记录的错误,一般可以直接跳过,执行下面几条SQL就行:
1 |
|
这里的 sql_slave_skip_counter = 1
会跳过同步中的下一个事件,也就是当前出错的这部分。跳过后可以再用第一步的方法看看还有没有其他问题。
3. 需要手动修复的情况
如果是主键不存在导致的问题,你也可以手动在从库里插入对应的数据来解决。
如果遇到表结构不一致的问题,也可以手动调整成一致的。
当手动修复完问题后,重新启动同步即可:
1 |
|
总结
上面这些操作基本能搞定所有的同步问题,但手工处理确实挺繁琐的,而且做不到实时监控。另外,遇到同步错误时,还可以用 MySQL 的 mysqlbinlog 工具来确定具体是哪条数据出了问题,这个工具还能用来恢复数据。后面我会从多个角度来聊聊 MySQL 主从的各种问题,也会分享一些实用的操作技巧和小工具来简化处理过程。