MySQL主从复制(10)GTID主从异常恢复实际案例
一、故障背景
当前主从节点为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之前的事务是否已经执行过,所以将之前的事务也给同步过来了
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
评论