MySQL主从复制(10)GTID主从异常恢复实际案例

TangLu MySQL 2024-02-05 166 0

一、故障背景

当前主从节点为GTID复制,现在需要修改从库的复制用户,由repluser修改为repl。由于主从GTID不一致导致各种报错,修复过程一定要关注GITD的值。


二、故障操作步骤

1、首先在从库上查看复制用户

mysql > show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: XX.XX.XXX.161
                  Master_User: repluser      #确认当前复制用户是repluser,现在需要改为repl
                  Master_Port: 4308
                Connect_Retry: 60
              Master_Log_File: mysqlbin.000003
          Read_Master_Log_Pos: 113372207
               Relay_Log_File: slave-relay-bin.000008
                Relay_Log_Pos: 46431
        Relay_Master_Log_File: mysqlbin.000003
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes


2、在从库断开主从复制,记录GTID信息。连接mysql以后通过show variables like server_uuid命令可以查看节点自身UUID。这里需要注意从库 Executed_Gtid_Set 出现了两个ID信息,其中 d9f94d88-463a-11e9-b424-005056b72c2a 是主节点的ID信息,具体事务为143504-360195。而6f4936a0-463b-11e9-a324-005056b7ed6e是从节点的ID,此时说明从节点上有产生过数据,具体事务为1-26如果不想在从库上出现多个gtid,一定记得开启read_only甚至super_read_only

mysql > show slave status \G
Retrieved_Gtid_Set: d9f94d88-463a-11e9-b424-005056b72c2a:19-360195
Executed_Gtid_Set: 6f4936a0-463b-11e9-a324-005056b7ed6e:1-26,         
d9f94d88-463a-11e9-b424-005056b72c2a:143504-360195


3、执行语句修改主从复制信息

change master to master_host='$master_ip',master_user='repl',master_password='123456',master_port=3306, master_auto_position=1;


4、出现错误The most recent failure being: Worker 0 failed executing transaction 'd9f94d88-463a-11e9-b424-005056b72c2a:1' at master log mysqlbin.000002, end_log_pos 734. See error log and/or performance_schema.replication_applier_status_by_worker table for more details about this failure or others, if any。


三、故障修复方法

1、查看故障后从节点retrieved_gtid_set值为d9f94d88-463a-11e9-b424-005056b72c2a:19-360195,和修改前是一致的,尝试把从库的gtid_purged的值设置成为已经执行过的gtid_executed值,目的是告诉从库这些gtid的事务已经执行完了,此时为d9f94d88-463a-11e9-b424-005056b72c2a:143504-360195。

mysql > reset slave all;
mysql > reset master;    #这步是为了将从库gtid_executed的值置为空,否则会出现@@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty的错误
mysql > set global gtid_purged='d9f94d88-463a-11e9-b424-005056b72c2a:143504-360195';
ERROR 1840


2、到此从库已经知道 143504-360195之间的事务已经被执行完了,所以从库在执行事务的时候会自动跳过这个区间的。此时再次尝试开启主从复制

mysql > change master to master_host='XX.XX.XXX.161',
    -> master_user='dba_repl',
    -> master_password='XXXXXXXX',
    -> master_port=4308,
    -> master_auto_position=1;

mysql > start slave;


3、查看复制状态,再次出错,'d9f94d88-463a-11e9-b424-005056b72c2a:1'事务无法被从库顺利执行。

Last_Error: Coordinator stopped because there were error(s) in the worker(s). The most recent failure being: Worker 0 failed executing transaction 'd9f94d88-463a-11e9-b424-005056b72c2a:1' at master log mysqlbin.000002, end_log_pos 734. See error log and/or performance_schema.replication_applier_status_by_worker table for more details about this failure or others, if any.


4、查看从库gtid状态,此时从库收到的gtid的值变为了d9f94d88-463a-11e9-b424-005056b72c2a:1-143503:360196-360321而之前是d9f94d88-463a-11e9-b424-005056b72c2a:19-360195,从这里可以看出之前purged部分143504-360195部分是已经正常了的,而多出了1-143503这部分事务id

mysql > show slave status \G
Retrieved_Gtid_Set: d9f94d88-463a-11e9-b424-005056b72c2a:1-143503:360196-360321
Executed_Gtid_Set: d9f94d88-463a-11e9-b424-005056b72c2a:143504-360195



5、查看从库mysql.gtid_executed 表,可以发现143504~360195之间的事务从库已经处理过了,但是从库并不知道143504之前的事务是否已经执行过,所以将之前的事务也给同步过来了

gtid_example.jpg  


6、将gtid_purged的值改为1-360195,告诉从库1-360195的事务都已经执行完了,不需要再次执行。然后再次开启主从复制,主从状态恢复了正常。说明在进行GTID方式主从部署的时候,从库需要知道当前已经执行过那些gtid的值。从1开始,到当前编号的值都设置为gtid_purged,这样从库才可以从正确的gtid去复制主库上的操作

mysql > set global gtid_purged='d9f94d88-463a-11e9-b424-005056b72c2a:1-360195';
mysql > schange master to master_host='$master_ip',master_user='repl',master_password='123456',master_port=3306, master_auto_position=1;
mysql > start slave;show slave status\G


评论