标签:waiting for table metadata lock
什么是MDL
MDL,Meta Data lock,元数据锁,一般称为字典锁。字典锁与数据锁相对应。字典锁是为了保护数据对象被改变,一般是一些DDL会对字典对象改变,如两个事物,事物1先查询表,然后事物2试图alter,其首先需要等待事物1结束(提交或回滚),此时的状态便是Waiting for table metadata lock,然后才能获得字典锁。后续对TableA的任何操作(包括读)都无法进行,也会在Opening tables的阶段进入Waiting for table metadata lock的队列。如果是线上业务的核心表出现了这样的锁等待队列,就会造成灾难性的后果。数据锁是保护表中的数据,如两个事物同时更新一行时,先得到row lock的事务会先执行,后者只能等待。
出现的情况:
场景一:
通过show processlist可以看到TableA上有正在进行的操作(包括读),此时alter table语句无法获取到metadata 独占锁,会进行等待。出现Waiting for table metadata lock
场景二:
通过show processlist看不到TableA上有任何操作,但实际上存在有未提交的事务,可以information_schema.innodb_trx中查看到。在事务没有完成之前,TableA上的锁不会释放,alter table同样获取不到metadata的独占锁。
场景三:
通过show processlist看不到TableA上有任何操作,在information_schema.innodb_trx中也没有任何进行中的事务。这很可能是因为在一个显式的事务中,对TableA进行了一个失败的操作(比如查询了一个不存在的字段),这时事务没有开始,但是失败语句获取到的锁依然有效。从performance_schema.events_statements_current表中可以查到失败的语句。
本文出自 “mysql大数据实战” 博客,请务必保留此出处http://277963679.blog.51cto.com/6966371/1976802
标签:waiting for table metadata lock
原文地址:http://277963679.blog.51cto.com/6966371/1976802