MySQL主从同步 Last_SQL_Error: Could not execute Update_rows event 报错处理

51 篇文章 1 订阅
22 篇文章 3 订阅

有同事反馈他们搭建的MySQL库主从同步报错了,需要协助帮忙修复。检查同步报错如下

可以看到是由于两边数据不一致,主库host表的某条数据在从库不存在,导致同步时执行update报错。

修复的原理很简单,找到主从不一致的这条数据,在从库补上,让update能执行就好。由于需要从binlog里找数据,需要确保中断之后的binlog没被删除,否则就只能重搭了。

1. 主库查询对应binlog记录

注意如果装了多个版本的mysql,mysqlbinlog命令需要写全路径。其中stop-position和binlog名就对应的是前面报错中的信息。生成的文件可能比较大,最慢的情况下会跟这个binlog文件一样大,需要等一会。

mysqlbinlog -v --stop-position=537973695 /binlog_path/mysql-bin.000001 > /tmpbinlog.log

2. 查询记录end_log_pos=537973695所在位置,找到对应update语句

当然如果生成的文件很小可以直接打开搜索,但处理的时候文件有2G,显然不合适

cat tmpbinlog.log | awk '/end_log_pos 537973695/ {print NR}'
#输出所在行数为:68381343
#查看其前后行(50行左右差不多够了),找出其对应的sql语句
cat tmpbinlog.log | awk 'NR==68381330,NR==68381380'

hosts表第一个字段是主键hostid,拿该条件来查即可,查完发现从库果然没有

--从库查询
select hostid from hosts where hostid = 18013;
Empty set (0.00 sec)

3. 数据修复

如果表结构和值特别简单,可以直接写insert语句在从库插入。

如果较为复杂,则在主库创建临时表并dump,在从库执行dump文件中的insert语句。

主库执行

create table tmphost like hosts;
insert into tmphost select * from hosts where hostid=18013;
commit

dump数据

mysqldump -uroot -p zabbix tmphost > tmphost.sql

找到对应insert语句并在从库执行

4. 恢复同步

stop slave;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;  -- 跳过一个事务,可选
start slave;

show slave status\G;

如果没有其他报错,主从同步就顺利恢复啦~

参考 

Last_SQL_Error: Could not execute Update_rows event on table eip_fileservice.T_FILE_LOCATION; Can't - it610.com

Mysql跳过主从同步错误 - 消磨_时间 - 博客园

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hehuyi_In

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值