tidb数据写入没有报异常,但是查不到最新数据

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

  • 【TiDB 版本】:v4.0.0-rc.1
  • 【问题描述】:spark任务通过jdbc写入数据,任务没有报错,但是在客户端查询不到更新插入的数据,重置三次kafka位点,都查不到最新数据,最后通过在终端手动写入才成功,实时任务总数据量一直都是对的,实时变化的

这是老数据
image

这是最新数据




若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出的打印结果,请务必全选并复制粘贴上传。

请问一下 statement.executeUpdate 里面传的参数是什么内容?

能否在 catch else 里面增加 throw e?

statement.executeUpdate里面的参数是一组insert into {0} ({1}) values({2}) ON DUPLICATE KEY UPDATE {3}
如果有异常的话,会这样打出来

batchSqls 的内容能否打印一下看看?

就是截图中的insert语句,Arrays.toString(batchSqls)会加上一个逗号,String.join(“”, batchSqls)没有加。

这个 insert into 的sql语句直接复制到mysql client里面执行 能成功吗?

这个给我的感觉是写入进去了,因为spark流处理之后,tidb里面的数据总量和es里面的数据总量是一样的,都是动态增加的。只是昨天晚上发现那条数据更新之后,一直查不出来最新值,最后在终端更新了下,就查出来了最新值。会不会是tidb有缓存,还是别的原因导致的。

可以执行成功

tidb没有缓存的

有没有可能是 update 失败(例如拼接后的sql长度太长导致失败)?这样数据总量是对的

两边数据都是一致的,延时也是秒级


update (非insert) 失败的情况下 count(*)的结果是对的 不矛盾

失败了的话,会报错的呀。tidb没有这个表的插入报错记录,spark日志也没有报错,而且一个批次只有100条数据

明确下问题:

  1. spark - jdbc - tidb 写入数据,spark 收到写入成功的消息,能否判断 tidb 是否也写入成功。
  2. 可以看会下 spark 写入 tidb 数据时间点的 tidb.log 和 执行的 sql 语句。

这条记录是在20:41:45秒提交成功的,此时两个tidb节点没有报相关错误



你好,

确认下,

  1. 执行语句类型是否为 update。
  2. 程序打印 表 xxx 变更两条数据 的逻辑是什么。

这是之后重置位点之后执行的一次,也没有更新成功

image


1.语句是insert into {0} ({1}) values({2}) ON DUPLICATE KEY UPDATE {3}这种insert update

2.这个统计逻辑重置位点之前是用的statement.executeUpdate的返回值,变更位点之后用的是statement.executeUpdate(String.join("", batchSqls));里面batchSqls数组的大小

:sob:关键是程序和tidb都没有报错,就不确定是不是成功了

我的理解和你类似,不知道程序是否发起了 sql 语句,或者是否到 tidb 真正执行了,这个还是需要排查的,从目前的信息来看,tidb 手动执行 sql 没有问题,tidb log 中无报错信息,唯独有程序的日志打印,需要核实下。