tidb binlog丢失DML事件问题排查

【 TiDB 使用环境】生产环境
【 TiDB 版本】5.0.2
【问题表现】集群某些表的DML binlog事件丢失。
【问题描述】
pump组件配置:

# WARNING: This file is auto-generated. Do not edit! All your modification will be overwritten!
# You can use 'tiup cluster edit-config' and 'tiup cluster reload' to update the configuration
# All configuration items you want to change can be added to:
# server_configs:
#   pump:
#     aa.b1.c3: value
#     aa.b2.c4: value
gc = 7

drainer组件配置:

[syncer]
db-type = "file"
[syncer.to]
retention-time = 7

使用reparo 5.0.2版本进行sql打印的配置文件:

data-dir = "/data/drainer-8249/data"
log-level = "debug"
dest-type = "print"
txn-batch = 20
worker-count = 16
safe-mode = false

为了减少干扰我去除了库表过滤,然后在数据库中做了以下几种操作:

  1. 新建test库和test.t表,插入一些数据。 结果显示只能看到DDL语句,DML全部丢失。
  2. 在一个能正常输出DML事件的库中新建t表。结果显示还是只能看到DDL语句,DML全部丢失。

请问,在什么情况下会出现这种DML事件全部丢失的问题?我检查了3个pump实例的日志都没有看到ERROR级别的错误,drainer也是只有在DDL事件时输出相关INFO,然后就是常规的"write save point"日志。

神了,找到一个能正常输出dml binlog的表,和别人使用相同的客户机用相同的mysql驱动更新相同的表,我更新的就不输出binlog,他的程序的更新就会输出binlog,不过他是1min更新一次,偶尔也丢。接下来计划重装pump看看。

你可以试试drainer输出成文件,然后用Reparo 解析这些binlog文件成sql,在查看是否真的丢失dml语句


步入玄学领域了,两个DDL之间夹杂一个DML,DML就是被隐藏。


重装还得等到业务低峰期,现在还在找方向,目前感觉可能存在什么孤儿tidb实例,可能会是集群配置方面的问题导致。
上图显示binlog都开了,但我感觉不可信。

:joy:问题找到了,孤儿tidb没找到,找到一个显示binlog enable但是其实没开的tidb实例,就是上边截图里那3个binlog.enable为true的其中之一。
3个tidb都试了下,其中两个能正常产生binlog,一个不能,不知道有没有更直接的办法(例如日志等)来证明某个tidb在输出binlog。
在极端异常的场景下,information_scheme.cluster_config表显然也不可信。

1 个赞

补充:
这几天排查下来发现还有一个6.5.1版本的集群有相同的现象,一直以来我们binlog的安装方式是安装好pump组件之后,修改tidb实例的binlog.enable参数然后reload tidb。
开始我认为是pump组件的安装有问题,reload tidb之后应该restart一次,因为两个集群的共同现象是只有1个tidb实例的binlog生效,可能是reload滚动重启带来的问题。
但后来想想这种修改tidb配置后进行reload也没啥逻辑缺陷,在一个7.0的集群上试了一下装好的binlog在所有tidb也都生效了。
目前是怀疑某些版本的tiup/tidb/binlog在reload时有缺失,现在稳妥起见reload之后再加一遍restart tidb。
这种BUG目前无法被常规手段发现,无论是tidb 10080端口还是系统视图都显示binlog.enable已开启,但是实质上解析binlog文件或者kafka消息都会发现:在某些tidb实例上binlog无法生成。
当前只能先手动排查下所有binlog集群,对同步和故障恢复的影响很大。

1 个赞

是通过以下方式修改binlog参数的吗?

执行edit-config命令,修改集群配置:
$ tiup cluster edit-config tidb-test
在server_configs下tidb部分,添加如下配置
执行edit-config命令,修改集群配置:
binlog.enable: true
binlog.ignore-error: true

然后reload

类似吧,通过读取meta.yaml修改并覆盖原内容,reload之后所有tidb实例的配置文件都会显示已同步修改。

此话题已在最后回复的 60 天后被自动关闭。不再允许新回复。