對MySQL數(shù)據(jù)庫復(fù)制中斷的處理
作者:star_glm
在復(fù)制中,有時會因為復(fù)制報錯,而中斷復(fù)制。通常是因為一個SQL語句在主庫執(zhí)行時是正常的,但同步到從庫時,因為各種原因,找不到對應(yīng)的數(shù)據(jù),造成執(zhí)行SQL失敗,報出復(fù)制錯誤。下面主要寫了幾個常見的錯誤。
前言
在復(fù)制中,有時會因為復(fù)制報錯,而中斷復(fù)制。通常是因為一個SQL語句在主庫執(zhí)行時是正常的,但同步到從庫時,因為各種原因,找不到對應(yīng)的數(shù)據(jù),造成執(zhí)行SQL失敗,報出復(fù)制錯誤。下面主要寫了幾個常見的錯誤。
復(fù)制中斷的情況和處理
復(fù)制中斷的情況:
- 1062錯誤:在寫入數(shù)據(jù)使,從庫已存在了。多出現(xiàn)自增長ID已存在。
- 1032錯誤:從庫出現(xiàn)少數(shù)據(jù),update、delete時,找不到相應(yīng)的記錄。
- 其他:DDL操作時報錯
對這些情況的處理:
- 遇到該問題,要想到要怎樣滿足復(fù)制,而不是跳過該事務(wù);不建議跳過錯誤,遇到錯誤應(yīng)該修正過來,再連接主庫復(fù)制,否則從庫的數(shù)據(jù)會越來越不一致!
- 手工修復(fù)操作有些慢,可以針對1062和1032錯誤,寫一個自動化監(jiān)控改正腳本。
- 注意:若經(jīng)常數(shù)據(jù)不一致,選擇業(yè)務(wù)低峰期,檢驗一次數(shù)據(jù)(pt-table-checksum),查看是否數(shù)據(jù)一致,若檢查出太多的數(shù)據(jù)不一致,該從庫就不可再用了,再創(chuàng)建一個從庫!
常見的復(fù)制錯誤
【錯誤碼-1062】
處理操作:
- 處理這種情況,需要和業(yè)務(wù)協(xié)商,或在公司內(nèi)形成一個規(guī)定,遇到這種情況要怎樣做(在從庫將這條重復(fù)數(shù)據(jù)刪除還是補充到主庫)。
- 通常,在從庫刪除該條數(shù)據(jù),讓復(fù)制繼續(xù)進(jìn)行。
- 使用pt-slave-restart來修復(fù)問題,它會會跳過錯誤,建議先處理錯誤,才可以保證數(shù)據(jù)的一致性
具體操作:
- 定位到該事物
- 傳統(tǒng)復(fù)制:Exec_Master_Log_Pos 與 last_error中的end_log_pos 中間的事務(wù)
- GTID復(fù)制:executed_gtid_set : xxxxx:1-5 ,即第6個事務(wù)報錯了。
- master:mysqlbinlog -vv --base64-output=decode-rows --start-position ……
- 在slave上刪除該條數(shù)據(jù),然后連接復(fù)制
- > set sql_log_bin=0; # 先禁止當(dāng)前會話的操作記錄寫到binlog
- > delete from xn_db.t_order_produce where id=35197;
- > set sql_log_bin=1; # 恢復(fù)正常
- > start slave sql_thread; # 啟動SQL線程
【錯誤碼-1032】
1032錯誤 分為: update錯誤 和 delete錯誤。
update 處理操作:
- 在主庫上獲取出來主鍵的值(不需要具體恢復(fù)出來),只要滿足SQL執(zhí)行成功即可。
update 具體操作:
- 定位到該事物
- 傳統(tǒng)復(fù)制:Exec_Master_Log_Pos 與 last_error中的end_log_pos 中間的事務(wù)
- GTID復(fù)制:executed_gtid_set : xxxxx:1-5 ,即第6個事務(wù)報錯了。
- master:mysqlbinlog -vv --base64-output=decode-rows --start-position ……
- 將沒有的數(shù)據(jù)創(chuàng)建出來,只符合錯誤事務(wù)執(zhí)行成功即可
- > set sql_log_bin=0;
- > insert into xn_db.t_mes(id) values(35592);
- > set sql_log_bin=1;
- > start slave sql_thread;
delete 處理操作:
- 由于從庫沒有該數(shù)據(jù),致使刪除失敗,可以跳過該錯誤,因為跳過該刪除事務(wù)相當(dāng)于不執(zhí)行該delete語句,和在從庫上沒執(zhí)行之前是一樣的,那些數(shù)據(jù)都不會存在于從庫中。
delete 具體操作:
- 傳統(tǒng)復(fù)制:
- > stop slave;
- > set global sql_slave_skip_counter=1; # 跳過一個事務(wù)
- > start slave;
- GTID復(fù)制:
- > stop slave;
- > set gtid_net='xxxxx:6' # 跳過報錯事務(wù)6
- > begin;commit; # 執(zhí)行一個空事務(wù),即GTID為6的事務(wù)
- > set gtid_next='AUTOMATIC';
- > start salve;
責(zé)任編輯:龐桂玉
來源:
star_glm的博客