SQL被重复执行多次

为提高效率,请提供以下信息,问题描述清晰能够更快得到解决:
【 TiDB 使用环境】 2个 TIDB( tidb01:4000 ,tidb01:4001)
通过 HAProxy 做负载均衡 映射到 tidb01的 33060 端口


【概述】如果SQL 执行时间超过60s ,在2个TIDB中将会被重复执行
【背景】做过哪些操作
执行 insert into … select 操作
【现象】业务和数据库现象
1. 超过120s ,数据库将会断开

2. 查询ProcessList 结果如图
执行时间低于60s 时,查询

执行时间超过60s 时,查询

3.数据库表中将会出现重复记录

【业务影响】导致Java 捕捉到错误异常,后端SQL继续执行,数据重复插入
【TiDB 版本】 TIDB-5.2
【附件】

  1. TiUP Cluster Display 信息

  2. TiUP Cluster Edit Config 信息

  3. TiDB- Overview 监控

  • 对应模块日志(包含问题前后1小时日志)

这里有几个问题:

  1. haproxy 是不是配置有问题?
  2. 120S,保持连接的情况,是不会断开的
  3. insert into 执行要跑 60s ?
  4. 事务重试的配置,你是否开启了?

我建议,你不通过haproxy ,直连tidb,先测试一下,是否有保持连接超过120S 断开的情况

3 个赞

我们内网也用了haproxy 我猜这应该是 java的库retry导致的.

  1. 如果直连tidb ,是没有问题的
  2. insert into select 语句,通过查询A表统计余额,将余额写入另一张表B,A表中数据较多。
  3. 数据量几亿行,比较大,存在很多执行时间 超过60s 的SQL,甚至几十分钟的SQL,都会有这种重复被执行的问题。

HAProxy 推荐配置应该是怎样的?可否列举主要配置项

大的事务,对tidb 也有更高的内存要求,这个要有足够的测试才能确定

对于 Select 语句,最好在优化一下,减少查询的时长,可以有效的解决问题

haproxy 的配置信息,请通过haproxy的官网查阅相关的配置参数进行调整和校验

建议直接引用 https://docs.pingcap.com/zh/tidb/v5.0/haproxy-best-practices#配置-haproxy 的配置文件,改后端 IP ,重启 haproxy 后生效。尤其是以下两个参数:

   timeout client 30000s                   # 客户端与 HAProxy 连接后,数据传输完毕,即非活动连接的超时时间。
   timeout server 30000s                   # 服务器端非活动连接的超时时间。

如果是 sqlyog 或者是 navicat 工具操作,会有一些自动重连重试的行为,导致数据重复。

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