栏目头部广告

MySQL主从同步异常之跳过错误

一、基于POS经典复制跳过

传统主从复制是基于binlog+pos复制(postion),也就是在binlog日志文档里,将用户进行的每一项操作都进行编号(pos),每一个event都有一个起始编号,一个终止编号,我们在配置主从复制从节点时,要输入master的log_pos值它标志着从哪个pos开始同步数据库里的数据。

传统复制跳过方法:

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

二、基于GTID复制跳过

MySQL5.6增加了GTID复制,GTID就是类似于pos的一个作用,不过它是整个MySQL复制架构全局通用的,也就是说在整个MySQL冗余架构中,它们在日志文件里事件的GTID值是全局唯一的,且一个事务对应一个GTID。一个GTID在一个服务器上只执行一次,避免重复执行导致数据混乱或者主从不一致。

文章推荐:MySQL GTID全局事物标识

2.1 第一阶段:查找下一个待执行事务

# 查看slave复制报错情况
> show slave status\G
……
Retrieved_Gtid_Set:db608c95-c2ba-1leb-a353-525400b7d7f3:1032847-22263692
Executed_Gtid_Set:db608c95-c2ba-1leb-a353-525400b7d7f3::1-22195782
Auto_Position:1
……

由show slave status可以看出:

(1)目前已经接收到的事务:Retrieved_Gtid_Set:db608c95-c2ba-1leb-a353-525400b7d7f3:1032847-22263692

(2)目前已经执行的事务:Executed_Gtid_Set:db608c95-c2ba-1leb-a353-525400b7d7f3:1-22195782

(3)下一个待执行事务:db608c95-c2ba-1leb-a353-525400b7d7f3:22195783

【注】第一阶段查询方法有很多种,一般经验比较丰富的可以使用这种方法,简单高效。

2.2 第二阶段:跳过当前事务,执行下一个事务

# 停止从库
> stop slave;

# 在session里设置gtid_next,即跳过当前GTID
> SET @@SESSION.GTID_NEXT= 'db608c95-c2ba-1leb-a353-525400b7d7f3:22195783';

# 设置空事物,gtid的生命周期开始了,必须通过显性的提交一个事务来结束
> BEGIN; COMMIT;

# 恢复事物号
> SET SESSION GTID_NEXT = AUTOMATIC;

# 启动slave进程
> START SLAVE;

三、小结

MySQL生产环境,在冗余架构复制中,一旦出现主从复制异常,一定要做好前期预判断,并不是所有的复制异常都能执行跳过操作,比如:update、insert、alter等操作就不能执行跳过,否则会导致主从数据不一致,一旦发生容灾或切换,业务数据就有可能出问题。

作者:UStarGao
链接:https://www.starcto.com/mysql/161.html
来源:STARCTO
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处

UCloud云平台推荐


UCloud新用户专属注册连接

UCloud CDN超值特惠专场

UCloud全球云主机(UHost/VPS)大促页面

UCloud快杰云主机大促页面

文章页广告

随便看看

栏目底部广告
`