MySql中gtid使用记录Last_Error跳过

双主架构双向复制

由于历史数据原因导致部分数据不同步,删除无效的数据另一个从库直接报错

 Last_Error: Could not execute Delete_rows event on table yun_sche.yun_table; Can't find record in 'yun_table', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.000001, end_log_pos 4966
 Last_SQL_Error: Could not execute Delete_rows event on table yun_sche.yun_table; Can't find record in 'yun_table', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.000001, end_log_pos 4966

处理方案

登录从数据库,查看处理状态

show slave status\G

摘取有效信息

Retrieved_Gtid_Set: 6e40329e-3a1f-11f0-baa5-fa163e4fa9f0:7-16
Executed_Gtid_Set: 6e40329e-3a1f-11f0-baa5-fa163e4fa9f0:1-14,
cae2ebb6-3a99-11f0-9962-0242ac110003:1-7

数据说明:

Retrieved_Gtid_Set已获取的GTID集合

表示从库 I/O 线程已经从主库的二进制日志中接收到(拉取)的所有事务的 GTID 集合,这些事务已经写入到从库的 relay log 中,但尚未全部执行.由 slave I/O 线程维护,只增不减(除非重置复制),表示从库"知道"的所有事务
6e40329e-3a1f-11f0-baa5-fa163e4fa9f0:7-16 表示从6e40329e-3a1f-11f0-baa5-fa163e4fa9f0接收了事务7-16

Executed_Gtid_Set已执行的GTID集合

表示从库 SQL 线程已经执行完成的所有事务的 GTID 集合,包括从主库复制来的事务和从库本地产生的事务
6e40329e-3a1f-11f0-baa5-fa163e4fa9f0:1-14,cae2ebb6-3a99-11f0-9962-0242ac110003:1-7表示执行了6e40329e-3a1f-11f0-baa5-fa163e4fa9f0中1-14的数据,卡在了15,执行了本地cae2ebb6-3a99-11f0-9962-0242ac110003的1-7。

处理错误

# 卡在了15,因为是需要删除的数据可以直接跳过
mysql> STOP SLAVE;
Query OK, 0 rows affected (0.01 sec)

mysql> SET GTID_NEXT = '6e40329e-3a1f-11f0-baa5-fa163e4fa9f0:15';
Query OK, 0 rows affected (0.00 sec)

mysql> BEGIN; COMMIT;
Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql> SET GTID_NEXT = 'AUTOMATIC';
Query OK, 0 rows affected (0.00 sec)

mysql> START SLAVE;
Query OK, 0 rows affected (0.00 sec)

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 121.36.71.28
                  Master_User: docker_config
                  Master_Port: 33070
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 5584
               Relay_Log_File: e1cf51efec7f-relay-bin.000009
                Relay_Log_Pos: 454
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes

MySQL 主从复制中,GTID(Global Transaction Identifier)用于唯一标识每个事务,并在故障转移和数据一致性方面提供支持。当主库和从库的 `GTID_MODE` 设置不一致时,会导致复制失败,并出现类似 `Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have different values for GTID_MODE` 的错误信息[^1]。 ### 错误原因 `GTID_MODE` 是控制是否启用 GTID 的关键参数。若主库启用了 GTID(`GTID_MODE=ON`),而从库未启用(`GTID_MODE=OFF`),或者相反,则会出现该错误。此外,如果两者都启用了 GTID 但配置方式不同(如 `ENFORCE_GTID_CONSISTENCY` 设置不一致),也可能导致复制失败[^2]。 ### 解决方法 #### 1. 确认主库和从库的 GTID 配置 首先检查主库和从库的 `my.cnf` 或通过 SQL 查询当前的 GTID 配置: ```sql SHOW VARIABLES LIKE 'gtid_mode'; SHOW VARIABLES LIKE 'enforce_gtid_consistency'; ``` #### 2. 调整从库的 GTID 模式 确保从库与主库保持一致的 GTID 配置。假设主库使用 GTID,从库也应启用 GTID 并设置 `ENFORCE_GTID_CONSISTENCY=ON`: ```ini # my.cnf 配置示例 [mysqld] gtid_mode=ON enforce_gtid_consistency=ON ``` 修改配置后重启 MySQL 服务以应用更改。 #### 3. 使用正确的复制用户权限 确保用于复制的用户拥有适当的权限,通常包括 `REPLICATION SLAVE` 和 `REPLICATION CLIENT`: ```sql GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'replica_user'@'%' IDENTIFIED BY 'password'; FLUSH PRIVILEGES; ``` #### 4. 正确启动复制进程 如果已正确配置 GTID 模式,但仍遇到问题,可以尝试重新初始化复制连接: ```sql STOP SLAVE; CHANGE MASTER TO MASTER_HOST='master_host', MASTER_USER='replica_user', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=107, MASTER_AUTO_POSITION=1; START SLAVE; ``` 其中 `MASTER_AUTO_POSITION=1` 表示启用基于 GTID 的自动定位功能。 #### 5. 检查并修复数据一致性 如果由于 GTID 不一致导致数据冲突,可能需要手动干预来修复数据一致性问题。可以通过以下命令查看复制状态: ```sql SHOW SLAVE STATUS\G ``` 关注 `Executed_Gtid_Set` 和 `Retrieved_Gtid_Set` 字段,确保它们匹配。如有必要,可使用 `SET GLOBAL gtid_purged` 来跳过特定事务或重置 GTID 信息。 ### 注意事项 - 在调整 GTID 模式之前,务必备份数据库,防止因配置错误导致数据丢失。 - 修改 `GTID_MODE` 可能涉及服务器重启,需在维护窗口内操作。 - 如果从库无法立即启用 GTID,建议暂时使用传统的二进制日志文件和位置进行复制,待条件允许后再切换为 GTID 模式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值