update 大表,事务过大的问题

版本 5.4

update大表的一个字段,大几百万条记录,事务过大失败
已经把事务大小调整为20G了,还是不够
9ee6728cd75dd9902b3f900bfe94196

我的问题是,如何能够在大表上简单的跑通update语句?
业务需要调整一个既有字段的值
写代码分批搞肯定可以,可是太麻烦了

1 个赞

临时调整下txn-total-size-limit再试试呢

2 个赞

20G肯定不够,要么你就继续加大,要么就分批提交。

1 个赞

我也遇到的这个问题,修改txn-total-size-limit貌似没有生效,重启tidb也不好使,用的是v5.2.3

不建议使用这么大的长事务,很容易导致dml锁。

这个值是所有 key-value 记录的总大小,包括索引

虽然通过一定的手续或者参数一定可以解决。但是请问确认这是业务场景吗?一次几十个GB?

感谢大家的关注和帮助

业务场景是这样的,因为业务逻辑变化,要调整数据库里既有的数据
比如一个字段的枚举值,在新业务逻辑里发生变化,从A改成B这样的,这个在业务发展中是很难完全避免的
几百万的这个还是个很小的表,大的会有几亿条
感觉怎么调整txn-total-size-limit都是不行的,没这么多内存
就只有分批调整这一条路了吗?

分批修改应该更好吧。单个事务太大,并发高了,会把整个数据库拖垮吧

修改程序不行吗?比如1代表一提交 0是未提交。现在要把1变成处理中 新增2是已提交。那在应用程序上改。

代码分批跑应该不麻烦吧,麻烦总比不成功好些:grin:

20G还不够?是联表更新?

明白了,那就只能分批修改了
原来是想问一下有没有其他简洁快速的方案的
感谢大家指导

改成小事务,调整TIKV的线程相关的参数

我们生产环境都是40G

txn-entry-size-limit调大,但是建议大事务分批处理

对,大事务还容易上锁。

生产环境的还是分批跑的好,否则给服务器增加配置后再试试调参

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