(5.11)mysql高可用系列——复制中常见的SQL与IO线程故障
Posted gered
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(5.11)mysql高可用系列——复制中常见的SQL与IO线程故障相关的知识,希望对你有一定的参考价值。
关键词:mysql复制故障处理
【1】手工处理的gtid_next(SQL线程报错)
例如:主键冲突,表、数据库不存在,row模式下的数据不存在等。
【1.1】模拟故障:重复创建用户
【1.1.1】先在从库上创建一个用户,再去主库上创建一个用户
-- 从202:
create user ‘test‘@‘%‘ identified by ‘123456‘;
grant all privileges on *.* to ‘test‘@‘%‘;
flush privileges;
-- 主202:
create user ‘test‘@‘%‘ identified by ‘123456‘;
grant all privileges on *.* to ‘test‘@‘%‘;
flush privileges;
use test;
create table test3(id int);
insert into test3 values(1);
commit;
【1.1.2】核验同步
发现不同步
在从库202执行:
show slave status\\G -- 查看状态
发现错误:
这里显示的GTID,指的是,需要执行这个GTID事务失败了,也就是说,真正出问题的是该GTID上面那个事务。
【1.1.3】核验错误信息
根据图上的文件名和位置在主库上查看执行的信息是什么;
果然是创建用户报错了。
从这个图,根据位置信息和GTID,应该就可以应征上面标红说的。
查看更详细的信息;在从库上运行
select * from performance_schema.replication_applier_status_by_worker\\G
Read_Master_Log_Pos: 2174
Exec_Master_Log_Pos: 1112
记得,这个错误号,就是我们报错的那个,要对应否则可能是其他时间出现的错误信息;
【1.1.4】解决,跳过、屏蔽这个冲突事务
在从库上:直接指定,下一个执行的事务,为错误信息上显示的事务(因为这里显示的GTID,是说执行到这个点出错,这个GTID所在的事务没有执行)
(1)由于在这个GTID必须是连续的,正常情况同一个服务器产生的GTID是不会存在空缺的。
所以不能简单的skip掉一个事务,只能通过注入空事物的方法替换掉一个实际操作事务。
(2)注入空事物的方法:
stop slave;
set @@session.gtid_next=‘de853101-b165-11e9-900a-000c291f4171:8‘;
start slave;
set @@session.gtid_next=‘automatic‘; -- 不改回来,很多报错
如果这时候,报错,或者最后一个设置 set @@session.gtid_next=‘automatic‘; 的时候报错。
可以构造一个空事务。 begin;commit; 然后再次 set @@session.gtid_next=‘automatic‘;
【1.1.5】核验
show slave status\\G -- 查看进程状态与错误信息 是否OK
use test;show tables; -- 查看数据是否同步过来,OK了啊
【1.1.6】如果是主库的最后一条事务报错,怎么办?
以上是关于(5.11)mysql高可用系列——复制中常见的SQL与IO线程故障的主要内容,如果未能解决你的问题,请参考以下文章
(5.6)mysql高可用系列——MySQL中的GTID异步复制
(5.5)mysql高可用系列——MySQL半同步复制(实践)