解決線上主從複製1032報錯

出錯的緣由是,主庫服務異常重啓,致使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; 直到再也不報錯爲止開發

相關文章
相關標籤/搜索