如何通过mysql binlog排查数据同步问题?

1、需求:

通过binlog把mysql数据从A库(一张表)形变后(根据rec_dt字段确定B库中的表)同步到B库(12张表按月分表)

即:假设记录的rec_dt="2024-07-06 10:17:12:992"  则同步到7月的表 XXX_07的表。

2、出现的问题

每次重启同步工具可以正常同步,此时新增数据A无法同步,然后同步工具挂了,再次重启A可以正常同步,此时新增数据B无法同步,然后同步工具挂了。

3、初步定位问题

查看同步工具,错误原因为lua脚本中分表日期字段rec_dt(timestamp类型)为nil,查看了库里面所有的数据都有值,百思不得其解。
后面在lua脚本中把rec_dt字段做了处理,为空时设置默认值,数据同步正常,增量数据也能正常同步。

4、继续深挖定位问题     

    这肯定不能放过呀,这么诡异,到底是什么原因呢?于是继续排查。

4.1、查看binlog日志

查看binlog文件:

mysql> show binary logs;
+---------------------------------+-----------+
| Log_name                        | File_size |
+---------------------------------+-----------+
| f266a8f5-binlog.000001          |     40067 |
| f266a8f5-binlog.000002          |       217 |
| f266a8f5-binlog.000003          |       217 |
| f266a8f5-binlog.000004          |     30246 |
+---------------------------------+-----------+
4 rows in set (0.01 sec)
mysql> show variables like 'log_bin%';
+---------------------------------+----------------------------------------------+
| Variable_name                   | Value                                        |
+---------------------------------+----------------------------------------------+
| log_bin                         | ON                                           |
| log_bin_basename                | /LOG/BIN/f266a8f5-binlog                |
| log_bin_index                   | /LOG/BIN/f266a8f5-binlog.index          |
| log_bin_trust_function_creators | ON                                           |
| log_bin_use_v1_row_events       | OFF                                          |
+---------------------------------+----------------------------------------------+
5 rows in set (0.00 sec)

日志存储的位置:/LOG/BIN/f266a8f5-binlog 

2、通过mysqlbinlog远程查看binlog日志。

mysqlbinlog  --base64-output=DECODE-PORS    
--read-from-remote-server 
--host=XXX --port=XXX 
--user=XXX --password=XXXX  
f266a8f5-binlog.000004 
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
SET @@SESSION.GTID_NEXT= 'c7a8d514-e0a6-11ee-9fe0-b22ac778b3fb:116'/*!*/;
# at 26215
#240704  2:55:27 server id 2887104926  end_log_pos 26302 CRC32 0x476988e3       Query   thread_id=5689417       exec_time=0     error_code=0
SET TIMESTAMP=1720032927.826239/*!*/;
BEGIN
/*!*/;
# at 26302
#240704  2:55:27 server id 2887104926  end_log_pos 26458 CRC32 0x2bc647f9       Table_map: `testdb`.`test_result_log` mapped to number 12120
# at 26458
#240704  2:55:27 server id 2887104926  end_log_pos 26528 CRC32 0xd95f8d76       Write_rows: table id 12120 flags: STMT_END_F

BINLOG '
n56FZhOeuRWsnAAAAFpnAAAAAFgvAAAAAAEAB2Fyc3ZjZGIAHHRibF9maXJlZXllX3Njb3JlX3Jl
c3VsdF9sb2cAIQgP/g/+/g/+D/7+Dw8PDwMD/v4PDwMDAwMDDxEREREPDy7AAP4GwAD+GP4YwAD+
GMAA/sD+wGAAwAAMAAwA/gz+DAAGAGAwAAMDAwPAAMAA/v///wH5R8Yr
n56FZh6euRWsRgAAAKBnAAAAAFgvAAAAAAEAAgAh///+//+P/xsAAAAAAAAAZwITcAisZoWe
nyBEZoWenyBEdo1f2Q==
'/*!*/;
# at 26528
#240704  2:55:27 server id 2887104926  end_log_pos 26559 CRC32 0xc31746b9       Xid = 25815548
COMMIT/*!*/;
# at 26559
#240704  3:25:13 server id 2887104926  end_log_pos 26624 CRC32 0x407ab7a3       GTID    last_committed=44       sequence_number=45      rbr_only=yes

 上面的只能看到操作记录,看不到binlog中各个字段的值,加个参数-v,可以查看到详细信息,查看各个字段的值:

