多个ddl 如何调整执行顺序,让修改表结构的先执行,索引后执行


系统中有正在添加索引的ddl,临时来的需求,需要修改表结构,但是修改表结构和创建表的排在后面,如何能够提高修改表结构的优先级,我之前好像看到过不是说修改表结构的和索引的队列不是一个么?求大佬给与解决方案

tidb有2个ddl对列,加索引队列和其他类型ddl队列, 一般来说2个队列之间的操作不影响,但相互间有依赖关系,比如加了一列,同时对这列加索引那么加索引操作就得等加列动作完成。 还有一些DDL比如变更字段类型这些也有数回填 也会比较耗时可以考虑放在后面

目前现在的情况就是加索引的队列阻塞了修改表结构的ddl ,两个还不是一张表,我如何能让修改表结构的和索引并行执行呐

admin show ddl jobs看下

我问题中的图就是 admin show ddl jobs 的,modify 的就是在后面排着

这是什么版本

5.4.0

如果加列动作没完成,加索引应该报错,不会进入队列吧

现在是表结构修改未生效 索引在正常写入

ddl都会加入队列等待执行,到add index时确实会报错。

目前是加索引的列的表和加索引的表不是一个啊 ,前面的索引已经完成了两个了,修改表的依旧在排队,不符合两个队列独立的原理啊

确实不太符合,还有些未知的细节

两个表有没有主外键关系,操作的是不是主外键字段


把这个drop index的cancel了看看: ADMIN CANCEL DDL JOBS job_id

蹲个答案

同一个表中jobid小的先执行,同一表的DDL串行执行, 前面有add index使用一个队列,导致后面的drop index被阻塞,而drop index是使用另一个job queue,且是Job queue的第一个,所以导致后面的modify column 等阻塞。
我测试了下:
1、 由于同表上ddl必须串行依赖,前面的没执行完导致cancel drop index 一直处于canceling状态,等前面执行完后很快变成canceld;
2、同时执行表1仅add index,表2执行modify column 无阻塞,能并行执行。
为避免阻塞其他表的非add index ddl,避免在相同的表执行add index时执行其他类型DDL

有点死锁的味道

官方现在貌似在改进ddl,用mysql下的系统表替代queue

该主题在最后一个回复创建后60天后自动关闭。不再允许新的回复。