GTID复制错误的修复
公众号:杨建荣的学习笔记 · 作者:杨建荣 · 发布:2019-05-06 23:51:01 · 原文链接
这是学习笔记的第 1971 篇文章
前几天碰到一个MySQL服务器掉电,重新启动之后,主从复制出现了异常。
show slave status的报错信息如下: Last_SQL_Error: Error ‘@@SESSION.GTID_NEXT cannot be set to ANONYMOUS when @@GLOBAL.GTID_MODE = ON.’ on query. Default database: ”. Query: ‘CREATE TABLE IF NOT EXISTS infra.chk_masterha (`key` tinyint NOT NULL primary key,`val` int(10) unsigned NOT NULL DEFAULT ‘0’) engine=MyISAM’
可以从日志可以明显看出来,这是MHA的心跳检测机制,对于数据完整性来说,这个操作是可以弥补的。我们可以暂且忽略这一条。
于是使用如下的方法来跳过这个错误:
stop slave;
set session gtid_next=’xxxxxxx’;
begin;commit;
SET SESSION GTID_NEXT = AUTOMATIC;
start slave;
本来以为这是一个常规的修复,没想到复制状态出现了问题,
为了尽快修复,我使用了reset slave all的方式,然后重新配置复制关系,
change master to MASTER_HOST=’xx.124.67′,MASTER_USER=’dba_repl’,MASTER_PASSWORD=’xx’,MASTER_PORT=4306,master_auto_position=1;
没想到抛出了如下的错误。
Got fatal error 1236 from master when reading data from binary log: ‘The slave is connecting using CHANGE MASTER TO MASTER_AUTO_POSITION = 1, but the master has purged binary logs containing GTIDs that the slave requires.
从这个信息可以看出,应该是日志的信息出了问题,但是查看主库中,最近也没做过purge binary logs操作,相关的日志都存在,为什么抛出这个错误呢。
经过测试,发现有一个折中方案,那就是先临时关闭GTID协议,使用偏移量的方式来重接复制,这个时候复制就正常了。
change master to MASTER_HOST=’xx.124.67′,MASTER_USER=’dba_repl’,MASTER_PASSWORD=’xxx’,MASTER_PORT=4306,Master_Log_File=’mysqlbin.000105′,MASTER_LOG_POS=428492286,master_auto_position=0;
一旦想重新启用GTID协议,就又开始抛错了。
change master to master_auto_position=1;
对于这个问题也着实下了功夫,发现还是对于GTID的理解不够深入导致解决的时候困难重重。我们来理一下这个问题,看看这种情况下怎么修复。
为了能够快速复选问题,并且进行问题跟踪,我把这个数据库做了镜像备份,如下是使用偏移量复制的状态。

