ITPub博客

首页 > 数据库 > MySQL > MySQL 5.6 drop database时,table metadata lock等待

MySQL 5.6 drop database时,table metadata lock等待

原创 MySQL 作者:jesselyu 时间:2015-03-07 18:01:37 0 删除 编辑

 

一个线下库环境,开发人员不提交DML和查询事务,导致drop database时,遭遇表的metadata lock(MDL)等待,而不是SCHEMA上。

即会看到 “Waiting for table metadata lock”,而不是”Waiting for schema metadata lock”。这是为什么呢?

 

经过源码分析,原因如下。

我们知道:

select 语句在操作时,需要对表对象持有MDL_SHARED_READ锁。

而DML语句在操作时,需要对表对象持有MDL_SHARED_WRITE锁。但都不需要SCHEMA级别metadata lock锁。

另外drop database 时,需要依次获取以下MDL锁:

1) MDL_INTENSION_EXCLUSIVE(GLOBAL),STATEMENT 级别

2) MDL_EXCLUSIVE(SCHEMA),TRANSACTION级别

3) MDL_EXCLUSIVE (TABLE),TRANSACTION级别。在此database下的每个对象,需要MDL_EXCLUSIVE锁。

 

那么原因就非常明显了:

这是因为查询或者DML一张表时,只会获取这个表的MDL_SHARED_READ或者MDL_SHARED_WRITE锁;

而drop database 时,会按以上流程获取相关锁,因此只在第三步有冲突,前面两步不会有冲突。

 

示例如下:

1. 起查询事务

clip_image001

2. 删除数据库,此时当前会话hang住。

clip_image002

3. Show processlist结果,看到有”Waiting for table metadata lock”。

image

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30088583/viewspace-1451772/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
资深Oracle RAC及Exadata部署实施运维专家,曾从事PostgreSQL内核开发与性能优化。丰富的大规模数据库管理架构设计经验。目前在阿里巴巴从事数据库架构工作以及新技术引进,对分布式存储,云计算及并行编程有一定研究。技术讨论请加微信:ljs521688

注册时间:2015-01-01

  • 博文量
    43
  • 访问量
    574868