Online DDL失效问题

@liubb  July 22, 2021

前提:mysql已经升级成5.7版本,但是在ddl操作的时候有时仍然会出现阻塞操作,导致后续的查询都阻塞,影响线上业务。

大概用自己语意表达下
出现两种情况
1.刚开始执行ddl就阻塞,影响对应表的其他查询操作。
2.在ddl执行一半的时候阻塞,影响对应表的其他查询操作。

第1种情况分析:
ddl大概分为三个步骤,1.提交 2.执行 3.commit
在第1个步骤开始时需要获取排他锁,此时如果有未完成的事务占据该表,则无法获取锁,阻塞住,同时接下来的其他dml操作也会由于ddl阻塞住。
查询未完成事务:

select
  i.*
from
  information_schema.innodb_trx i,
  (
    select
      id,
      time
    from
      information_schema.processlist
    where
      time = (
        select
          max(time)
        from
          information_schema.processlist
        where
          state = 'Waiting for table metadata lock'
          and substring(info, 1, 5) in (
            'alter',
            'optim',
            'repai',
            'lock ',
            'drop ',
            'creat'
          )
      )
  ) p
where
  timestampdiff(second, i.trx_started, now()) >= p.time

kill掉,恢复正常。

第二种情况分析:
ddl在第一阶段和第三阶段分别要获取一次锁,在第三阶段的时候发现又有事务未执行完,阻塞住,就会出现一开始执行不会阻塞,在中途会阻塞的场景。解决方法同上。


添加新评论

  1. 没看懂。。。。

    Reply
  2. 前几天域名没续费,你最近过得好吗?文章都很久没更新了,应该很忙吧

    Reply