出錯的緣由是,主庫服務異常重啓,致使slave庫複製報1032錯mysql
也有這樣的狀況,slave沒有限制只讀權限,開發或者運維人員在slave庫上誤刪數據,致使生成主庫update數據時,因爲slave庫上記錄被提早誤刪,致使主從複製報錯1032,主從不一樣步了。
解決方法:sql
不少新手選擇了my.cnf可配置slave-skip-errors=1032 從而跳過日誌中1032 ERROR報錯,或者set global sql_slave_skip_counter=1;stop slave; start slave;app
然而上面的方式都是不可取的,由於slave庫上沒這條,master庫再更新時,slave還會報錯的。因此這個1032的報錯必須解決。如何解決呢,我們下面來細說下運維
show master status \G;
複製報錯以下:ide
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方法:code
[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 status\Gip
[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; 直到再也不報錯爲止。開發