OGG-MySQL无法正常同步数据问题分析

问题背景:

        用户通过OGG从源端一个MySQL从库将数据同步到目标端的另一个MySQL数据库里面,后面由于源端的从库出现了长时间的同步延时,由于延时差距过大最后选择通过重建从库方式进行了修复

从库重建之后,源端的OGG出现了报错ERROR   OGG-00146  Call to VAMInitialize returned with error status 600: VAM Client Report <CAUSE OF FAILURE : Failed to find binlog:  inside binlog index,从报错信息看很明显是源端的extract进程找不到读取的binlog文件,这是因为从库进行了重建,导致从库的binlog重新从1开始,知道问题的原因之后,用户对源端的extract抽取进行修复,将抽取进程的读取位置重新指向最新序号1的binlog进行抽取,源端的抽取进程也恢复了正常,通过stats可以看到有在正常的抽取事务,但奇怪的事,目标端的replicat应用进程一直却无法应用数据,进程状态显示为正常

问题分析:

        查看目标端应用进程r_test的状态,可以看到应用进程r_test有在正常的读取队列文件,而且没有存在应用延时的情况

        检查应用进程的日志,发现存在大量的事务被过滤的报错OGG-05664  CSN-based filtering suppressed 2 duplicate transactions, from trail Seqno 3, RBA 14043 to Seqno 3, RBA 14283. 

        最近一次的报错信息可以看到被过滤的

        第一个事务为CSN 000000000000000000001:000000000011177 and transaction ID 000000000000000000001:000000000010963,

        最后一个事务为CSN 000000000000000000001:000000000011511 and 

transaction ID 000000000000000000001:000000000011297

        注:CSN表示事务结束所在的binlog位置:000000000000000000001表示事务在binlog的序号为1,000000000011177表示事务结束的binlog位置pos

        transaction ID表示事务开始所在的binlog位置000000000000000000001表示事务在binlog的序号为1,000000000010963表示事务开始的binlog位置pos

        查看目标端检查表里面应用进程的检查点信息,可以看到当前检查点存储的低位线log_cmplt_csn为000000000000000000004:000000000003836,已经应用执行事务log_cmplt_xids为000000000000000000004:000000000003622,均超过了之前报错被过滤的事务csn以及事务xid,因此事务将被视作已经完成执行从而被跳过,这也为什么应用进程看起来读取队列正常,但一直没有应用事务的原因,因为应用的事务csn,xid都低于检查表里面的检查点csn以及事务XID

        那为什么检查表里面的检查点信息都这么大呢,从000000000000000000004序号我们可以判断,检查点已经读取到了属于binlog为4的事务,很明显这是重搭从库之前应用进程的检查点信息,因为从库的binlog已经重新从1开始,所以检查表的信息应该也需要被重新清理,确保检查点也从binlog 1重新开始

问题解决:

        我们先要清理检查表里面链路的信息,这里直接根据应用的进程名称删除检查表信息,辅助的检查表checkpoint_lox记录为空不需要进行操作,另一种方式直接删除应用进程delete replicat重建也可以清空检查表进程的信息 

mysql> delete from checkpoint where group_name='R_TEST';

        修改进程r_test读取队列文件的位置,指向最近一个的队列文件3,再重新应用一遍队列文件,由于修改的队列文件位置不一定准确,可能出现重复应用数据的情况,可以通过参数HANDLECOLLISIONS去解决冲突数据

GGSCI (rac2) 20> alter replicat r_test,extseqno 3,extrba 0 

        重新开启应用进程,发现依然出现事务被过滤的报错OGG-05664  CSN-based filtering suppressed 15 duplicate transactions

问题二次分析:

        再次查看检查表的信息,发现进程R_TEST的检查点又重新回到了之前的CSN位置000000000000000000004:000000000003836,不是期待的binlog为1的日志

        通过logdump分析队列文件3日志,首先尝试根据filter ggstoken TRANID过滤检查点里面记录的事务ID000000000000000000004:000000000003836,发现队列文件记录了从库重建之前的binlog 4的事务信息

        之后再往下查找又发现了属于从库重建之后binlog日志序列号1的事务信息000000000000000000001:000000000005280

        也就是说队列文件3同时记录了从库重建之前binlog 4的事务以及重建之后binlog 1的事务,这样如果应用进程从队列文件头开始读取的话,会先应用重建之前binlog 4的事务,检查点里面的信息会更新为binlog 4的事务检查点信息,这样后面再读取到重建之后binlog 1的事务信息时,由于binlog 1事务的csn,xid均低于binlog 4事务的csn,xid,就会导致binlog 1事务都被过滤

最终解决:

        知道问题原因是由于队列文件里面同时包含从库重建之前binlog 4的事务以及重建之后binlog 1的事务之后,我们需要获取更为准确的读取rba位置,让应用进程跳过从库重建之前binlog 4的事务应用

        通过logdump确认第一个属于binlog 1的事务的位置rba 4421

        清理检查表里面链路的信息,这里我直接根据应用的进程名称删除检查表信息,辅助的检查表checkpoint_lox记录为空不需要进行操作,另一种方式直接删除应用进程delete replicat重建也可以清空检查表进程的信息 

