MDL(Meta Data LocK)的作用
在MySQL5.1及之前的版本中,如果有未提交的事务trx,当执行DROP/RENAME/ALTER TABLE RENAME操作时,不会被其他事务阻塞住。这会导致如下问题(MySQL bug#989)
master: 未提交的事务,但SQL已经完成(binlog也准备好了),表schema发生更改,在commit的时候不会被察觉到.
slave: 在binlog里是以事务提交顺序记录的,DDL隐式提交,因此在备库先执行DDL,后执行事务trx,由于trx作用的表已经发生了改变,因此trx会执行失败。 在DDL时的主库DML压力越大,这个问题触发的可能性就越高
在5.5引入了MDL(meta data lock)锁来解决在这个问题
MDL锁的类型
metadata lock也是一种锁。每个metadata lock都会定义锁住的对象,锁的持有时间和锁的类型
属性 | 范围 | 作用 |
---|---|---|
GLOBAL | 全局锁 | 主要作用是防止DDL和写操作的过程中执行 set golbal_read_only =on 或flush tables with read lock; |
commit | 提交保护锁 | 主要作用是执行flush tables with read lock后,防止已经开始在执行的写事务提交 |
SCHEMA | 库锁 | 对象 |
TABLE | 表锁 | 对象 |
FUNCTION | 函数锁 | 对象 |
PROCEDURE | 存储过程锁 |