`
CtripMySQLDBA
  • 浏览: 56418 次
  • 来自: 上海
社区版块
存档分类
最新评论

MySQL中 metadata lock问题分析

阅读更多

  MySQL版本:5.6.12-log

 

 

Ø  场景一

 

 

Session1:



Session2:



Session3:



 

至此,我们会产生疑问,MySQL5.6说好的online DDL呢,怎么又会出现Waiting for table metadata lock

 

我们先来做个alter动作执行过程中,insert的操作

 

Session1:

 

 

Session2:



Session3:



 

显然MySQL5.6中执行alter过程中,允许对表进行插入动作,正如官网所说的

 

MySQL 5.6 enhances many other types of ALTER TABLE operations to avoid copying the table.

Another enhancement allows SELECT queries and INSERT, UPDATE, and DELETE (DML) statements

to proceed while the table is being altered. This combination of features is now known as online DDL.

  从上述例子可以看出,我们在执行DDL语句的时候得事先看一下,进程中是否已经存在某些DML语句

占用了表的元数据锁,这样会导致DDL语句处于锁等待状态。

 

 

Ø  场景二

 

Session 1:

 

 

 

Session 2:

 

 

Session 3:



 

Session 4:

查看当前进程

 

alter,drop动作均等待获取元数据锁,原因在于会话一中未关闭的事务,占用了表t1,t2的元数据锁

并未释放。

 

查看当前事务可以发现,id4的进程有未关闭的事务

 

 

 

Ø  场景三

 

Session 1:



 

Session 2:



 

Session 3:



Session 4:



 

 

查看当前打开事务

 

 

其实session1中的事务并未开启,但是由于select获取表元数据的语句,语法上是有效的,

虽然执行失败了,但是任然不会释放元数据锁,故而导致session23alter,drop动作被阻塞。

 

 

对于场景二中的现象,官网MySQL5.6MySQL5.5均中有解释如下:

If the server acquires metadata locks for a statement that is syntactically valid but fails during execution,

it does not release the locks early. Lock release is still deferred to the end of the transaction

because the failed statement is written to the binary log and the locks protect log consistency.

当出现场景二时,如何判断是哪个进程导致的呢,我们可以尝试查看

performance_schema. events_statements_current,分析进程状态来进行判断。



 

 

为什么引入MetaData Locking

 

5.5.3开始引进的Metadata Locking相关的改动

 

MetaData lock类型如下:

 

MDL_INTENTION_EXCLUSIVE

An intention exclusive metadata lock. Used only for scoped locks.

MDL_SHARED

To be used in cases when we are interested in object metadata only and there is no intention to access object data (e.g. for stored routines or during preparing prepared statements).

MDL_SHARED_HIGH_PRIO

Used for cases when there is no intention to access object data (i.e.data in the table).e.g. for.DESC TABLE

MDL_SHARED_READ

A shared metadata lock for cases when there is an intention to read data from table.( To be used for tables in SELECTs, subqueries, and LOCK TABLE ...  READ)

MDL_SHARED_WRITE

A shared metadata lock for cases when there is an intention to modify (and not just read) data in the table.To be used for tables to be modified by INSERT, UPDATE, DELETE statements, but not LOCK TABLE ... WRITE or DDL). Also taken by SELECT ... FOR UPDATE

MDL_SHARED_NO_WRITE

An upgradable shared metadata lock which blocks all attempts to update,table data, allowing reads To be used for the first phase of ALTER TABLE, when copying data between tables, to allow concurrent SELECTs from the table, but not UPDATEs

MDL_SHARED_NO_READ_WRITE

An upgradable shared metadata lock which allows other connections to access table metadata, but not data.To be used for LOCK TABLES WRITE statement.

MDL_EXCLUSIVE

An exclusive metadata lock.To be used for CREATE/DROP/RENAME TABLE statements and for execution of certain phases of other DDL statements

 

 

 

 

Metadata lock锁的相互依存关系:



 

 

5.5.3之前Meta Data Locking是怎么工作的:



 

尽管事务隔离级别是REPEATABLE-READ,还是不能重复SELECT

5.5版本之前的这个表现意味着,SQL可以以不同的顺序写入到binlog文件,

这违反了锁定义以及串行化的概念。

 

5.5.3之后版本是如何处理的Metadata Locking

 

5.5.3开始DDL语句以一个隔离的事务行为方式执行元数据的修改。也就是说,任何已经开始

的事务将一直持有表的元数据锁直到事务提交。由于开始的事务会持有事务关联的所有表的

元数据锁,所以任何DDL操作在前面的事务提交前是不能够执行的。

 

 

存在一个事务持有元数据锁等待的情况下,分别查看5.55.6版本上语句执行消耗

 

5.5版本:

 

l  测试一:

 

Session1事务未关闭

 

session1:


 

 

session2:



 

session3:



 

session4:



 

 

Session1事务关闭

 

session1:



 

session2:


 

session3:


 

 

l  测试二:

 

Session1事务未关闭

 

session1:


session2:


 

session3:



 

session4:



 

 

Session1事务关闭

 

session2:



 

 从上述测试可以看出,alter是一个多步的操作,旧表加上SNW锁之后,执行下面操作,

session1执行select事务未提交占有SR锁,alter动作可以加上共享锁SNW

但是在RENAME动作时无法获取独享排他锁,处于等待状态,session3需要获取SR锁,

但是由于锁的优先级导致只能处于等待状态;当session1执行delete事务未提交占有SW锁,

alter动作无法获取SNW锁,所以在opening tables时就开始等待。

 

 

5.6版本

 

l  测试一:

 

Session1事务未关闭

 

session1:



 

 

session2:



 

session3:



 

 

session4:



 

 

Session1事务关闭

 

session2:



 


 

session3:



 

 

 

l  测试二:

 

Session1事务未关闭

 

session1:



 

session2:


session3:



 

session4:



 

 

Session1事务关闭

 

场景与MySQL5.6版本测试一相同。

 

 

 

从上述测试可以看出,MySQL5.6alter动作加锁机制与MySQL5.5有明显差别。

不论session1执行的是select还是deletealter动作都会加一个独享元数据锁,所以都会影响session3的读取。

 

 

 

 


 
 

 

 

分享到:
评论

相关推荐

    MySQL出现Waiting for table metadata lock的原因方法

    MySQL在进行alter table等DDL操作时,有时会出现Waiting for table metadata lock的等待场景。而且,一旦alter table TableA的操作停滞在Waiting for table metadata lock的状态,后续对TableA的任何操作(包括读)...

    MySQL表结构变更你不可不知的Metadata Lock详解

    想必玩过mysql的人对Waiting for table metadata lock肯定不会陌生,一般都是进行alter操作时被堵住了,导致了我们在show processlist 时,看到线程的状态是在等metadata lock。本文会对MySQL表结构变更的Metadata ...

    MYSQL METADATA LOCK(MDL LOCK)MDL锁问题分析

    主要介绍了MYSQL METADATA LOCK(MDL LOCK)MDL锁问题分析,并通过实例给大家例句的问题处理办法,需要的朋友参考学习下。

    mysql锁表解表

    MySQL在进行alter table等DDL操作时,有时会出现Waiting for table metadata lock的等待场景。而且,一旦alter table TableA的操作停滞在Waiting for table metadata lock的状态,后续对TableA的任何操作(包括读)...

    MySQL-metadata-audit:用于审核和监视架构更改,变量更改和用户权限更改的脚本

    MySQL元数据审核它是什么? MySQL Metadata Audit曾经是(dbRecorder)[ ]的...获取代码从github获取最新版本http://github.com/isartmontane/MySQL-metadata-audit创建一个MySQL用户GRANT SELECT, LOCK TABLES ON *.

    解决MySQL 5.7中定位DDL被阻塞的问题

    在上篇文章《MySQL表结构变更,不可不知的Metadata Lock》中,我们介绍了MDL引入的背景,及基本概念,从“道”的层面知道了什么是MDL。下面就从“术”的层面看看如何定位MDL的相关问题。 在MySQL 5.7中,针对MDL,...

    淘宝内部分享:MySQL&MariaDB性能优化

    MySQL是目前使用最多的开源数据库,但是MySQL数据库的默认设置性能非常的差,必须进行不断的优化,而优化是一个复杂的任务,本文描述淘宝数据库团队针对MySQL数据库Metadata Lock子系统的优化,hash_scan算法的实现...

    MySQL & MariaDB性能优化

    MySQL是目前使用多的开源数据库,但是MySQL数据库的默认设置性能非常的差,必须进行不断的优化,而优化是一个复杂的任务,本文描述淘宝数据库团队针对MySQL数据库Metadata Lock子系统的优化,hash_scan 算法的实现...

    详细分析mysql MDL元数据锁

    当你在MySQL中执行一条SQL时,语句并没有在你预期的时间内执行完成,这时候我们通常会登陆到MySQL数据库上查看是不是出了什么问题,通常会使用的一个命令就是 show processlist,看看有哪些session,这些session在做...

    Mysql解决USE DB堵塞详解

    遇到故障,我们往往想的是如何解决这个故障,而不是从故障...schema.processlist来看有大量的 Waiting for table metadata lock 情急之下他杀掉了一大堆线程后发现还是不能恢复,最后杀掉了一个没有及时提交的事物才恢

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

     《Java JDK 7学习笔记》是作者多年来教学实践的经验总结,汇集了学员在教学过程中遇到的概念、操作、应用或认证考试上的各种问题及解决方案。  《Java JDK 7学习笔记》详细介绍了JVM、JRE、Java SE API、JDK与IDE...

    疯狂JAVA讲义

    学生提问:既然内部类是外部类的成员,是否可以为外部类定义子类,在子类中再定义一个内部类来重写其父类中的内部类? 211 6.7.4 局部内部类 211 6.7.5 匿名内部类 212 6.7.6 闭包(Closure)和回调 215 6.8 ...

Global site tag (gtag.js) - Google Analytics