mysql> delete from checkpoint where group_name='R_TEST';

        修改进程r_test读取队列文件的位置,指向队列文件3,rba 4421

GGSCI (rac2) 20> alter replicat r_test,extseqno 3,extrba 4421 

        注:如果知道重建从库的时间点,也可以通过修改应用进程的开始事务的时间点启动,跳过重建之前的事务,这种方式更加便捷

ALTER REPLICAT xxxx, BEGIN 2017-01-07 08:00:00 

        重新开启应用进程同步终于恢复正常,没有再出现事务被过滤的报错,

        检查表的信息也更新为binlog 1的事务

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

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

相关文章

C# 初识System.IO.Pipelines

写在前面 在进一步了解Socket粘包分包的过程中&#xff0c;了解到了.NET 中的 System.IO.Pipelines&#xff0c;可以更优雅高效的解决这个问题&#xff1b;先跟随官方的示例做个初步的认识。 System.IO.Pipelines 是一个库&#xff0c;旨在使在 .NET 中执行高性能 I/O 更加容…

【论文阅读】MCANet: Medical Image Segmentation with Multi-Scale Cross-Axis Attention

文章目录 摘要创新点总结实现效果总结 摘要 链接&#xff1a;https://arxiv.org/abs/2312.08866 医学图像分割是医学图像处理和计算机视觉领域的关键挑战之一。由于病变区域或器官的大小和形状各异&#xff0c;有效地捕捉多尺度信息和建立像素间的长距离依赖性至关重要。本文提…

谷歌公布 2023 年最受欢迎的 Chrome 扩展

2023年&#xff0c;谷歌公布了最受欢迎的Chrome扩展&#xff0c;共有12款涵盖了多个领域&#xff0c;从提升工作效率到游戏娱乐。这些扩展旨在增强用户的浏览体验和生产力。 Scribe 功能&#xff1a;使用AI记录工作流程并创建逐步指南。 特点&#xff1a;自动记录和生成详细…

Hive05_DML 操作

1 DML 数据操作 1.1 数据导入 1.1.1 向表中装载数据&#xff08;Load&#xff09; 1&#xff09;语法 hive> load data [local] inpath 数据的 path [overwrite] into table student [partition (partcol1val1,…)];&#xff08;1&#xff09;load data:表示加载数据 &…

【单调队列】LeetCode1499:满足不等式的最大值

涉及知识点 单调队列 题目 给你一个数组 points 和一个整数 k 。数组中每个元素都表示二维平面上的点的坐标&#xff0c;并按照横坐标 x 的值从小到大排序。也就是说 points[i] [xi, yi] &#xff0c;并且在 1 < i < j < points.length 的前提下&#xff0c; xi &…

【如何破坏单例模式(详解)】

✅如何破坏单例模式 &#x1f4a1;典型解析✅拓展知识仓✅反射破坏单例✅反序列化破坏单例✅ObjectlnputStream ✅总结✅如何避免单例被破坏✅ 避免反射破坏单例✅ 避免反序列化破坏单例 &#x1f4a1;典型解析 单例模式主要是通过把一个类的构造方法私有化&#xff0c;来避免重…

【数据库系统概论】第3章-关系数据库标准语言SQL(3)

文章目录 3.5 数据更新3.5.1 插入数据3.5.2 修改数据3.5.3 删除数据 3.6 空值的处理3.7 视图3.7.1 建立视图3.7.2 查询视图3.7.3 更新视图3.7.4 视图的作用 3.5 数据更新 3.5.1 插入数据 注意&#xff1a;插入数据时要满足表或者列的约束条件&#xff0c;否则插入失败&#x…

WebRTC概念

定义 一个实时通信标准 通话原理 媒体协商 在WebRTC中&#xff0c;参与视频通讯的双方必须先交换SDP信息&#xff0c;获得一个都支持的编码格式 网络协商 目的&#xff1a;找到一条相互通讯的链路 做法&#xff1a;获取外网IP地址映射&#xff0c;通过信令服务器交换“网…

C语言学习day10:if语句

程序流程结构&#xff1a; C 语言支持最基本的三种程序运行结构:顺序结构、选择结构、循环结构。 顺序结构:程序按顺序执行&#xff0c;不发生跳转。选择结构:依据是否满足条件&#xff0c;有选择的执行相应功能。循环结构:依据条件是否满足&#xff0c;循环多次执行某段代码…

龙芯杯个人赛串口——做一个 UART串口——RS-232

文章目录 Async transmitterAsync receiver1. RS-232 串行接口的工作原理DB-9 connectorAsynchronous communicationHow fast can we send data? 2.波特率时钟生成器Parameterized FPGA baud generator 3.RS-232 transmitter数据序列化完整代码&#xff1a; 4.RS-232 receiver…

VS Code插件开发初步

文章目录 上手入口函数contributes 上手 欲善其事必先利其器&#xff0c;无论做什么开发&#xff0c;第一步肯定是下载工具链。VS Code开发主要用到两个东西&#xff0c;一个是项目的手脚架工具Yeoman&#xff0c;可通过yo来安装&#xff1b;另一个是VS Code的扩展时生成器gen…

机器视觉系统选型-避免畸变

在定位及高精度测量的系统中&#xff0c;镜头畸变的影响尤其重要 • 使用远心镜头 • 进行系统标定