GTID下复制问题和解决

环境介绍

数据库1主2从,mysql版本是v5.19

表结构

一、主库新增记录,从库提示主键冲突

模拟故障

1, master上关闭 sql_log_bin,删除id =103 后打开

2, 确认此时从库有id=103,主库没有

3, master insert id=103 主从异常

             Slave_IO_Running: YesSlave_SQL_Running: NoReplicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 1062Last_Error: Could not execute Write_rows event on table test.hero3; Duplicate entry '103' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log mysql-bin.000045, end_log_pos 3056

修复故障

根据报错test.hero3; Duplicate entry '103' for key 'PRIMARY,去slave中找到对应记录,删除即可

mysql> delete from test.hero3 where id=103;
Query OK, 1 row affected (0.00 sec)mysql> stop slave;start slave;
Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)mysql> show slave status\G
*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 192.168.10.129Master_User: replMaster_Port: 3358Connect_Retry: 60Master_Log_File: mysql-bin.000046Read_Master_Log_Pos: 194Relay_Log_File: mha3-relay-bin.000012Relay_Log_Pos: 407Relay_Master_Log_File: mysql-bin.000046Slave_IO_Running: YesSlave_SQL_Running: Yes

二、主库UPDATE,从库找不到记录

模拟故障

1.1, slave上将id=1 的记录delete

1.2, master上执行update xxx where id = 1;

1.3,    show slave status\G查看主从同步异常

# slave:
mysql> delete from hero3 where id = 1;
Query OK, 1 row affected (0.01 sec)# master
mysql> update hero3 set age = 1 where id = 1;
Query OK, 1 row affected (0.03 sec)
Rows matched: 1  Changed: 1  Warnings: 0# slave;
mysql>  show slave status\G
*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 192.168.10.129Master_User: replMaster_Port: 3358Connect_Retry: 60Master_Log_File: mysql-bin.000045Read_Master_Log_Pos: 2819Relay_Log_File: mha2-relay-bin.000009Relay_Log_Pos: 866Relay_Master_Log_File: mysql-bin.000045Slave_IO_Running: YesSlave_SQL_Running: NoReplicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 1032Last_Error: Could not execute Update_rows event on table test.hero3; Can't find record in 'hero3', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.000045, end_log_pos 2788

修复故障

从库中找到对应的记录,在slave上将该记录插入;

1,根据同步异常错误mysql-bin.000045, end_log_pos 2788,去主库对应sql

2, mysqlbinlog --no-defaults -vv --base64-output=decode-rows mysql-bin.000045 | grep -A 20 'end_log_pos 2788' 命令查找执行的sql

[root@mha1 mysql]# mysqlbinlog --no-defaults -vv --base64-output=decode-rows mysql-bin.000045 | grep -A 20 'end_log_pos 2788'
#241222 10:38:37 server id 10129  end_log_pos 2788 CRC32 0x1bfc92fc     Update_rows: table id 224 flags: STMT_END_F
### UPDATE `test`.`hero3`
### WHERE
###   @1=1 /* INT meta=0 nullable=0 is_null=0 */
###   @2='mao1' /* VARSTRING(60) meta=60 nullable=0 is_null=0 */
###   @3=110 /* INT meta=0 nullable=0 is_null=0 */
### SET
###   @1=1 /* INT meta=0 nullable=0 is_null=0 */
###   @2='mao1' /* VARSTRING(60) meta=60 nullable=0 is_null=0 */
###   @3=1 /* INT meta=0 nullable=0 is_null=0 */

3,根据 UPDATE `test`.`hero3` WHERE @1=1 @2='mao1' @3=110 拼接insert并插入slave

mysql>    insert into `test`.`hero3` values (1,'mao1',110);
Query OK, 1 row affected (0.03 sec)mysql> stop slave; start slave;
Query OK, 0 rows affected (0.01 sec)Query OK, 0 rows affected (0.00 sec)mysql> show slave status\G
*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 192.168.10.129Master_User: replMaster_Port: 3358Connect_Retry: 60Master_Log_File: mysql-bin.000045Read_Master_Log_Pos: 2819Relay_Log_File: mha2-relay-bin.000010Relay_Log_Pos: 454Relay_Master_Log_File: mysql-bin.000045Slave_IO_Running: YesSlave_SQL_Running: Yes

三、主库DELETE,从库找不到记录

模拟故障

主库在关闭binlog的情况下insert一条数据,然后打开binlog并删除该数据

