txn-total-size-limit 事务大小限制无法限制DELETE

【TiDB 版本】 v4.0.11

【问题描述】

这边配置 txn-total-size-limit 为100MB,而如果使用DELETE删除数据,则可以超过100MB,请问一下DELETE有办法限制吗?

1 个赞

是否开启了这个参数 enable-batch-dml,会将大的 DELETE 拆分成不同的 batch,不建议开启该参数,可以关掉
https://github.com/pingcap/tidb/blob/master/config/config.toml.example#L55

没有配置这个参数。通过日志查看是false
这边是想限制DELETE操作事务的大小,不是拆分DELETE

那无法限制 DELETE 是指什么,其他的可以限制除了 DELETE?

这边配置 txn-total-size-limit 为100MB,
如果使用 INSERT , UPDATE 数据超过100MB则会报错 事务大小超过100MB。
而如果使用 DELETE 删除数据,则可以超过100MB。

txn-total-size-limit 只对 INSERT , UPDATE 有效,对 DELETE 无效。

根据什么判断 DELETE 事务大小超过 100MB 了

get到了知识点

INSERT INTO akkk.dba2
SELECT *FROM akkk.dba1 LIMIT 150000;

1 queries executed, 0 success, 1 errors, 0 warnings

查询:INSERT INTO akkk.dba2 SELECT *FROM akkk.dba1 LIMIT 150000

错误代码: 8004
Transaction is too large, size: 104857600

这里可以执行,这样算不算?
DELETE FROM dba1 LIMIT 150000;

猜测是 insert 的时候需要将所有数据的 key 和 value 写入到 tidb 缓存计算总的 size,而 delete 只需要获取这一行 rowid 并构造出索引的 key 即可,并不需要读取缓存 value,所以计算的出来的大小会不一样。

那这块可以控制吗?

因为会出现人为 DELETE 上 GB,甚至10GB以上的表。导致服务节点异常。

目前 5.0 版本对事务限制只有 txn-entry-size-limittxn-total-size-limit 两个参数分别限制单行数据和单个事务大小,check 的方式是 tidb 内部 memory db 写入的时候,计算 key 和 value 的 size 大小,而 delete 的 value 是个 nil,所以相当于只有 key 的 size 影响大小计算。

delete limit 对于不加条件的删除所有数据,建议用 truncate table;对于加条件的 delete,需要业务人员限制 limit 数量,或者根据删除条件看能否建分区表,如 range 或 list 分区,然后 truncate partition;对于其他无法控制的情况,通常 delete 大量数据执行时间较长,可以设置 max_execution_time 限制这类 SQL 运行,直到删除的数据在合理的范围。

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