[MySQL复制] SQL_ERROR 1032解决办法(non-gtid env)
一、缘由:
在主主同步的测试环境,由于业务侧没有遵循同一时间只写一个点的原则,造成A库上删除了一条数据,B库上在同时更新这条数据。
由于异步和网络延时,B的更新event先到达A端执行,造成A端找不到这条记录,故SQL_THREAD报错1032,主从同步停止。
二、错误说明:
MySQL主从同步的1032错误,一般是指要更改的数据不存在,SQL_THREAD提取的日志无法应用故报错,造成同步失败
(Update、Delete、Insert一条已经delete的数据)。
1032的错误本身对数据一致性没什么影响,影响最大的是造成了同步失败、同步停止。
如果主主(主从)有同步失败,要第一时间查看并着手解决。因为不同步,会造成读取数据的不一致。应在第一时间恢复同步,
尽量减少对业务的影响。然后再具体分析不同步的原因,手动或者自动修复数据,并做pt-table-checksum数据一致性检查。
目前业务一般是做主主同步,主主同步由于是异步更新,存在更新冲突的问题,且很容易引起SQL ERROR 1032错误。这个应该在业务侧解决,
保证同一时间只更新数据库的一个点,类似单点写入。我们的解决办法是:写一个底层数据库调用库,可能涉及到更新冲突的操作,都调用这个库。
在配置文件里,配2个点的数据库A、B,保证一直都更新A库,如果A库不可用,就去更新B库。
另外,如果是对数据一致性要求较高的场景,比如涉及到钱,建议用PXC(强一致性、真正同步复制)。
三、解决办法:
MySQL5.6.30版本,binlog模式为ROW。
show slave status\G,可以看到如下报错:
- Slave_SQL_Running: NO
Last_SQL_Errno: 1032- Last_SQL_Error: Worker 3 failed executing transaction '' at master log mysql-bin.000003, end_log_pos 440267874;
- Could not execute Delete_rows event on table db_test.tbuservcbgolog; Can't find record in 'tbuservcbgolog', Error_code: 1032;
- handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.000003, end_log_pos 440267874
从上可以看出,是SQL_THREAD线程出错,错误号码1032。是在应用delete db_test.tbuservcbgolog 表中一行数据的事件时,由于这条数据
不存在而出错。此事件在主服务器Master binlog中的位置是 mysql-bin.000003, end_log_pos 440267874。(当然可以在从服务器Slave的Relay
log中查找,具体方法见最后)
方法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:还原被删除的数据
根据错误提示信息,用mysqlbinlog找到该条数据event SQL并逆向手动执行。如delete 改成insert。
本例中,此事件在主服务器Master binlog中的位置是 mysql-bin.000003, end_log_pos 440267874。
1)利用mysqlbinlog工具找出440267874的事件
/usr/local/mysql-5.6.30/bin/mysqlbinlog --base64-output=decode-rows -vv mysql-bin.000003 |grep -A 20 '440267874'
或者/usr/local/mysql-5.6.30/bin/mysqlbinlog --base64-output=decode-rows -vv mysql-bin.000003 --stop-position=440267874 | tail -20
或者usr/local/mysql-5.6.30/bin/mysqlbinlog --base64-output=decode-rows -vv mysql-bin.000003 > decode.log
( 或者加上参数-d, --database=name 来进一步过滤)
- #160923 20:01:27 server id 1223307 end_log_pos 440267874 CRC32 0x134b2cbc Delete_rows: table id 319 flags: STMT_END_F
- ### DELETE FROM `db_99ducj`.`tbuservcbgolog`
- ### WHERE
- ### @1=10561502 /* INT meta=0 nullable=0 is_null=0 */
- ### @2=1683955 /* INT meta=0 nullable=0 is_null=0 */
- ### @3=90003 /* INT meta=0 nullable=0 is_null=0 */
- ### @4=0 /* INT meta=0 nullable=0 is_null=0 */
- ### @5='2016-09-23 17:02:24' /* DATETIME(0) meta=0 nullable=1 is_null=0 */
- ### @6=NULL /* DATETIME(0) meta=0 nullable=1 is_null=1 */
- # at 440267874
以上为检索出来的结果,事务语句为:delete from db_99ducj.tbuservcbgolog where @1=10561502 and @2=1683955 ...
其中@1 @2 @3...分别对应表tbuservcbgolog的列名,填补上即可。
我们可以逆向此SQL 将deleter 变成Insert,手动在从库上执行此Insert SQL,之后restart slave就好了。
[MySQL复制] SQL_ERROR 1032解决办法(non-gtid env)的更多相关文章
- [MySQL] SQL_ERROR 1032解决办法
一.缘由: 在主主同步的测试环境,由于业务侧没有遵循同一时间只写一个点的原则,造成A库上删除了一条数据,B库上在同时更新这条数据. 由于异步和网络延时,B的更新event先到达A端执行,造成A端找不到 ...
- MySQL常见错误及其解决办法
1.连接类 (1).问题:MySQL server has gone away 解决办法:出现该报错常见的原因是服务器超时了并且关闭了连接.缺省地,如果没有事情发生,服务器在 8个小时后关闭连接.如 ...
- ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) 的解决办法
更换mysql数据目录后出现ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql ...
- mysql主从延时临时解决办法
主从延时临时解决办法: 主从延迟严重的原因很多,其中有以下原因: 一.由于无主键大表的delete 和update导致. mysql 主从复制时.如果表上没有主键.会导致update和delete操 ...
- MySQL远程访问失败的解决办法
SQL连接预备知识:转载自https://jingyan.baidu.com/article/3ea51489e6cfbe52e61bba25.html问题:我想在另一个电脑通过navicat登陆本机 ...
- Mac MySQL启动不了解决办法(MySQL卸载重新安装教程)
一段时间没用MySQL,今天使用时突然发现启动不了了,怎么点start都没用,或者输入密码了 还是没用... 好急...找了一圈资料,没发现特别好的解决办法,只能使用大招了----->< ...
- 仓储管理系统500bug记录一下mysql 8小时超时解决办法
HTTP Status 500 - Request processing failed; nested exception is org.springframework.dao.TransientDa ...
- Entity Framework EF6使用 MySql创建数据库异常解决办法
EF6使用MySQL数据库时,第一次创建数据库出现“Specified key was too long; max key length is 767 bytes”错误,解决办法请见以下连接. htt ...
- PHP多次调用Mysql存储过程报错解决办法
PHP多次调用Mysql数据库的存储过程会出现问题,主要问题为存储过程中执行多次SQL语句不能一一释放导致的,网上找了一些解决办法,比如使用 multi_query 然后一个一个释放,但是发现根本不适 ...
随机推荐
- Linux安装go语言开发包
1.下载go语言安装包,eg:go1.7.1.linux-amd64.tar.gz2.安装go语言 $ cd /home/xm6f/dev $ tar -zxvf go1.7.1.linux-amd6 ...
- kafka-java客户端连接
使用java客户端, kafkaproducer, kafkaconsumer进行kafka的连接 注: 0.10 版本之后, 连接kafka只需要brokerip即可, 不需要zookeeper的信 ...
- 第一个 smarty 程序
原来使用普通的 PHP 代码,只需要一个文件,就可以完成功能. 而使用了 smarty后,会分成两个文件来完成,一个是模板文件,用于显示内容,一般后缀名为 *.tpl (但实际上任何后缀名都可以,建议 ...
- 实现比较器接口IComparable<T>,让自定义类型数组也能排序
using System; namespace LinqDemo1 { class Program { static void Main(string[] args) { Person[] perso ...
- 【JS点滴】substring和substr以及slice和splice的用法和区别。
那么就由一道笔试题引入吧,已知有字符串a=”get-element-by-id”,写一个function将其转化成驼峰表示法”getElementById”: var a = "get-el ...
- LR监测windows资源一般监测哪几个项?
计数器 指标 1. 平均事务响应时间 Average Transation Response Time 优秀:<2s 良好:2-5s 及格:6-10s ...
- jQuery中的函数汇总1
欢迎访问我的github:huanshen,有我的源码解析 1.each 跟for循环很像,但是更有用,如果你理解了就知道了. // 遍历一个数组或者对象 // obj 是需要遍历的数组或者对象 // ...
- 一个人的旅行(hdu2066)Dijkstra算法模版
一个人的旅行 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- Java - ArrayList源码分析
java提高篇(二一)-----ArrayList 一.ArrayList概述 ArrayList是实现List接口的动态数组,所谓动态就是它的大小是可变的.实现了所有可选列表操作,并允许包括 nul ...
- Linux常用基本命令(file,chown)
1,file命令作用,查看文件的类型 ghostwu@dev:~$ .htm ./linux/rename ghostwu@dev:~$ .htm ./linux/rename/.htm: empty ...