tidb4.0导入大量数据提示Transaction is too large

已设置set tidb_batch_insert=1; 之后inser into a select b,仍然报错> 8004 - Transaction is too large, size: 104857600, 之前用tidb3.x没有这样报错过,请问是什么原因呢.

  1. tidb_batch_insert=1 不建议使用,4.0 已经默认关闭。
  2. 可以尝试使用大事务,不过目前应该是实验属性,注意如果使用了binlog同步,无法使用大事务

https://github.com/pingcap/tidb/blob/v4.0.0-rc.1/config/config.toml.example

  1. 将事务分批,修改的总量小于 100 M

也就是说在tidb 4.0 版本,一个简单的insert into 还是搞不定? 就几十万数据。

1、v4 和 v3 表现有差异的原因,上面以及说了,是 v4 默认关别了 batch 功能(所以你修改参数也是没用的)
2、可以修改 tidb-server 的参数,把事物限制改大一点:txn_total_size_limit , 该配置项的最大值不超过 10737418240 (表示 10GB),不过如果使用了 大事物,需要考虑性能及 同步问题
3、我们建议事物改成小事物来提高性能

https://docs.pingcap.com/zh/tidb/stable/system-variables#tidb_batch_insert

其实还是可以执行的,正如文档所说:「 要使该特性生效,还需要开启 tidb_enable_batch_dml 并将 tidb_dml_batch_size 的值设置为正数。」
按照文档说明,应该TiDB现在版本(TiDB 6.1.1)的实现机制问题,这种情况下,很容易出现数据不一致的情况,所以要慎用。不过我的场景是:表中数据都是从MySQL同步的,只要把DM任务暂停,就没有外部写入了,验证后确实数据是一致的。
PS:其实我们也知道大事务不好,应该用小事务,不过inser into a select b这种需求,大概率是遇到TiDB不支持的DDL了(比如说,我这次就是要改主键),只能通过新建表,然后再把旧数据insert到新表中这种恶心的方式来搞了。这种需求比较临时,如果还额外搞个脚本来根据主键遍历来插入写入,就太不划算了