[MySQL] SQL_ERROR 1032解決辦法

來源:互聯網
上載者:User

標籤:

一、緣由:

  在主主同步的測試環境,由於業務側沒有遵循同一時間唯寫一個點的原則,造成A庫上刪除了一條資料,B庫上在同時更新這條資料。

由於非同步和網路延時,B的更新event先到達A端執行,造成A端找不到這條記錄,故SQL_THREAD報錯1032,主從同步停止。

 

二、錯誤說明:

  MySQL主從同步的1032錯誤,一般是指要更改的資料不存在,SQL_THREAD提取的日誌無法應用故報錯,造成同步失敗

(Update、Delete、Insert一條已經delete的資料)。

  1032的錯誤本身對資料一致性沒什麼影響,影響最大的是造成了同步失敗、同步停止。

  如果主主(主從)有同步失敗,要第一時間查看並著手解決。因為不同步,會造成讀取資料的不一致。應在第一時間恢複同步,

盡量減少對業務的影響。然後再具體分析不同步的原因,手動或者自動修複資料,並做pt-table-checksum資料一致性檢查。

  目前業務一般是做主主同步,主主同步由於是非同步更新,存在更新衝突的問題,且很容易引起SQL ERROR 1032錯誤。這個應該在業務側解決,

保證同一時間只更新資料庫的一個點,類似單點寫入。我們的解決辦法是:寫一個底層資料庫調用庫,可能涉及到更新衝突的操作,都調用這個庫。

在設定檔裡,配2個點的資料庫A、B,保證一直都更新A庫,如果A庫不可用,就去更新B庫。

  另外,如果是對資料一致性要求較高的情境,比如涉及到錢,建議用PXC(強一致性、真正同步複製)。

 

三、解決辦法:

  MySQL5.6.30版本,binlog模式為ROW。

  show slave status\G,可以看到如下報錯:

 

Slave_SQL_Running: NO
Last_SQL_Errno: 1032Last_SQL_Error: Worker 3 failed executing transaction ‘‘ at master log mysql-bin.000003, end_log_pos 440267874;         Could not execute Delete_rows event on table db_test.tbuservcbgolog; Can‘t find record in ‘tbuservcbgolog‘, Error_code: 1032;          handler error HA_ERR_KEY_NOT_FOUND; the event‘s master log mysql-bin.000003, end_log_pos 440267874

 

 

  從上可以看出,是SQL_THREAD線程出錯,錯誤號碼1032。是在應用delete db_test.tbuservcbgolog 表中一行資料的事件時,由於這條資料

不存在而出錯。此事件在主伺服器Master binlog中的位置是 mysql-bin.000003, end_log_pos 440267874。(當然可以在從伺服器Slave的Relay

log中尋找,具體方法見最後) 

 

方法1:跳過錯誤Event

先跳過這一條錯誤(event),讓主從同步恢複正常。(或者N條event,一條一條跳過)

  stop slave;

  set global sql_slave_skip_counter=1;

  start slave;

 

方法2:跳過所有1032錯誤

更改my.cnf檔案,在Replication settings下添加:

  slave-skip-errors = 1032

並重啟資料庫,然後start salve。

注意:因為要重啟資料庫,不推薦,除非錯誤事件太多。

 

方法3:還原被刪除的資料

根據錯誤提示資訊,用mysqlbinlog找到該條資料event SQL並逆向手動執行。如delete 改成insert。

本例中,此事件在主伺服器Master binlog中的位置是 mysql-bin.000003, end_log_pos 440267874。

1)利用mysqlbinlog工具找出440267874的事件

/usr/local/mysql-5.6.30/bin/mysqlbinlog --base64-output=decode-rows -vv mysql-bin.000003 |grep -A 20 ‘440267874‘

或者/usr/local/mysql-5.6.30/bin/mysqlbinlog --base64-output=decode-rows -vv mysql-bin.000003 --stop-position=440267874 | tail -20

或者usr/local/mysql-5.6.30/bin/mysqlbinlog --base64-output=decode-rows -vv mysql-bin.000003 > decode.log 

( 或者加上參數-d, --database=name 來進一步過濾)

#160923 20:01:27 server id 1223307  end_log_pos 440267874 CRC32 0x134b2cbc      Delete_rows: table id 319 flags: STMT_END_F### DELETE FROM `db_99ducj`.`tbuservcbgolog`### WHERE###   @1=10561502 /* INT meta=0 nullable=0 is_null=0 */###   @2=1683955 /* INT meta=0 nullable=0 is_null=0 */###   @3=90003 /* INT meta=0 nullable=0 is_null=0 */###   @4=0 /* INT meta=0 nullable=0 is_null=0 */###   @5=‘2016-09-23 17:02:24‘ /* DATETIME(0) meta=0 nullable=1 is_null=0 */###   @6=NULL /* DATETIME(0) meta=0 nullable=1 is_null=1 */# at 440267874

 

以上為檢索出來的結果,事務語句為:delete from db_99ducj.tbuservcbgolog where @1=10561502 and @2=1683955 ...

其中@1 @2 @3...分別對應表tbuservcbgolog的列名,填補上即可。

我們可以逆向此SQL 將deleter 變成Insert,手動在從庫上執行此Insert SQL,之後restart slave就好了。

 

註:通過Relay Log尋找event SQL  http://www.tuicool.com/articles/6RvUnqV

 

[MySQL] SQL_ERROR 1032解決辦法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.