前提: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在第一阶段和第三阶段分别要获取一次锁,在第三阶段的时候发现又有事务未执行完,阻塞住,就会出现一开始执行不会阻塞,在中途会阻塞的场景。解决方法同上。
没看懂。。。。
前几天域名没续费,你最近过得好吗?文章都很久没更新了,应该很忙吧