Tidb删除数据出现transaction is too large

当我们用tidb删除数据的时候,报错:

[2019-08-29 08:32:26] [0.98ms] SET @@tidb_batch_delete = 1; [0 rows affected or returned ]

[2019-08-29 08:32:26] [0.89ms] SET @@tidb_batch_commit = 1; [0 rows affected or returned ]

[2019-08-29 08:32:26] [223.51ms] DELETE FROM block_vin WHERE (spentBlockHeight >= 590000) [8773 rows affected or returned ]

[2019-08-29 08:32:31] [4344.93ms] DELETE FROM block_tx WHERE (blockHeight >= 590000) [157313 rows affected or returned ]

[2019-08-29 08:32:43] [17077.34ms] DELETE FROM block_vout WHERE (blockHeight >= 590000) [417255 rows affected or returned ]

[2019-08-29 08:32:43] [17077.25ms] DELETE FROM block_info WHERE (height >= 590000) [65 rows affected or returned ]

[2019-08-29 08:32:48] Error 8004: transaction is too large ERRO[0021] 提交回滚区块事务异常:Error 8004: transaction is too large,区块高度:590000

[2019-08-29 08:32:48] [1.01ms] SET @@tidb_batch_commit = 0; [0 rows affected or returned ]

[2019-08-29 08:32:48] [0.90ms] SET @@tidb_batch_delete = 0; [0 rows affected or returned ] panic: Error 8004: transaction is too large

这个问题怎么解决,根据配置设置了还是没用

尝试调低tidb_dml_batch_size这个参数试下

2赞

建议分而治之,对于大事务,我一般不会直接删除,而是分批删。

在开启了tidb_batch_delete 和 tidb_batch_commit,之后,单个事务的大小由 tidb_dml_batch_size * 单行数据量行来决定。tidb_dml_batch_size 默认值是20k,如果单行的数据量比较大,就会超过单个事务的大小限制。

由于分布式事务要做两阶段提交,并且底层还需要做 Raft 复制,如果一个事务非常大,会使得提交过程非常慢,并且会卡住下面的 Raft 复制流程。为了避免系统出现被卡住的情况,我们对事务的大小做了限制:

  • 单个事务包含的 SQL 语句不超过 5000 条(默认)
  • 单条 KV entry 不超过 6MB
  • KV entry 的总条数不超过 30w
  • KV entry 的总大小不超过 100MB

谢谢了,我们找了一下这些设置的参数,然后只发现在会话级别里能设置,但有没是全局设置的或者配置文件可以设置的?

都只是会话级别参数。因为这个参数其实破坏了事务的原子性,不建议全局使用。

我用docker安装的 在哪能配置 tidb_dml_batch_size 这个属性