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锁的影响。
内容来源于网络,如有侵权,请联系作者删除!