複制中錯誤處理
傳統複制錯誤跳過:
stop slave sql_thread ;
set global slq_slave_skip_counter=1;
start slave sql_thread ;
GTID複制錯誤跳過:
set gtid_next='uuid:N';
begin;commit;
set gtid_next='automatic';
注意:
若是binlog+pos複制,使用:
set global sql_salve_skip_counter=1;
代替下面步驟:
root@localhost [testdb]>set gtid_next='f0e27aec-b275-11e6-9c17-000c29565380:13';
root@localhost [testdb]>begin;commit;
root@localhost [testdb]>set gtid_next='automatic';
主從複制錯誤分類及處理方式
(1)主庫create table ,從庫已經存在,以主庫為準處理方法:
slave:
set sql_log_bin=0;
drop table t1;
set sql_log_bin=1;
1
<code><span style=</code><code>"font-size:12px;font-family:'宋體', SimSun;"</code><code>>例:<br>slave:<br>root@localhost [testdb]></code><code>create</code> <code>table</code> <code>t2(c1 </code><code>int</code><code>,c2 </code><code>varchar</code><code>(20));<br>master:<br>root@localhost [testdb]></code><code>create</code> <code>table</code> <code>t2(c1 </code><code>int</code><code>,c2 </code><code>varchar</code><code>(20));<br>root@localhost [testdb]>show slave status\G<br>......<br> Last_Error: Error </code><code>'Table '</code><code>t2</code><code>' already exists'</code> <code>on</code> <code>query. </code><code>Default</code> <code>database</code><code>: </code><code>'testdb'</code><code>. Query: </code><code>'create table t2(c1 int,c2 varchar(20))'</code><code><br>.......<br>解決方法:<br>slave:<br>#</code><code>drop</code><code>操作不記錄從庫的binlog,這一步的作用是防止在以後主從切換的時候,把主庫的t2表幹掉<br>root@localhost [testdb]></code><code>set</code> <code>sql_log_bin=0; <br>root@localhost [testdb]></code><code>drop</code> <code>table</code> <code>t2;<br>root@localhost [testdb]></code><code>set</code> <code>sql_log_bin=1;<br>root@localhost [testdb]>start slave sql_thread;</span></code>
(2)insert主鍵沖突的錯誤error1062
解決方法:直接删除從庫沖突主鍵
<code><span style=</code><code>"font-size:12px;font-family:'宋體', SimSun;"</code><code>>例:<br>slave:<br>root@localhost [testdb]></code><code>set</code> <code>sql_log_bin=0;<br>root@localhost [testdb]></code><code>insert</code> <code>into</code> <code>t1 </code><code>values</code><code>(2,</code><code>'bbb'</code><code>);<br>root@localhost [testdb]></code><code>set</code> <code>sql_log_bin=1;<br>master:<br>root@localhost [testdb]></code><code>insert</code> <code>into</code> <code>t1 </code><code>values</code><code>(2,</code><code>'bbbbbb'</code><code>);<br>slave :<br>root@localhost [testdb]>show slave status\G<br>Last_Errno: 1062<br> Last_Error: Could </code><code>not</code> <code>execute</code> <code>Write_rows event </code><code>on</code> <code>table</code> <code>testdb.t1; Duplicate entry </code><code>'2'</code> <code>for</code> <code>key</code> <code>'PRIMARY'</code><code>, Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log mysql-bin.000029, end_log_pos 2796<br>slave :<br>root@localhost [testdb]></code><code>set</code> <code>sql_log_bin=0;<br>root@localhost [testdb]></code><code>delete</code> <code>from</code> <code>t1 </code><code>where</code> <code>c1=2;<br>root@localhost [testdb]></code><code>set</code> <code>sql_log_bin=1;<br>root@localhost [testdb]>start slave sql_thread;</span></code>
(3)update找不到記錄error1032
唯一的方法:僞造符合條件的資料
<code><span style=</code><code>"font-size:12px;font-family:'宋體', SimSun;"</code><code>>例:<br>master:<br>root@localhost [testdb]></code><code>set</code> <code>sql_log_bin=0;<br>root@localhost [testdb]></code><code>insert</code> <code>into</code> <code>t1 </code><code>values</code><code>(1,</code><code>'aaa'</code><code>);<br>root@localhost [testdb]></code><code>set</code> <code>sql_log_bin=1;<br>root@localhost [testdb]></code><code>update</code> <code>t1 </code><code>set</code> <code>c2=</code><code>'aaaaaa'</code> <code>where</code> <code>c1=1;<br>slave:<br>root@localhost [testdb]>show slave status\G<br>......<br> Last_Error: Could </code><code>not</code> <code>execute</code> <code>Update_rows event </code><code>on</code> <code>table</code> <code>testdb.t1; Can</code><code>'t find record in '</code><code>t1</code><code>', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event'</code><code>s master log mysql-bin.000029, end_log_pos 2529<br> Skip_Counter: 0<br> Exec_Master_Log_Pos: 2283<br>master:<br>[root@Darren1 logs]# mysqlbinlog </code><code>--base64-output=decode-rows --verbose --start-position=2283 --stop-position=2529 mysql-bin.000029<br>......<br>### UPDATE `testdb`.`t1`<br>### WHERE<br>### @1=1<br>### @2='aaa'<br>### SET<br>### @1=1<br>### @2='aaaaaa'<br>slave:<br>root@localhost [testdb]>set sql_log_bin=0;<br>root@localhost [testdb]>insert into t1 values(1,'aaa');<br>root@localhost [testdb]>set sql_log_bin=1;<br>root@localhost [testdb]>start slave sql_thread;</span></code>
(4)delete找不到錯誤 error1032
方法一:僞造符合條件的資料
<code><span style=</code><code>"font-size:12px;font-family:'宋體', SimSun;"</code><code>>例:<br>master:<br>root@localhost [testdb]></code><code>set</code> <code>sql_log_bin=0;<br>root@localhost [testdb]></code><code>insert</code> <code>into</code> <code>t1 </code><code>values</code><code>(1,</code><code>'aaa'</code><code>);<br>root@localhost [testdb]></code><code>set</code> <code>sql_log_bin=1;<br>root@localhost [testdb]></code><code>delete</code> <code>from</code> <code>t1 </code><code>where</code> <code>c1=1;<br>slave:<br>root@localhost [testdb]>show slave status\G<br>......<br> Slave_IO_Running: Yes<br> Slave_SQL_Running: </code><code>No</code><code><br> Exec_Master_Log_Pos: 905 </code><code>--從庫已經成功執行主庫到的postion點<br>Last_SQL_Error: Could not execute Delete_rows event on table testdb.t1; Can't find record in 't1', Error_code: 1032; handler error HA_ERR_END_OF_FILE; the event's master log mysql-bin.000029, end_log_pos 1138 --從庫執行結束點<br>maser:<br>[root@Darren1 logs]# mysqlbinlog --base64-output=decode-rows --verbose --start-position=905 --stop-position=1138 mysql-bin.000029<br>......<br>### DELETE FROM `testdb`.`t1`<br>### WHERE<br>### @1=1<br>### @2='aaa'<br>slave:<br>root@localhost [testdb]>set sql_log_bin=0;<br>root@localhost [testdb]>insert into t1 values(1,'aaa');<br>root@localhost [testdb]>set sql_log_bin=1;<br>root@localhost [testdb]>start slave sql_thread;<br>方法二:從庫跳過沒有成功删除掉的行記錄對應的GTID<br>master:<br>root@localhost [testdb]>set sql_log_bin=0;<br>root@localhost [testdb]>insert into t1 values(1,'aaa');<br>root@localhost [testdb]>insert into t1 values(2,'bbb');<br>root@localhost [testdb]>set sql_log_bin=1;<br>root@localhost [testdb]>delete from t1 where c1 =1;<br>root@localhost [testdb]>delete from t1 where c1 =2;<br>root@localhost [testdb]>insert into t1 values(3,'ccc');<br>slave:<br>root@localhost [testdb]>show slave status\G<br>......<br>Last_SQL_Error: Could not execute Delete_rows event on table testdb.t1; Can't find record in 't1', Error_code: 1032; handler error HA_ERR_END_OF_FILE; the event's master log mysql-bin.000029, end_log_pos 1402<br> Retrieved_Gtid_Set: f0e27aec-b275-11e6-9c17-000c29565380:1-14 --從庫結束的GTID點<br> Executed_Gtid_Set: ab6320bc-d158-11e6-88f8-000c29c1b8a9:1,<br> f0e27aec-b275-11e6-9c17-000c29565380:10-11 --從庫成功執行過的GTID<br>slave:<br>root@localhost [testdb]>stop slave;<br>root@localhost [testdb]>set gtid_next='f0e27aec-b275-11e6-9c17-000c29565380:12';<br>root@localhost [testdb]>begin;commit;<br>root@localhost [testdb]>set gtid_next='f0e27aec-b275-11e6-9c17-000c29565380:13';<br>root@localhost [testdb]>begin;commit;<br>root@localhost [testdb]>set gtid_next='automatic';<br>root@localhost [testdb]>start slave;</span></code>
本文轉自 Darren_Chen 51CTO部落格,原文連結:http://blog.51cto.com/darrenmemos/1921192,如需轉載請自行聯系原作者