一、问题描述: 

Last_SQL_Errno: 1032
Last_SQL_Error: Could not execute Update_rows_v1 event on table buy_online.tp_coupon_list; Can't find record in 'tp_coupon_list', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.001937, end_log_pos 1489688

二、错误说明: 

MySQL主从同步的1032错误,一般是指要更改的数据不存在,SQL_THREAD提取的日志无法应用故报错,造成同步失败

(Update、Delete、Insert一条已经delete的数据)。

  1032的错误本身对数据一致性没什么影响,影响最大的是造成了同步失败、同步停止。

  如果主主(主从)有同步失败,要第一时间查看并着手解决。因为不同步,会造成读取数据的不一致。应在第一时间恢复同步,

尽量减少对业务的影响。然后再具体分析不同步的原因,手动或者自动修复数据,并做pt-table-checksum数据一致性检查。

  目前业务一般是做主主同步,主主同步由于是异步更新,存在更新冲突的问题,且很容易引起SQL ERROR 1032错误。这个应该在业务侧解决,

保证同一时间只更新数据库的一个点,类似单点写入。我们的解决办法是:写一个底层数据库调用库,可能涉及到更新冲突的操作,都调用这个库。

在配置文件里,配2个点的数据库A、B,保证一直都更新A库,如果A库不可用,就去更新B库。

  另外,如果是对数据一致性要求较高的场景,比如涉及到钱,建议用PXC(强一致性、真正同步复制)。

附图:

mysq 主从同步错误之 Error_code 1032handler error HA_ERR_KEY_NOT_FOUND_SQL

 

三、解决办法:

  MySQL5.6.30版本,binlog模式为ROW。

  show slave status\G,可以看到如下报错:

Last_SQL_Errno: 1032


Last_SQL_Error: Could not execute Update_rows_v1 event on table buy_online.tp_coupon_list; Can't find record in 'tp_coupon_list', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.001937, end_log_pos 1489688

从上可以看出,是SQL_THREAD线程出错,错误号码1032。是在应用delete buy_online.tp_coupon_list 表中一行数据的事件时,由于这条数据不存在而出错。

方法1:跳过错误Event

先跳过这一条错误(event),让主从同步恢复正常。(或者N条event,一条一条跳过)

  stop slave;

  set global sql_slave_skip_counter=1;

  start slave;

 

方法2:跳过所有1032错误

更改my.cnf文件,在Replication settings下添加:

  slave-skip-errors = 1032

并重启数据库,然后start salve。

注意:因为要重启数据库,不推荐,除非错误事件太多。

 

方法3:还原被删除的数据

参考:​​javascript:void(0)​​