为什么我的DDL不锁表,但还是阻塞了所有该表的SQL?

x33g5p2x  于2020-08-28 发布在 Mysql  
字(0.5k)|赞(0)|评价(0)|浏览(609)

MySQL的Online DDL在改表结构过程中不会影响增删查改。但是我们经常遇到online ddl出现Waiting for table metadata lock而被阻塞,这个就是mysql 5.5版本开始引入的元数据锁,目的是保证事务中读到的表结构是一致的。

元数据锁分为读锁和写锁,读锁之间兼容,读锁和写锁会等待,任何增删查改操作都会先申请MDL读锁,直到事务提交才释放。

online ddl的元数据锁申请步骤是这样的:

1.申请MDL写锁
2.申请到后降级为MDL读锁
3.真正的DDL操作
4.申请MDL写锁
5.释放MDL锁

而ddl出现Waiting for table metadata lock的情况就是在第1和第4个步骤申请MDL写锁的时候在等待MDL读锁,更严重的是,在ddl拿到MDL写锁之前,新的增删查改操作都会等待ddl的MDL写锁,导致mysql的线程数飙升,甚至打满连接。例如:

A:begin; select * from t;
commit;
B: alter table t add f1 int;(阻塞)
C: select * from t;(阻塞)
所以,如果我们开启了事务,尽管只是select,查完一定记得提交,否则会一直占用该表的MDL读锁。并且建议ddl操作都在该表的业务低峰期进行,目的就是降低MDL锁的影响。

相关文章

热门文章

更多