mysql> set sql_log_bin = 0; 
Query OK, 0 rows affected (0.00 sec)mysql> insert into hero3(name,age) values('delete_test',22);
Query OK, 1 row affected (0.01 sec)mysql> set sql_log_bin = 1;
Query OK, 0 rows affected (0.00 sec)mysql> select * from hero3 where id >= 102;
+-----+-------------+-----+
| id  | name        | age |
+-----+-------------+-----+
| 102 | mao2        | 111 |
| 103 | mao2        | 109 |
| 104 | delete_test |  22 |
+-----+-------------+-----+
3 rows in set (0.00 sec)mysql> delete from hero3 where id = 104;
Query OK, 1 row affected (0.03 sec)

此时从库报错信息如下

             Slave_IO_Running: YesSlave_SQL_Running: NoReplicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 1032Last_Error: Could not execute Delete_rows event on table test.hero3; Can't find record in 'hero3', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.000045, end_log_pos 2092

 修复故障

由于在执行delete的时候,slave找不到该记录,那么我们就可以跳过该事务

Retrieved_Gtid_Set 表示slave已经收到的gtid集合,Executed_Gtid_Set表示slave已经执行的gtid集合,从中可以看到 4855c186-ba02-11ef-8bf4-000c297511da:11没有执行

由于删除的数据在slave中找不到,所以我们就可以跳过该事务; 

mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)mysql> set gtid_next = '4855c186-ba02-11ef-8bf4-000c297511da:11'; #设定下一个要执行的GTID:11
Query OK, 0 rows affected (0.02 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'; # 将next设为自动
Query OK, 0 rows affected (0.00 sec)mysql> start slave;
Query OK, 0 rows affected (0.02 sec)mysql> show slave status\G      # 可以看到主从状态已恢复                                                                                                                                             *************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 192.168.10.129Master_User: replMaster_Port: 3358Connect_Retry: 60Master_Log_File: mysql-bin.000045Read_Master_Log_Pos: 2123Relay_Log_File: mha3-relay-bin.000008Relay_Log_Pos: 454Relay_Master_Log_File: mysql-bin.000045Slave_IO_Running: YesSlave_SQL_Running: Yes

四、主库日志被purged,主从同步失败

模拟故障

4.1.1 stop slave断开主从同步

4.1.2 主库上执行一些事务,使GTID持续增长

mysql> flush logs;
Query OK, 0 rows affected (0.00 sec)mysql> insert into hero3(name,age) select name,age from hero3;
Query OK, 28 rows affected (0.00 sec)
Records: 28  Duplicates: 0  Warnings: 0mysql> flush logs;
Query OK, 0 rows affected (0.00 sec)mysql> insert into hero3(name,age) select name,age from hero3;
Query OK, 56 rows affected (0.00 sec)
Records: 56  Duplicates: 0  Warnings: 0mysql> flush logs;
Query OK, 0 rows affected (0.00 sec)mysql> insert into hero3(name,age) select name,age from hero3;
Query OK, 112 rows affected (0.00 sec)
Records: 112  Duplicates: 0  Warnings: 0mysql> flush logs;
Query OK, 0 rows affected (0.00 sec)mysql> insert into hero3(name,age) select name,age from hero3;
Query OK, 224 rows affected (0.00 sec)
Records: 224  Duplicates: 0  Warnings: 0mysql> show master logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000053 |       734 |
| mysql-bin.000054 |       972 |
| mysql-bin.000055 |      1448 |
| mysql-bin.000056 |      2400 |
| mysql-bin.000057 |      4257 |
+------------------+-----------+

4.1.3 清理binlog,造成master上事务缺失

mysql> purge binary logs to 'mysql-bin.000058';
Query OK, 0 rows affected (0.00 sec)mysql> show master logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000058 |       194 |
+------------------+-----------+
1 row in set (0.00 sec)

4.1.4 slave上执行start slave,观察主从异常,提示“but the master has purged binary logs containing GTIDs that the slave requires”

mysql> show slave status\G
*************************** 1. row ***************************Slave_IO_State: Master_Host: 192.168.10.129Master_User: replMaster_Port: 3358Connect_Retry: 60Master_Log_File: mysql-bin.000050Read_Master_Log_Pos: 194Relay_Log_File: mha3-relay-bin.000021Relay_Log_Pos: 407Relay_Master_Log_File: mysql-bin.000050Slave_IO_Running: NoSlave_SQL_Running: Yes
Master_SSL_Verify_Server_Cert: NoLast_IO_Errno: 1236Last_IO_Error: 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.'

修复故障

由于master上这部分binlog已经被清理掉了,所以这部分数据已经无法同步到从库。 及时恢复了主从同步状态,这部分数据也是丢失的; 工作的时候遇到这种情况有两种处理方法

4.2.1        master上根据select @@gtid_purged;可以查看主库GTID执行了1-27

mysql> select @@gtid_purged;
+-------------------------------------------+
| @@gtid_purged                             |
+-------------------------------------------+
| 4855c186-ba02-11ef-8bf4-000c297511da:1-27 |
+-------------------------------------------+

从库show slave status命令可以看到Retrieved_Gtid_Set 和Executed_Gtid_Set 中显示从库已经获取并执行了GTID:1-20

           Retrieved_Gtid_Set: 4855c186-ba02-11ef-8bf4-000c297511da:6-20Executed_Gtid_Set: 090b3bdd-ba02-11ef-9ce1-000c292443d0:1-4,
4855c186-ba02-11ef-8bf4-000c297511da:1-20

证明中间有21-27,一共7个事务丢失;

4.2.2  尝试将gtid_purged设置为1-27

mysql>  set global gtid_purged = '4855c186-ba02-11ef-8bf4-000c297511da:1-27';
ERROR 1840 (HY000): @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty.
mysql> 
mysql> reset slve^C
mysql> set @@GLOBAL.GTID_EXECUTED = '';
ERROR 1238 (HY000): Variable 'gtid_executed' is a read only variable

发现无法设置,我们可以reset master,清空从库的binlog和gtid_executed

mysql> reset master;
Query OK, 0 rows affected (0.00 sec)mysql> set global gtid_purged='4855c186-ba02-11ef-8bf4-000c297511da:1-27';
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 eventMaster_Host: 192.168.10.129Master_User: replMaster_Port: 3358Connect_Retry: 60Master_Log_File: mysql-bin.000058Read_Master_Log_Pos: 194Relay_Log_File: mha3-relay-bin.000022Relay_Log_Pos: 407Relay_Master_Log_File: mysql-bin.000058Slave_IO_Running: YesSlave_SQL_Running: Yes

4.2.3 虽然此时同步恢复正常,但是主从是不一致的,后面执行其他事务的时候是正常的,但是当执行到丢失的7个事务中的数据的时候还是会报错

# master
mysql>  select count(1) from hero3;
+----------+
| count(1) |
+----------+
|      448 |
+----------+
#slave
mysql>   select count(1) from hero3;
+----------+
| count(1) |
+----------+
|      208 |
+----------+
1 row in set (0.00 sec)

后面等异常的时候可以按照上三种情况进行修复,发现一例修复一例;

4.2.4  我们不知道上面7个事务究竟影响了多少数据量,如果条件允许,可以从主库上dump一份全量数据,重新搭建一个新的从库,这样可以保证数据完全一致,不用每次都手动修复

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/495227.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言初阶【13】——打印一个数的每一位(递归和非递归实现)

1. 题目 打印一个数的每一位 2.分析 首先先实现非递归方式, 以123为例。我们要获取它的每一位, 获取个位数:123 %10 3 获取十位数:123/10 12 之后在 12%10 2; 获取百位数:12/10 1 之后再1%10 1&#x…

webrtc学习----前端推流拉流,局域网socket版,一对多

提示:局域网socket版,一对多 文章目录 [TOC](文章目录) 前言一、教程二、webrtc工作流程三、推流端四、拉流五、socket服务六、效果七、备注总结 前言 WebRTC(Web Real-Time Communication)是一种实时通讯技术,允许网…

深入探讨 Go 中的高级表单验证与翻译:Gin 与 Validator 的实践之道20241223

深入探讨 Go 中的高级表单验证与翻译:Gin 与 Validator 的实践之道 在现代后端开发中,表单验证是保证数据完整性和服务稳定性的核心环节。如何优雅、高效地实现表单验证,同时提供人性化的错误提示,是每位开发者的必修课。在本文中…

单机游戏《野狗子》游戏运行时提示dbghelp.dll缺失是什么原因?dbghelp.dll缺失要怎么解决?

《野狗子》游戏运行时提示dbghelp.dll缺失:原因与解决方案 在畅游《野狗子》这款引人入胜的游戏世界时,突然遭遇“dbghelp.dll缺失”的错误提示,无疑会给玩家的探险之旅蒙上一层阴影。作为一名深耕软件开发领域的从业者,我深知此…

Unity复刻胡闹厨房复盘 模块一 新输入系统订阅链与重绑定

本文仅作学习交流,不做任何商业用途 郑重感谢siki老师的汉化教程与代码猴的免费教程以及搬运烤肉的小伙伴 版本:Unity6 模板:3D 核心 渲染管线:URP ------------------------------…

Flutter 异步编程简述

1、isolate 机制 1.1 基本使用 Dart 是基于单线程模型的语言。但是在开发当中我们经常会进行耗时操作比如网络请求,这种耗时操作会堵塞我们的代码。因此 Dart 也有并发机制 —— isolate。APP 的启动入口main函数就是一个类似 Android 主线程的一个主 isolate。与…

一键打断线(根据相交点打断)——CAD c# 二次开发

多条相交线根据交点一键打断,如下图: 部分代码如下: finally namespace IFoxDemo; public class Class1 {[CommandMethod("ddx")]public static void Demo(){//"ifox可以了".Print();Database db HostApplicationServices.Workin…

Confluent Cloud Kafka 可观测性最佳实践

Confluent Cloud 介绍 Confluent Cloud 是一个完全托管的 Apache Kafka 服务,提供高可用性和可扩展性,旨在简化数据流处理和实时数据集成。用户可以轻松创建和管理 Kafka 集群,而无需担心基础设施的维护和管理。Confluent Cloud 支持多种数据…

【C++】B2066救援题目分析和解决讲解

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯 题目💯 题目分析每个屋顶计算的元素 💯 思路解析1. **读取输入**2. **计算屋顶时间**3. **结果精确取整** 💯 完整解决代码&#x1f4a…

WPS工具栏灰色怎么办

WPS离线不登录,开启工具栏等相关功能 当你在使用WPS的过程中,若因网络问题或其他特殊原因,导致无法登录使用WPS时,可根据以下步骤开启离线兼容模式,开启此模式后,可在未登录的状态下,激活并使用…

反射探针.

一、在unity场景中如何添加反射探针? 可以先添加一个空对象,在空对象的上方添加反射探针组件(Reflection Probe) 反射探针的类型有:Baked、Custom、Realtime 其中“Baked”反射探针类型,可以将场景中的静态…

SecureCRT汉化版

目录 9.5.1版 8.1.4版 下载链接 SecureCRT 和 SecureFX 是由 VanDyke Software 开发的专业工具,分别专注于安全的终端仿真与文件传输。SecureCRT 提供高效的终端仿真和多协议支持,是网络管理和系统配置的首选工具;SecureFX 则致力于安全的…

回归预测 | MATLAB实现CNN-LSSVM卷积神经网络结合最小二乘支持向量机多输入单输出回归预测

回归预测 | MATLAB实现CNN-LSSVM卷积神经网络结合最小二乘支持向量机多输入单输出回归预测 目录 回归预测 | MATLAB实现CNN-LSSVM卷积神经网络结合最小二乘支持向量机多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 回归预测 | MATLAB实现CNN-LSSVM…

使用Vue的props进行组件传递校验时出现 Extraneous non-props attributes的解决方案

作者:CSDN-PleaSure乐事 欢迎大家阅读我的博客 希望大家喜欢 使用环境:WebStorm 目录 出现错误的情况 报错: 代码: 报错截图 原因分析 解决方案 方法一 方法二 出现错误的情况 以下是我遇到该错误时遇到的报错和代码&…

【知识】cuda检测GPU是否支持P2P通信及一些注意事项

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 代码流程 先检查所有GPU之间是否支持P2P通信;然后尝试启用GPU之间的P2P通信;再次检查所有GPU之间是否支持P2P通信。 test.cu&…

专栏二十三:Python读取和分析空间数据的经验杂谈

部分情况同样适合单细胞的分析结果 读取数据阶段 1.错误的library_id 包括sc和sq的两种读取方式,大同小异。 理论上有h5数据和spatial文件夹就可以读取成功,并且自动赋予和文件名一样的library_id,例如 slide sq.read.visium("/ho…

《软件设计的哲学》阅读摘要之设计原则

《软件设计的哲学》(A Philosophy of Software Design)是一本在软件架构与设计领域颇具影响力的书籍,作者 John Ousterhout 在书中分享了诸多深刻且实用的软件设计理念。书中列举的这些设计原则,汇聚了作者丰富的实战经验与深邃的…

Centos7.9安装openldap+phpldapadmin+grafana配置LDAP登录最详细步骤 亲测100%能行

一、部署LDAP 1、安装LDAP yum install -y openldap-servers openldap-clients openldap openldap-devel compat-openldap openldap-servers-sql systemctl start slapd systemctl enable slapd2、创建第一个管理账号密码(设置为ldapadmin) slappass…

【MySQL基础篇】多表查询(隐式/显式内连接、左/右外连接、自连接查询、联合查询、标量/列/行/表子查询)

Hiヽ(゜▽゜ )-欢迎来到蓝染Aizen的CSDN博客~ 🔥 博客主页: 【✨蓝染 の Blog😘】 💖感谢大家点赞👍 收藏⭐ 评论✍ 文章目录 MySQL基础篇-多表查询一、多表关系1. 一对多2. 多对多3. 一对一 二、多表查询…

【踩坑记录】C编程变量未初始化导致的程序异常

1、在编程的时候养成良好的习惯,定义变量以后记得给变量初始化,不然可能会产生一些意想不到的Bug。 2、比如下面的例子,如果定义的变量没有被初始化就有可能是一个随机值。如果代码少还好,很容易排查出来。但如果是一个比较大的项…