解决线上主从复制1032报错

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解决线上主从复制1032报错相关的知识,希望对你有一定的参考价值。

出错的原因是,主库服务异常重启,导致slave库复制报1032错

也有这样的情况,slave没有限制只读权限,开发或者运维人员在slave库上误删数据,导致生成主库update数据时,由于slave库上记录被提前误删,导致主从复制报错1032,主从不同步了
解决方法:

很多新手选择了my.cnf可配置slave-skip-errors=1032 从而跳过日志中1032 ERROR报错,或者set global sql_slave_skip_counter=1;stop slave; start slave;

然而上面的方式都是不可取的,因为slave库上没这条,master库再更新时,slave还会报错的。所以这个1032的报错必须解决。如何解决呢,咱们下面来细说下

show master status G;
复制报错如下:

Could not execute Update_rows event on table appdb.hlz_ad_voucher; 
 Can‘t find record in ‘hlz_ad_voucher‘, Error_code: 1032;
 handler error HA_ERR_KEY_NOT_FOUND; the event‘s master log mysql-bin.000427, end_log_pos 9279278

解决办法:根据报错结束的binglog位置点,通过解析主库的binlog日志文件来提取出当前正在update更新主库上的记录时的这条SQL记录。

下面在master上是获取到update更新记录的SQL方法:

 [root@localhost ~]# mysqlbinlog --no-defaults --base64-output=decode-rows -v -v /data/mysql/binlog/mysql-bin.000427|grep -A 15 9279278|sed -n ‘/### UPDATE `appdb`.`hlz_ad_voucher`/,/COMMIT/p‘|grep -B 100 ‘# at 9279278‘
### UPDATE `appdb`.`hlz_ad_voucher`
### WHERE
###   @1=9400072 /* INT meta=0 nullable=0 is_null=0 */
###   @2=2994652 /* INT meta=0 nullable=0 is_null=0 */
###   @3=0.50 /* DECIMAL(5,2) meta=1282 nullable=0 is_null=0 */
###   @4=0 /* INT meta=0 nullable=0 is_null=0 */
###   @5=0 /* INT meta=0 nullable=0 is_null=0 */
###   @6=1 /* INT meta=0 nullable=0 is_null=0 */
###   @7=0 /* INT meta=0 nullable=0 is_null=0 */
###   @8=‘2020:05:05‘ /* DATE meta=0 nullable=0 is_null=0 */
###   @9=‘新人赠送‘ /* VARSTRING(1020) meta=1020 nullable=0 is_null=0 */
###   @10=‘2020-05-05 21:14:20.745‘ /* DATETIME(3) meta=3 nullable=0 is_null=0 */
###   @11=‘2020-05-05 21:14:20.745‘ /* DATETIME(3) meta=3 nullable=0 is_null=0 */
###   @12=0 /* INT meta=0 nullable=0 is_null=0 */
###   @13=0 /* INT meta=0 nullable=0 is_null=0 */
--
#at 9279278

把获取到update更新记录的SQL转换成insert into SQL语句,然后在slave库对应的表插入,最后stop slave;start slave;show slave statusG


[root@localhost ~]# mysqlbinlog --no-defaults --base64-output=decode-rows -v -v /data/mysql/binlog/mysql-bin.000427|grep -A 15 9279278|sed -n ‘/### UPDATE `appdb`.`hlz_ad_voucher`/,/COMMIT/p‘|grep -B 100 ‘# at 9279278‘|sed ‘s/### //g;s//*.*/,/g;s/UPDATE/INSERT INTO/g;s/WHERE/SELECT/g;‘ | sed -r ‘s/(@13.*),/1;/g‘ | sed ‘s/@([0-9]+)=//g;‘ 
INSERT INTO `appdb`.`hlz_ad_voucher`
SELECT
  9400072 ,
  2994652 ,
  0.50 ,
  0 ,
  0 ,
  1 ,
  0 ,
  ‘2020:05:05‘ ,
  ‘新人赠送‘ ,
  ‘2020-05-05 21:14:20.745‘ ,
  ‘2020-05-05 21:14:20.745‘ ,
  0 ,
  0 ;
--
#at 9279278

一直重复上面的方法在master的binlog文件中提取到SQL,然后转化成insert into SQL,然后在插入slave库对应的表,stop slave;start slave; 直到不再报错为止

以上是关于解决线上主从复制1032报错的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 主从复制 ERROR-1032

[MySQL复制] SQL_ERROR 1032解决办法(non-gtid env)

[MySQL] SQL_ERROR 1032解决办法

mysql主从复制常见问题

mysql主从复制常见问题

如何快速解决MySQL 1032 主从错误