复制中错误处理
传统复制错误跳过:
stop slave sql_thread ;
set global slq_slave_skip_counter=1;
start slave sql_thread ;
GTID复制错误跳过:
stop slave sql_thread ;
set gtid_next='uuid:N';
begin;commit;
set gtid_next='automatic';
start slave sql_thread ;
注意:
若是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;
start slave sql_thread ;
1
|
<span style=
"font-size:12px;font-family:'宋体', SimSun;"
>例:<br>slave:<br>root@localhost [testdb]>
create
table
t2(c1
int
,c2
varchar
(20));<br>master:<br>root@localhost [testdb]>
create
table
t2(c1
int
,c2
varchar
(20));<br>root@localhost [testdb]>show slave status\G<br>......<br> Last_Error: Error
'Table '
t2
' already exists'
on
query.
Default
database
:
'testdb'
. Query:
'create table t2(c1 int,c2 varchar(20))'
<br>.......<br>解决方法:<br>slave:<br>#
drop
操作不记录从库的binlog,这一步的作用是防止在以后主从切换的时候,把主库的t2表干掉<br>root@localhost [testdb]>
set
sql_log_bin=0; <br>root@localhost [testdb]>
drop
table
t2;<br>root@localhost [testdb]>
set
sql_log_bin=1;<br>root@localhost [testdb]>start slave sql_thread;</span>
|
(2)insert主键冲突的错误error1062
解决方法:直接删除从库冲突主键
1
|
<span style=
"font-size:12px;font-family:'宋体', SimSun;"
>例:<br>slave:<br>root@localhost [testdb]>
set
sql_log_bin=0;<br>root@localhost [testdb]>
insert
into
t1
values
(2,
'bbb'
);<br>root@localhost [testdb]>
set
sql_log_bin=1;<br>master:<br>root@localhost [testdb]>
insert
into
t1
values
(2,
'bbbbbb'
);<br>slave :<br>root@localhost [testdb]>show slave status\G<br>Last_Errno: 1062<br> Last_Error: Could
not
execute
Write_rows event
on
table
testdb.t1; Duplicate entry
'2'
for
key
'PRIMARY'
, 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]>
set
sql_log_bin=0;<br>root@localhost [testdb]>
delete
from
t1
where
c1=2;<br>root@localhost [testdb]>
set
sql_log_bin=1;<br>root@localhost [testdb]>start slave sql_thread;</span>
|
(3)update找不到记录error1032
唯一的方法:伪造符合条件的数据
1
|
<span style=
"font-size:12px;font-family:'宋体', SimSun;"
>例:<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]>
set
sql_log_bin=1;<br>root@localhost [testdb]>
update
t1
set
c2=
'aaaaaa'
where
c1=1;<br>slave:<br>root@localhost [testdb]>show slave status\G<br>......<br> Last_Error: Could
not
execute
Update_rows event
on
table
testdb.t1; Can
't find record in '
t1
', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event'
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
--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>
|
(4)delete找不到错误 error1032
方法一:伪造符合条件的数据
1
|
<span style=
"font-size:12px;font-family:'宋体', SimSun;"
>例:<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]>
set
sql_log_bin=1;<br>root@localhost [testdb]>
delete
from
t1
where
c1=1;<br>slave:<br>root@localhost [testdb]>show slave status\G<br>......<br> Slave_IO_Running: Yes<br> Slave_SQL_Running:
No
<br> Exec_Master_Log_Pos: 905
--从库已经成功执行主库到的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>
|
本文转自 Darren_Chen 51CTO博客,原文链接:http://blog.51cto.com/darrenmemos/1921192,如需转载请自行联系原作者