模拟异常,数据不一致情况(主从复制关系为增强半同步)
1,主库操作,查看t1表记录
2,从库操作,查看信息,并停止主从复制关系,目的是不让主库日志传送到从库
3,主库操作,插入记录,无法提交,hang状态,因为无法得到从库的ack认证返回结果
4,这个时候我们把主库进程kill,模拟宕机情况
主库报错如下
5,从库,提升为主库,停止从库接受日志(前面已经停止复制关系,这里不需要操作)
6,这个时候我们再次启动主库,查看原主库记录,多了一条记录,原因上面已经提过了,数据库在重启后会跳过ack验证,引擎层进行提交。
7,查看从库依然只有一条记录,这个是必然的,因为日志根本没有传送过来。
这样就会出现数据层的数据不一致,但应用层是可以保持一致的,因为当原主库异常后,应用报错,该记录插入失败,当主从切换后,只要在新主上重新执行一次即可,因为新主库没有记录,所以执行没有任何问题。
但如果这个时候原主库建立和新主库的复制关系就会出现原主库出现两个重复的记录,如果是主键那么就会出现复制报错的情况。
所以要想让原主库加入到新主库的复制关系中
- 删除原主库多出来的记录
- 新主库跳过原主库不需要同步的事物gtid
- 新主库追平原主库gtid
1,查看原主库信息,事物号已经到4,也就是多出的记录事物号
2,查看新主库库信息(当原主库故障时的作为从库的信息),可以看到执行事物号到3,比原主库少了一个事物号,也就是少的那条记录。
Show slave status;
3,首先我们要做的就是,删除原主库多余的记录,删除前先要把半同步关闭(避免长时间无法提交的情况),再次查看执行事物号已经到了5
4,其次我们在新主库跳过不需要同步的事物gtid, 并补齐gtid
5,查看新主库信息,执行事物号已经到4
Show slave status;
6,再次跳过不需要同步的事物gtid, 并补齐gtid
7,再次查看,执行事物号已经到了5,这样就跳过了事物4(多的记录),事物5(删除记录),新主库和原主库数据一致,gitd追平
Show slave status;
8,查询新主库记录
9,查看原主库记录
10,原主库建立与新主库复制关系
11,开启新主库半同步
12,新主库插入记录
13,原主库查看信息
14,恢复原来的主从关系,
主库开启
set global rpl_semi_sync_master_enabled=on;
Stop slave;
从库关闭
set global rpl_semi_sync_master_enabled=off;
Start slave;
15,主库插入记录
16,从库查看记录
均正常,数据一致。