解决线上主从复制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
  • 1.
  • 2.
  • 3.

** 解决办法:**根据报错结束的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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.

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


[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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.

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

再举一个MySQL主从复制1032故障错误案例:

** -A 39 参数说明**:设置出错的表的字段+2 ,例如出错表的字段37, 加2 -A 39
** s/(@37.*) 参数说明: ** @37为此表的字段总数

/usr/local/mysql//bin/mysqlbinlog --no-defaults --base64-output=decode-rows -v -v /data/mysql/3306/binlog/mysql-bin.000002|grep -A 39 77367718|sed -n '/### UPDATE `tcvd_movies`.`td_vod`/,/COMMIT/p'|grep -B 100 '# at 77367718'|sed 's/### //g;s/\/\*.*/,/g;s/UPDATE/INSERT INTO/g;s/WHERE/SELECT/g;' | sed -r 's/(@37.*),/\1;/g' | sed 's/@\([0-9]\+\)=//g;' 
  • 1.

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

[root@192-200-102-74 binlog]# /usr/local/mysql//bin/mysqlbinlog --no-defaults --base64-output=decode-rows -v -v /data/mysql/3306/binlog/mysql-bin.000002|grep -A 39 77367718|sed -n '/### UPDATE `tcvd_movies`.`td_vod`/,/COMMIT/p'|grep -B 100 '# at 77367718'|sed 's/### //g;s/\/\*.*/,/g;s/UPDATE/INSERT INTO/g;s/WHERE/SELECT/g;' | sed -r 's/(@37.*),/\1;/g' | sed 's/@\([0-9]\+\)=//g;'
INSERT INTO `tcvd_movies`.`td_vod`
SELECT
  5899 ,
  2 ,
  '3532' ,
  1 ,
  9 ,
  '星际旅行7:斗转星移' ,
  '星际迷航7,星空奇遇记7:星空奇兵(港),星舰奇航记7:日换星移(台),星际争霸战7,星舰迷航记7,Star Trek 7,Star Trek: Generations' ,
  'xingjilvxing7douzhuanxingyi' ,
  '动作,悬疑,科幻' ,
  'upload/vod/20200704-1/7ebfe50bcd882d805938f01c0c2185ba.jpg' ,
  '' ,
  '' ,
  '帕特里克·斯图尔特,乔纳森·弗雷克斯,布伦特·斯皮内,莱瓦尔·伯顿' ,
  'David Carson' ,
  '罗纳德·D·摩尔,布兰农·布拉加' ,
  '' ,
  '寇克等人作为嘉宾乘新企业号试航,途中收到救援任务……而在另一时空,索伦博士正阴谋毁灭星球,攻击企业号。唯一能够帮助新船长皮卡特来阻止索伦的,只有销声匿迹了78年的寇克船长。' ,
  'BD1280高清中英双字版' ,
  '' ,
  0 ,
  '0' ,
  '' ,
  '' ,
  '美国' ,
  '英语' ,
  '1994' ,
  '' ,
  '正片' ,
  '6789.480000000004' ,
  1 ,
  1293904 ,
  7.1                  ,
  0 ,
  1594967701 ,
  1594967701 ,
  0 ,
  1594968302 ;
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
posted @ 2020-05-06 16:12  勤奋的蓝猫  阅读(19)  评论(0编辑  收藏  举报  来源