mysqlbinlog  --base64-output=DECODE-PORS  
-v  
--read-from-remote-server 
--host=XXX --port=XXX 
--user=XXX --password=XXXX  
f266a8f5-binlog.000004 
# at 28164
#240704  7:12:48 server id 2887104926  end_log_pos 28195 CRC32 0xdbbed266       Xid = 25898559
COMMIT/*!*/;
# at 28195
#240704  7:13:21 server id 2887104926  end_log_pos 28260 CRC32 0xb2e7ff1f       GTID    last_committed=48       sequence_number=49      rbr_only=yes
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
SET @@SESSION.GTID_NEXT= 'c7a8d514-e0a6-11ee-9fe0-b22ac778b3fb:121'/*!*/;
# at 28260
#240704  7:13:21 server id 2887104926  end_log_pos 28347 CRC32 0x7cea87c4       Query   thread_id=5711004       exec_time=0     error_code=0
SET TIMESTAMP=1720048401.432573/*!*/;
BEGIN
/*!*/;
# at 28347
#240704  7:13:21 server id 2887104926  end_log_pos 28503 CRC32 0x6d70dd21       Table_map: `testdb`.`test_result_log` mapped to number 12120
# at 28503
#240704  7:13:21 server id 2887104926  end_log_pos 28573 CRC32 0xdb7f4839       Write_rows: table id 12120 flags: STMT_END_F
### INSERT INTO `testdb`.`test_result_log`
### SET
###   @1=32
###   @2=NULL
###   @3=NULL
###   @4=NULL
###   @5=NULL
###   @6=NULL
###   @7=NULL
###   @8=NULL
###   @9=NULL
###   @10=NULL
###   @11=NULL
###   @12=NULL
###   @13=NULL
###   @14=NULL
###   @15=NULL
###   @16=NULL
###   @17=NULL
###   @18=NULL
###   @19=NULL
###   @20=NULL
###   @21=NULL
###   @22=NULL
###   @23=NULL
###   @24=NULL
###   @25=NULL
###   @26=NULL
###   @27=NULL
###   @28=NULL
###   @29=1728616271.222
###   @30=1720048401.432
###   @31=1720048401.432
###   @32=NULL
###   @33=NULL

@中的1-33就依次是表中字段。

备注说明:mysqlbinlog 各参数含义:

基本参数
1、--start-position=POSITION
含义:从指定的 binlog 文件位置开始读取事件。
使用场景:需要从特定位置开始解析 binlog 时使用。

2、--stop-position=POSITION
含义:在指定的 binlog 文件位置停止读取事件。
使用场景:需要在特定位置停止解析 binlog 时使用。

3、--start-datetime=DATETIME
含义:从指定的日期和时间开始读取事件(格式:YYYY-MM-DD HH:MM
)。
使用场景:需要从特定时间点开始解析 binlog 时使用。
4、--stop-datetime=DATETIME
含义:在指定的日期和时间停止读取事件(格式:YYYY-MM-DD HH:MM
)。
使用场景:需要在特定时间点停止解析 binlog 时使用。


连接和输出相关参数
1、--host=HOST
含义:指定 MySQL 服务器的主机名。
使用场景:从远程服务器读取 binlog 时使用。

2、--port=PORT
含义:指定 MySQL 服务器的端口号。
使用场景:从远程服务器读取 binlog 时使用。

3、--user=USER

含义:指定用于连接 MySQL 服务器的用户名。
使用场景:从远程服务器读取 binlog 时使用。

4、--password=PASSWORD
含义:指定用于连接 MySQL 服务器的密码。
使用场景:从远程服务器读取 binlog 时使用。

5、--result-file=FILE
含义:将输出写入指定的文件。
使用场景:需要将解析结果保存到文件时使用。


