TiDB 2.0 报错 9500 Transaction too large

TiDB执行语句报错:
insert into t select * from tt;
报错信息:
9500:Transaction too large

错误代码: 9500
transaction too large, len:300001


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

单条 KV entry 不超过 6MB
KV entry 的总条数不超过 30w
KV entry 的总大小不超过 100MB


解决办法:
对于 insert 和 select,可以开启 set @@session.tidb_batch_insert=1; 隐藏参数,insert 会把大事务分批执行。这样不会因为事务太大而超时,但是可能会导致事务原子性的丢失。如果事务执行过程中报错,会导致只完成一部分事务的插入。所以建议只有在需要的时候,在 session 中使用,这样不会影响其他语句。事务完成以后,可以用 set @@session.tidb_batch_insert=0 关闭。

对 delete 和 update 语句,可以使用 limit 加循环的方式进行操作。

--操作步骤:
set @@session.tidb_batch_insert=1;
insert into t select * from tt;
set @@session.tidb_batch_insert=0;

-- 删除操作:
set @@session.tidb_batch_delete=1;
set @@session.tidb_batch_delete=0;
对应的update操作:
set @@session.tidb_batch_update=1;
set @@session.tidb_batch_update=0;

参考:
https://pingcap.com/docs-cn/FAQ/
https://pingcap.com/docs-cn/sql/error/

 

你可能感兴趣的:(TiDB)