TiDB异常:transaction is too large

为提高效率,请提供以下信息,问题描述清晰能够更快得到解决:
【 TiDB 使用环境】linux环境

【概述】 对大表进行多表联查后插入到一张新表中:insert into …select … 。
尝试设置:
set @@session.tidb_batch_insert =1
set @@tidb_batch_insert=ON 均无效。

【背景】 大表一张大概30G.

【现象】 ERROR 8004 (HY000) at line 1: Transaction is too large, size: 1073741830

【业务影响】 不能插入大数据

【TiDB 版本】 tidb5.2.1

参考这里,修改配置参数txn-total-size-limit
https://docs.pingcap.com/zh/tidb/v4.0/maintain-tidb-using-tiup/#示例

1赞

分批插入吧,预期内现象,tidb有事务大小控制,可以由参数控制,最大10G

1赞

30G太大了,建议还是分批插入

:thinking:他说的是大表30G,而不是要插入30G吧

哦哦,我以为一个事务这么大呢

插入也那么大

插入30G肯定是不行了,还是按楼上说的搞分批吧。
另外tidb_batch_insert这个参数4.0以后好像就没用了,改成txn-total-size-limit配置文件参数控制了

txn-total-size-limit

  • TiDB 单个事务大小限制
  • 默认值:104857600
  • 单位:Byte
  • 单个事务中,所有 key-value 记录的总大小不能超过该限制。该配置项的最大值不超过 10737418240 (表示 10GB)。注意,如果使用了以 Kafka 为下游消费者的 binlog ,如: arbiter 集群,该配置项的值不能超过 1073741824 (表示 1GB),因为这是 Kafka 的处理单条消息的最大限制,超过该限制 Kafka 将会报错。

总结一下解决方案:
1、调整事务大小参数,参数在tidb配置文件中,参数名为txn-total-size-limit,默认为1G,最大可调整为10G。
调整方式参考这里:https://docs.pingcap.com/zh/tidb/v4.0/maintain-tidb-using-tiup/#修改配置参数
2、优化语句,可以将脱敏语句或者执行计划发出来,看看有无优化空间。
3、视业务情况分批插入,比如按时间段,按主键区间等
4、如果是数据迁移,可以直接rename表名,或者通过工具进行迁移。

4赞