删除一天的数据提示tracsation is too large ,size 34746528

  • 【TiDB 版本】:
    tidb-server -V
    Release Version: v4.0.0-alpha-1327-g86ff21b07
    Git Commit Hash: 86ff21b07630a5cef4af053970e5c20182b740fb
    Git Branch: master
    UTC Build Time: 2020-01-07 12:58:31
    GoVersion: go1.13
    Race Enabled: false
    TiKV Min Version: v3.0.0-60965b006877ca7234adaced7890d7b029ed1306
    Check Table Before Drop: false
* 【问题描述】:删除一天的数据提示tracsation is too large ,size 34746528
参数:

    stmt-count-limit = 5000000000000

    txn-total-size-limit= 10000000

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

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

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

可以参考下过往的帖子:

image

还是提示这个错误

几种方案都试了

tidb_batch_delete 以及 tidb_batch_size 需要配合使用。(注意会破坏事务原子性)。可以根据报错情况再适当调小 tidb_batch_size

怎么调整呢

就是开启了 tidb_batch_delete 之后可以配合设置 tidb_batch_size 再做尝试,如: set @@tidb_batch_delete = 1 , @@tidb_dml_batch_size = 100; delete from .......;

还是继续报错。    
set @@tidb_batch_delete = 1 , @@tidb_dml_batch_size = 20000000000000; 
delete from if_date_resource_source where date='2020-01-05';

select count(*) from if_date_resource_source where date='2020-01-05';
+----------+
| count(*) |
+----------+
|   163344 |
+----------+

表结构是这样的

麻烦调小一点 @@tidb_dml_batch_size 多谢,还是报错是指当前 batch 还是超过限制了。

set @@tidb_batch_delete = 1 , @@tidb_dml_batch_size = 1,@@tidb_batch_commit = 1 ,@@autocommit = 1 ; 
delete from if_date_resource_source where date='2020-01-05';

麻烦再按照上述的命令试一下。

  • 确认了一下,4.0 版本要使用 batch_delete 的功能需要开启 enable-batch-dml 。需要把 {deploy_path}/conf/tidb.toml 的 enable-batch-dml 设置成 TRUE ,然后重启该 tidb-server。
  • 另外最新版本的 tidb-server 也有支持 大事务的新特性,可以把 txn-total-size-limit 参数调大,然后重启该 tidb-server。
  • 另外如果需要尝试新特性,请使用 v4.0.0-beta 的最新版本。

enable-batch-dml 设置成 TRUE 这个添加在配置文件的哪个内容下呢?放在[performance] 不生效

已经解决了,谢谢

:+1::+1:

问一下开启batch 会破会事物的原子性是怎么样的场景呢? 事物执行失败不会全部回滚?还是怎么样呢

还有一个问题,我测试 600M 的数据写入Mysql 和写入tidb ,批量限制500条提交一次,mysql 用了2分钟,tidb 用了11分钟,这个是什么原因会导致这么大的差异呢?和tidb server 服务器的硬件性能有关系吗,还是有别的其他原因?

请提供具体的版本、配置、监控等信息,并开新帖提问,谢谢~