复制中常见1062和1032错误处理方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了复制中常见1062和1032错误处理方法相关的知识,希望对你有一定的参考价值。

复制中错误处理

传统复制错误跳过:

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;

代替下面步骤:

[email protected] [testdb]>set gtid_next=‘f0e27aec-b275-11e6-9c17-000c29565380:13‘;

[email protected] [testdb]>begin;commit;

[email protected] [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 ;

例:
slave:
[email protected] [testdb]>create table t2(c1 int,c2 varchar(20));
master:
[email protected] [testdb]>create table t2(c1 int,c2 varchar(20));
[email protected] [testdb]>show slave status\G
......
 Last_Error: Error ‘Table ‘t2‘ already exists‘ on query. Default database: ‘testdb‘. Query: ‘create table t2(c1 int,c2 varchar(20))‘
.......
解决方法:
slave:
#drop操作不记录从库的binlog,这一步的作用是防止在以后主从切换的时候,把主库的t2表干掉
[email protected] [testdb]>set sql_log_bin=0;  
[email protected] [testdb]>drop table t2;
[email protected] [testdb]>set sql_log_bin=1;
[email protected] [testdb]>start slave sql_thread;


(2)insert主键冲突的错误error1062

解决方法:直接删除从库冲突主键

例:
slave:
[email protected] [testdb]>set sql_log_bin=0;
[email protected] [testdb]>insert into t1 values(2,‘bbb‘);
[email protected] [testdb]>set sql_log_bin=1;
master:
[email protected] [testdb]>insert into t1 values(2,‘bbbbbb‘);
slave :
[email protected] [testdb]>show slave status\G
Last_Errno: 1062
                   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
slave :
[email protected] [testdb]>set sql_log_bin=0;
[email protected] [testdb]>delete from t1 where c1=2;
[email protected] [testdb]>set sql_log_bin=1;
[email protected] [testdb]>start slave sql_thread;


(3)update找不到记录error1032

唯一的方法:伪造符合条件的数据

例:
master:
[email protected] [testdb]>set sql_log_bin=0;
[email protected] [testdb]>insert into t1 values(1,‘aaa‘);
[email protected] [testdb]>set sql_log_bin=1;
[email protected] [testdb]>update t1 set c2=‘aaaaaa‘ where c1=1;
slave:
[email protected] [testdb]>show slave status\G
......
 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
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 2283
master:
[[email protected] logs]# mysqlbinlog --base64-output=decode-rows --verbose --start-position=2283 --stop-position=2529 mysql-bin.000029
......
### UPDATE `testdb`.`t1`
### WHERE
###   @1=1
###   @2=‘aaa‘
### SET
###   @1=1
###   @2=‘aaaaaa‘
slave:
[email protected] [testdb]>set sql_log_bin=0;
[email protected] [testdb]>insert into t1 values(1,‘aaa‘);
[email protected] [testdb]>set sql_log_bin=1;
[email protected] [testdb]>start slave sql_thread;


(4)delete找不到错误 error1032

方法一:伪造符合条件的数据

例:
master:
[email protected] [testdb]>set sql_log_bin=0;
[email protected] [testdb]>insert into t1 values(1,‘aaa‘);
[email protected] [testdb]>set sql_log_bin=1;
[email protected] [testdb]>delete from t1 where c1=1;
slave:
[email protected] [testdb]>show slave status\G
......
            Slave_IO_Running: Yes
            Slave_SQL_Running: No
          Exec_Master_Log_Pos: 905   --从库已经成功执行主库到的postion点
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 --从库执行结束点
maser:
[[email protected] logs]# mysqlbinlog --base64-output=decode-rows --verbose --start-position=905 --stop-position=1138 mysql-bin.000029
......
### DELETE FROM `testdb`.`t1`
### WHERE
###   @1=1
###   @2=‘aaa‘
slave:
[email protected] [testdb]>set sql_log_bin=0;
[email protected] [testdb]>insert into t1  values(1,‘aaa‘);
[email protected] [testdb]>set sql_log_bin=1;
[email protected] [testdb]>start slave sql_thread;
方法二:从库跳过没有成功删除掉的行记录对应的GTID
master:
[email protected] [testdb]>set sql_log_bin=0;
[email protected] [testdb]>insert into t1 values(1,‘aaa‘);
[email protected] [testdb]>insert into t1 values(2,‘bbb‘);
[email protected] [testdb]>set sql_log_bin=1;
[email protected] [testdb]>delete from t1 where c1 =1;
[email protected] [testdb]>delete from t1 where c1 =2;
[email protected] [testdb]>insert into t1 values(3,‘ccc‘);
slave:
[email protected] [testdb]>show slave status\G
......
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
           Retrieved_Gtid_Set: f0e27aec-b275-11e6-9c17-000c29565380:1-14   --从库结束的GTID点
            Executed_Gtid_Set: ab6320bc-d158-11e6-88f8-000c29c1b8a9:1,
            f0e27aec-b275-11e6-9c17-000c29565380:10-11  --从库成功执行过的GTID
slave:
[email protected] [testdb]>stop slave;
[email protected] [testdb]>set gtid_next=‘f0e27aec-b275-11e6-9c17-000c29565380:12‘;
[email protected] [testdb]>begin;commit;
[email protected] [testdb]>set gtid_next=‘f0e27aec-b275-11e6-9c17-000c29565380:13‘;
[email protected] [testdb]>begin;commit;
[email protected] [testdb]>set gtid_next=‘automatic‘;
[email protected] [testdb]>start slave;

本文出自 “10979687” 博客,请务必保留此出处http://10989687.blog.51cto.com/10979687/1921192

以上是关于复制中常见1062和1032错误处理方法的主要内容,如果未能解决你的问题,请参考以下文章

mysql5.6 传统复制模式下1032和1062故障处理

20180205MySQL 1032和1062跳过错误总结

mysql slave频繁报1032_1062错误

mysql8.0.17复制搭建及其gtid的1062和1032异常

mysql8.0.17复制搭建及其gtid的1062和1032异常

怎样办理DB2中呈现的SQL1032N错误现象