mysql5.6 主从同步失败问题解决

1. 场景分析:

主(hsz_sql0):
#分析主数库在干什么,其中“307844154”是show slave status\G;查看Last_SQL_Error:…最后 end_log_pos 307844154

/usr/local/mysql/bin/mysqlbinlog --no-defaults -v -v --base64-output=DECODE-ROWS mysql-bin.000002 | grep -A '10' 307844154

mysql5.6 主从同步失败问题解决_第1张图片
1.1
通过上图(1.1)信息可以看到 主数据库hszcjd中ecs_sessions,更新ecs_sessions中的sesskey=’ be5e1c77c83ed4da2692eae3a949f99b’,去主数据库和从数据库都找不到该条数据;
备(hsz_sql1):

mysql5.6 主从同步失败问题解决_第2张图片
1.2

通过在从数据库上图(1.2)可以看到,主从同步发生异常:

Last_SQL_Error: Could not execute Update_rows event on table hszcjd.ecs_sessions; Can’t find record in ‘ecs_sessions’, Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event’s master log mysql-bin.000824, end_log_pos 307844154

原因分析:Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND 是主从更新时丢失数据,导致主从不一致,在从库上mysql> show slave status\G;结果如上图(1.2),去主数据库和从数据库都找不到该条数据,由于ecs_sessions表在主数据库超时会有删除的操作,可能在数据同步时网络异常造成数据掉失,而主数据库该条数据超时会删掉,所以在主数据库和从数据库都没找到该数据;

2. 解决方案:

2.1:由于该表同步意义不大,超时数据会删除,配置/etc/my.cnf 中[mysqld]下添加不同步该表数据,重启从数据库(hsz_sql1):

replicate-wild-ignore-table=hszcjd.ecs_sessions

重启数据库:service mysql restart

2.2:跳过该错误,但是没有彻底解决该问题,以后修改这条数据时,如果主从数据不一致,还是同步失败,只是暂时解决了该问题。有数据的情况下除非通过修改或更新,使主从数据一致,然后再跳过该错误。

在没配GTID模式同步下可以通过:

stop slave;
set global sql_slave_skip_counter =1;
start slave;

配置GTID模式同步可以通过,SET SESSION GTID_NEXT=‘masterUUID:错误位置+1’,其中masterUUID在show slave status\G;命令下可以找到:

STOP SLAVE;
SET SESSION GTID_NEXT = '8e2e8a72-6e7a-11e5-9df0-00163e001264:643142148';
BEGIN; COMMIT;
SET SESSION GTID_NEXT = AUTOMATIC;
START SLAVE;

补充说明:
查看是否开启GTID模式:mysql > show variables like '%GTID%';
开启GTID以后,无法使用sql_slave_skip_counter跳过事务。MySQL在gtid模式下,直接禁止使用set global sql_slave_skip_counter = x。
GTID比传统复制的优势:
a、更简单的实现failover,不用以前那样在需要找log_file和log_Pos。
b、更简单的搭建主从复制。
c、比传统复制更加安全。
d、GTID是连续没有空洞的,因此主从库出现数据冲突时,可以用添加空事物的方式进行 跳过。
2.3:把主数据库数据全部导出,导出到备数据库,修改下从数据库到同步最新的位置,由于主数据库(hsz_sql0)主从密码忘记了,主要重新开放一个同步账号;

主操作:

GRANT REPLICATION SLAVE ON *.* to '账号(最好不要给root)'@'%' identified by '密码';

从操作:

stop slave;
change master to master_host='主机ip',master_user='账号',master_password='密码',
     master_log_file='二进制文件名称',master_log_pos=最新位置;
start slave;

2.4:重新搭建从数据库hsz_sql1

你可能感兴趣的:(mysql5.6 主从同步失败问题解决)