来源:

https://rmnaveed.co.uk/skip-slave-counter-with-gtid_mode-on-error-1858-hy000/


GTID下,原先使用的SQL_SLAVE_SKIP_COUNTER  就不那么方便了,但是我们可以如下方式绕过:


在异常的从库上执行:

mysql> stop slave;

mysql> set global gtid_mode=ON_PERMISSIVE; 

mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;

mysql> START SLAVE; 

mysql> SHOW SLAVE STATUS \G

mysql> set global gtid_mode=ON;

mysql> SHOW SLAVE STATUS \G


GTID_MODE是动态变量,可以在运行时设置。在这里,我们需要GTID_MODE选项。

关闭:新的和复制的事务必须是匿名的。

OFF_PERMISSIVE:新事务是匿名的。复制的事务可以是匿名事务,也可以是 GTID 事务。

ON_PERMISSIVE:新事务是 GTID 事务。复制的事务可以是匿名事务,也可以是 GTID 事务。

打开:新的和复制的事务都必须是 GTID 事务。



注意:上面这种方法,我个人不太建议直接跳过的,如果架构允许(摘一个slave集群能抗住压力),可以考虑将异常的从库从LVS或LB上摘掉流量,然后需要将主库的对应的binlog提取出来看看从库为啥会复制报错。然后根据提取出的主库的binlog,补偿到从库去,修复掉问题,而不是一个skip直接跳过。


另外,需要注意的一点是: 如果是MHA+GTID架构的,建议不要让从库写了数据,否则会造成MHA切换失败(这个可以参考兰春大佬的博客)。 如果写了数据的话,我们可以摘掉从库流量后,重做下gtid_purged来重置下GTID信息。