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云平台推荐
随便看看
- 2021-03-20Docker容器网络管理
- 2021-03-25UCloud IPSecVPN网关搭建VPN隧道
- 2021-02-21Docker创建与查看容器常用参数解读
- 2022-02-09Windows云主机远程登录报错“内部错误”问题分析
- 2021-07-10MySQL基于Percona XtraBackup 实现全备&增量备份与恢复