过滤和格式相关参数
1、--base64-output=DECODE-ROWS
含义:将基于 Base64 编码的行事件解码为人类可读的格式。
使用场景:当 binlog 以 ROW 格式记录时,这个参数非常有用。

2、-v, --verbose
含义:详细模式,提供更多的上下文信息,包括表结构和事件的详细信息。
使用场景:需要详细了解 binlog 事件内容时使用。

3、--server-id=ID
含义:指定服务器 ID,只显示由该服务器生成的事件。
使用场景:过滤出特定服务器生成的 binlog 事件。

4、--database=DB_NAME
含义:只显示指定数据库的事件。
使用场景:需要解析特定数据库的 binlog 事件时使用。

5、--binlog-do-db=DB_NAME
含义:处理包含指定数据库更改的 binlog 事件。
使用场景:需要处理指定数据库的 binlog 时使用。

6、--binlog-ignore-db=DB_NAME
含义:忽略包含指定数据库更改的 binlog 事件。
使用场景:需要忽略指定数据库的 binlog 时使用。

7、--include-gtids=GTID_SET
含义:只包含指定 GTID 集的事件。
使用场景:需要解析特定 GTID 范围内的 binlog 事件时使用。

8、--skip-gtids
含义:不显示 GTID 事件。
使用场景:需要忽略 GTID 事件时使用。

9、--rewrite-db=OLD_NAME->NEW_NAME
含义:将事件中的数据库名称从 OLD_NAME 改写为 NEW_NAME。
使用场景:需要更改 binlog 事件中的数据库名称时使用。
4.2、定位到日志记录

从同步工具中找到报错时间的GTID值:c7a8d514-e0a6-11ee-9fe0-b22ac778b3fb:92,

①拉取mysql服务器的binlog

把binlog日志拉取到本地:

mysqlbinlog 
 --base64-output=DECODE-PORS 
 -v  
 --read-from-remote-server 
 --host=XXX --port=XXX 
 --user=XXX --password=XXXX  
 f266a8f5-binlog.000004 > test.binlog


②过滤查看binlog日志中GTID所在的日志

cat test.binlog |grep 'c7a8d514-e0a6-11ee-9fe0-b22ac778b3fb:92' -A200 -B200

日志结果如下:

SET @@SESSION.GTID_NEXT= 'c7a8d514-e0a6-11ee-9fe0-b22ac778b3fb:92'/*!*/;
# at 16340
#240703  7:17:39 server id 2887104926  end_log_pos 16415 CRC32 0xa9fa9a00       Query   thread_id=5609352       exec_time=0     error_code=0
SET TIMESTAMP=1719962259/*!*/;
BEGIN
/*!*/;
# at 16415
#240703  7:17:39 server id 2887104926  end_log_pos 16571 CRC32 0x96aae420       Table_map: `testdb`.`test_result_log` mapped to number 12120
# at 16571
#240703  7:17:39 server id 2887104926  end_log_pos 16712 CRC32 0x5debd65f       Delete_rows: table id 12120 flags: STMT_END_F
### DELETE FROM `testdb`.`test_result_log`
### WHERE
###   @1=1
###   @2='123456789'
###   @3=NULL
###   @4=NULL
###   @5=NULL
###   @6=NULL
###   @7=NULL
###   @8=NULL
###   @9=NULL
###   @10=NULL
###   @11=NULL
###   @12=NULL
###   @13=NULL
###   @14=NULL
###   @15=NULL
###   @16=NULL
###   @17=NULL
###   @18=NULL
###   @19=NULL
###   @20=NULL
###   @21=NULL
###   @22=NULL
###   @23=NULL
###   @24=NULL
###   @25=NULL
###   @26=NULL
###   @27=NULL
###   @28=NULL
###   @29=NULL
###   @30=1719962114.600
###   @31=1719962114.600
###   @32=NULL
###   @33=NULL
### DELETE FROM `testdb`.`tbl_test_result_log`
### WHERE
###   @1=2
4.3、问题定位

