您好,登錄后才能下訂單哦!
今天我們主要看主從模式下,幾種跳過錯誤的方法,跳過事務,還是跳過event?這個在之前其實我們一直都是忽略的,這在我們維護主從過程中,很容易就導致主從數據更大的不一致。
測試機器5.7.18 主從 gtid 開啟
主庫數據
從庫數據
很明顯主從數據有一個不一直的地方,從庫少了一條(28,2) 的數據。這個時候主庫開啟以下事務:
這必然導致從庫出現錯誤,報1032錯誤,如下所示:
mysql> show slave status\G;
1. row
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.56
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000023
Read_Master_Log_Pos: 1928
Relay_Log_File: hadoop2-relay-bin.000012
Relay_Log_Pos: 1595
Relay_Master_Log_File: mysql-bin.000023
Slave_IO_Running: Yes
Slave_SQL_Running: No
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 1032
Last_Error: Could not execute Delete_rows event on table yhtest1.yhtest; Can't find record in 'yhtest', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.000023, end_log_pos 1812
Skip_Counter: 0
Exec_Master_Log_Pos: 1502
Relay_Log_Space: 2384
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 1032
Last_SQL_Error: Could not execute Delete_rows event on table yhtest1.yhtest; Can't find record in 'yhtest', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.000023, end_log_pos 1812
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_UUID: ab8c3ec3-b588-11e7-a769-000c29c57be6
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State:
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp: 171130 23:55:18
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set: ab8c3ec3-b588-11e7-a769-000c29c57be6:96-101
Executed_Gtid_Set: ab8c3ec3-b588-11e7-a769-000c29c57be6:1:77-100,
b6ddfda0-d8bc-4272-a58f-4ea75acbbc79:1-22:1000012-1000013:2000012-2000013,
d24c1c76-b4ef-11e7-969a-000c29a75f68:1-17
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.01 sec)
解決方法:
方法1
5.7下,由于開啟了GTID ,不能通過參數sql_slave_skip_counter=N 跳過錯誤,但是我們可以通過在從庫執行空事物的方法,跳過該錯誤,但要注意,這樣跳過的是一個事物。
從以上報錯信息中,我們很容易看出目前執行位置在: ab8c3ec3-b588-11e7-a769-000c29c57be6:1:77-100 也就是報錯位置在: ab8c3ec3-b588-11e7-a769-000c29c57be6:1:77-101
操作如下:
這個時候,我們再次show slave status\G 看到主從已經恢復正常,但是我們再對比數據,發現我們剛才主庫的三個event 在同一個事件中,被我們全部跳過了,也就是兩個插入數據也沒有在從庫執行!
主庫數據:
從庫數據:
方法2
如果我們覺得以上方法步驟比較多,還可以借住與pt-slave-restart 來進行主從錯誤跳過,跳過方法如下:
這個同樣可以達到跳過主從錯誤的目的!但是其跳過的單位也是事務,同樣也會導致主庫所做的兩個插入沒有在從庫執行!
方法3
利用slave_exec_mode參數來處理主從中遇到的錯誤,操作步驟如下:
stop slave;
set global slave_exec_mode='IDEMPOTENT'; 冪等模式 (默認是STRICT嚴格模式)
start slave;
查看主從數據
發現一致了,也就是說在調整參數slave_exec_mode后,我們跳過的delete 錯誤,但是兩個插入操作任然是執行的,同時,查看錯誤日志,我們發現記錄如下:
方法4
利用參數slave_skip_errors跳過錯誤,操作方法如下,在配置文件中添加slave_skip_errors=1062,1032 等,重啟數據庫,啟動slave ,也會發現測試結果和方法3一致。但是 slave_skip_errors 不支持動態修改!
方法5
從庫1032時,我們直接去主庫找到對應的記錄,插入到從庫當中,restart salve, 1062 時 我們直接在從庫中備份刪除掉沖突記錄即可。
這里稍微提一下:mariadb 的Gtid 錯誤,我們可以采用參數sql_slave_skip_counter=N直接跳過,但是,卻不支持使用pt-slave-restart 跳過錯誤,而且mariadb 的Gtid 和官方不通用,實現原理相同,實現方法缺不同,所以我們也不能用這兩個版本之間搭建gtid主從。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。