发现有删除记录的操作,这条记录正好是有问题的记录 @29=NULL,但是这个字段(rec_dt)是我用于分表的字段,lua中值为nil 导致同步异常。

问题终于定位到了,是因为有人测试时插入数据插入错了,第一次插入式忘记给这个字段赋值了,然后发现不对当时删除了。(@29  这个字段rec_dt没有设置默认值,后面就为NULL了)

4.4、为什么重启可以同步?

那还有诡异的,为什么重启后数据可以同步呢?按道理不应该卡着,都同步不了吗?

最后发现同步工具在目标端配置了多线程执行(thread_num: 64 #后端执行线程数量),同步的时候并不是串行的,即:源端和目标端的数据入库顺序可能不是完全一样的。

5、总结

①lua脚本要写的健壮,异常要考虑到位。

②有问题就去看看binlog,定位一下具体是什么原因。

③分表字段建议设置默认值,不然没办法分片。
 

大家使用过哪些数据库同步工具?是并行还是串行的?和数据库本身的主备同步有差别吗?

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在Apache HTTP服务器上配置 TLS加密

安装mod_ssl软件包 [rootlocalhost conf.d]# dnf install mod_ssl -y此时查看监听端口多了一个443端口 自己构造证书 [rootlocalhost conf.d]# cd /etc/pki/tls/certs/ [rootlocalhost certs]# openssl genrsa > jiami.key [rootlocalhost certs]# openssl req -utf8 -n…

docker buildx 交叉编译设置

dockerd配置文件 /etc/docker/daemon.json设置: rootubuntu:/etc/docker# cat daemon.json {"insecure-registries":["localhost:5000","127.0.0.1:5000","172.16.67.111:5000"],"features": {"buildkit&…

磁力泵与屏蔽泵

1.磁力泵的工作原理 磁力传动是利用磁体能吸引铁磁物质以及磁体或磁场之间有磁力作用的特性,而非铁磁物质不影响或很少影响磁力的大小,因此可以无接触地透过非磁导体(隔离套)进行动力传输。磁力传动可分为同步或异步设计。 大多数…

基于深度学习的人脸多任务识别(附代码)

项目说明 本项目为人脸多任务识别(单输入,多输出),可以同时输出人脸关键点、性别和年龄。 采用了两个算法进行应用的实现,人脸目标检测和人脸多任务识别。 其中人脸目标检测采用YOLOV5进行实现,主要对人脸部分进行截取&#xf…

查看电脑ip地址快捷键是什么?是哪个

在网络世界中,IP地址是每个网络设备的唯一标识,无论是我们的电脑、手机还是其他联网设备,都需要一个独特的IP地址来进行通讯。在日常生活和工作中,我们有时需要查看电脑的IP地址,以便进行网络设置、故障排查或远程连接…

WordPress主题开发进群付费主题v1.1.2 多种引流方式

全新前端UI界面,多种前端交互特效让页面不再单调,进群页面群成员数,群成员头像名称,每次刷新页面随机更新不重复,最下面评论和点赞也是如此随机刷新不重复 进群页面简介,群聊名称,群内展示&…

unix高级编程系列之文件I/O

背景 作为linux 开发者,我们不可避免会接触到文件编程。比如通过文件记录程序配置参数,通过字符设备与外设进行通信。因此作为合格的linux开发者,一定要熟练掌握文件编程。在文件编程中,我们一般会有两类接口函数:标准…

Vue异步操作发送AJAX请求

5. Vue异步操作 1 axios介绍 在Vue中发送异步请求,本质上还是AJAX。我们可以使用axios这个插件来简化操作! 使用步骤 1.引入axios核心js文件。 2.调用axios对象的方法来发起异步请求。 3.调用axios对象的方法来处理响应的数据。 axios常用方法 代码…

泽州县和美环保科技有限公司——绿色环保的践行者

在环保产业蓬勃发展的今天,泽州县和美环保科技有限公司以其卓越的技术和强大的实力,成为山西省危废综合处置领域的翘楚。作为雅居乐环保集团的全资子公司,和美环保科技有限公司紧跟集团发展战略,致力于为社会提供全方位的环境服务…

阿里云安装rabbitMQ

1、首先看linux 版本 uname -a如果时centos 7 可以参考其他文档。我这里是centos 8 这个很重要 。网上全是按centos7 按照。导致我前面一直安装不上 各种问题。 2、查看rabbitmq 对应 erl 的版本下载 https://www.rabbitmq.com/docs/which-erlang 选择rabbitmq 3.11.19 选择…

https 自签证书相关生成csr文件、p12文件、crt文件、jks文件、key文件、pem文件

文章目录 前言https 自签证书相关生成csr文件、p12文件、crt文件、jks文件、key文件、pem文件1, 检查openssl的版本2. 生成私钥和证书签署请求 (CSR)3. 生成自签名证书4. 将证书和私钥转换为 PKCS12 格式的密钥库5. 创建信任库 (Truststore)6. 将 PKCS12 文件转换为 JKS 文件7.…

java对接海康摄像头

现在制造业很多都是用的海康的摄像头,作为程序员有时候需要对接海康摄像头,实现门禁访问控制,监控预览,录像文件下载等功能。 一、开发环境准备 在海康官网下载SDK开发文档及库文件: https://open.hikvision.com/dow…

关于如何做好淘汰 IT 资产数据安全销毁工作的思考 文件销毁 硬盘销毁 数据销毁 物料销毁 文件粉碎

在当今数字化时代,企业的 IT 资产不断更新换代,淘汰的 IT 资产中往往存储着大量的敏感数据。如何确保这些数据在资产淘汰过程中被安全销毁,成为了企业面临的重要挑战。以下是对如何做好淘汰 IT 资产数据安全销毁工作的一些思考。 一、明确数…

WACV2023论文速览域迁移Domain相关

Paper1 CellTranspose: Few-Shot Domain Adaptation for Cellular Instance Segmentation 摘要原文: Automated cellular instance segmentation is a process utilized for accelerating biological research for the past two decades, and recent advancements have produc…

控制下属绝不是拍桌子、甩脸子、摆架子,一流领导都用这3招!

控制下属绝不是拍桌子、甩脸子、摆架子,一流领导都用这3招! 第一招:规矩严 国有国法,家有家规,公司也不例外。 下属能不能和领导齐心,愿不愿意共同发力,全看管理者如何操控。 毫无疑问的是&a…

Leetcode - 周赛403

目录 一,3200. 三角形的最大高度 二,3195. 包含所有 1 的最小矩形面积 I 三,3196. 最大化子数组的总成本 四,3197. 包含所有 1 的最小矩形面积 II 一,3200. 三角形的最大高度 本题是一道模拟题,可以先排…

【不容错过】可灵AI重磅更新:画质升级,运镜控制,首尾帧自定义,还有30万创作激励奖金!

还记得最近在各大平台肆虐的老照片变成视频吗,就是用快手的可灵AI做的,今天可灵又迎来了一次重大更新。 「电脑端上线了」 之前一直用其他工具生的图片还需要保存到手机上,再用可灵来生成视频,很多人都能感受到手机操作不太方便&…

七人互助拼团模式:共创共赢的电商新篇章

在当今电商行业的繁荣浪潮中,七人互助拼团模式犹如一股清流,凭借其独特的激励机制与深厚的互助合作文化,赢得了消费者与商家的广泛赞誉。这一模式不仅重新定义了团购体验,更在无形中强化了社群间的联系与协作,共同绘制…

提升用户体验之requestAnimationFrame实现前端动画

1)requestAnimationFrame是什么? 1.MDN官方解释 2.解析这段话: 1、那么浏览器重绘是指什么呢? ——大多数电脑的显示器刷新频率是60Hz,1000ms/6016.66666667ms的时间刷新一次 2、重绘之前调用指定的回调函数更新动画? ——requ…

多特征线性回归

目录 一、多特征符号意义说明:二、多特征模型表示:三、Numpy向量表示、内积计算:1.向量表示:2.内积计算: 四、多元线性回归梯度下降算法: 一、多特征符号意义说明: x下标j:表示第j个…