【MySQL】MetaData Lock 之一

一 简介
 和MySQL打交道比较多的朋友,肯定遇到过 "Waiting for table metadata lock"或者由于MDL导致的故障,不过本文介绍MDL锁之前 我们先看一个著名的bug#989 大致情况如下:
 s1:
  BEGIN;
  INSERT INTO t ... ;
  COMMIT;
 s2:
  DROP TABLE t;
然后上面的操作流程在binlog记录的顺序是 
 DROP TABLE t;
 BEGIN;
  INSERT INTO t ... ;
 COMMIT;
很显然备库执行binlog时会先删除表t,然后执行insert 会报1032 error,导致复制中断。为了解决该bug,MySQL 在5.5.3引入了MDL锁。
二  metadata lock是什么

  顾名思义,metadata lock即元数据锁。在数据库中元数据即数据字典信息包括db,table,function,procedure,trigger,event等。metadata lock主要为了保证元数据的一致性,用于处理不同线程操作同一数据对象的同步与互斥问题,如:

s1: begin select * from t1 for update ... 

s2: begin alter table t1 add column str varchar(30)

 在以上两个事务中,s1 s2都会操作表t1,但由于s1首先获取t1的锁,而s2在获得锁的时候由于互斥,所以只能等待;
  其实5.5也有类似保护元数据的机制,只是没有明确提出MDL概念而已。但是5.5之前版本(比如5.1)与5.5之后版本在保护元数据这块有一个显著的不同点是,5.1对于元数据的保护是语句级别的,5.5对于metadata的保护是事务级别的。所谓语句级别,即语句执行完成后,无论事务是否提交或回滚,其表结构可以被其他会话更新;而事务级别则是在事务结束后才释放MDL。引入MDL后,主要解决2个问题 
事务隔离问题,比如在可重复隔离级别下,会话A在2次查询期间,会话B对表结构做了修改,两次查询结果就会不一致,无法满足可重复读的要求.
数据复制问题,比如会话A执行了多条更新语句期间,另外一个会话B做了表结构变更并且先提交,就会导致slave在重做时,先重做alter,再重做update时就会出现复制错误的现象。也就是简介中提到的bug。

三 小结
   
   MySQL引入MDL之后 也会带来一定的负面影响  比如 “wait for global read lock”或者“wait for table lock”之类的锁等待,当遇到大查询,同时遇到一个DDL ,基本能造就一个故障了。后面的文章会深入介绍MDL的实现原理和运行机制,加入一些常见的案例和解决方法。

时间: 2024-08-02 22:20:07

【MySQL】MetaData Lock 之一的相关文章

MYSQL METADATA LOCK(MDL LOCK)学习(1) 理论知识和加锁类型测试

原创,水平有限如有错误请指出共同探讨本文中某些结论性的东西我用黄色标记出来请大家多多留意一下另外我家二娃刚刚出生,大家祝福我一下吧.谢谢!^_^ 本文网址 http://blog.itpub.net/7728585/viewspace-2143093/ 源码版本:5.7.14注意MDL和DML术语的不同. 一.前言    MYSQL中MDL锁一直是一个比较让人比较头疼的问题,我们谈起锁一般更加倾向于INNODB下层的gap lock.next key lock.row lock等, 因为它很好理

MySQL metadata lock的前世今生(5.1=>5.7)

最近有同事经常问到一些metadata lock相关的问题,就顺便理一下吧,主要是整理下相关的连接和文档,标题写的有点大  ----------– 最初为了解决著名的bug#989,在MySQL5.5中开始引入了meta data lock:mdl允许一个事务涉及到的表.库信息直到事务结束都被维持,这样如果一条事务内的某个STATEMENT完成后,其他session发出一条DDL就会被阻塞:这解决了DDL/DML并发导致的复制中断问题. 不过用过5.5的人都知道,这玩意儿实际上太令人讨厌了,尤其

【MySQL】MetaData Lock 之二

一 简介   上一篇文章 <MetaData Lock 之一>  简单的介绍了MySQL 引入MDL 的前因后果,本文深入了解MDL的实现原理和运行机制.二 MDL 的类型  metadata lock也是一种锁.每个metadata lock都会定义锁住的对象,锁的持有时间和锁的类型.2.1 按照对象/范围划分 属性 含义 范围/对象 GLOBAL 全局锁 范围 COMMIT 提交保护锁 范围 SCHEMA 库锁 对象 TABLE 表锁 对象 FUNCTION 函数锁 对象 PROCEDUR

【MySQL】MetaData Lock 之三

一 简介  通过前面两篇文章的介绍,相信读到这里的各位对MDL 锁已经有了比较深入的了解了,本文将结合理论知识介绍几组MDL 锁的案例. 二 常见MDL 锁的场景1 Waiting for global read lock   我们先构造一个Waiting for global read lock场景:   session1: alter table t1 add c3 bigint; //大表执行需较长时间   session2: set global read only=on; //等待  

[MySQL 5.7 metadata lock] 测试

介绍: Metadata:事物内的表级锁 5.5开始引入进来,5.6.6前,事物开启后,会锁定表的meta data lock,其他会话对表有DDL操作时,均需要等待DML释放后方可继续.5.6.6后,不再阻塞其他会话执行的DDL,但原来的会话再次访问数据表时,会有error提示:table definition has changed , please retry transaction 是想要对一个表执行DDL时,会查看表有没有DML如果有则等待修改数据结构之前如何产生MDL锁,都会产生MD

RDS for MySQL 表上 Metadata lock 的产生和处理

RDS for MySQL 表上 Metadata lock 的产生和处理 1. Metadata lock wait 出现的场景 2. Metadata lock wait 的含义 3. 导致 Metadata lock wait 等待的活动事务 4. 解决方案 5. 如何避免出现长时间 Metadata lock wait 导致表上相关查询阻塞,影响业务 1. Metadata lock wait 出现的场景 创建.删除索引 修改表结构 表维护操作(optimize table.repair

MySQL中lock tables和unlock tables浅析

MySQL中lock tables和unlock tables浅析   在MySQL中提供了锁定表(lock tables)和解锁表(unlock tables)的语法功能,ORACLE与SQL Server数据库当中没有这种语法.相信刚接触MySQL的人,都想详细.深入的了解一下这个功能.下面就尽量全面的解析.总结一下MySQL中lock tables与unlock tables的功能,如有不足或不正确的地方,欢迎指点一二.     锁定表的语法:   LOCK TABLES tbl_name

数据库内核月报 - 2015 / 10-MySQL · 特性分析 · 跟踪Metadata lock

背景 MySQL 从5.5.3版本,对Metadata lock进行了调整,主要是MDL锁持有的周期从语句变成了事务, 其原因主要是解决两个问题: 问题1: 破坏事务隔离级别 在repeatable read的隔离级别下,多次的select语句执行过程中,会因为其它session的DDL语句,而导致select语句执行的结果不相同,破坏了RR的隔离级别. 问题2: 破坏binlog的顺序 在对表的DML过程中,会因为其它session的DDL语句,导致binlog里的event顺序在备库执行的结

metadata lock的解决方案

文章https://yq.aliyun.com/articles/175039?spm=5176.100239.0.0.jNFOsC 提出了会发生Metadata-lock场景以及如何在数据库运维方面避免产生的建议,但是其实5.6/5.7版本已经提供了一种直接定位该问题的方法:启用performance_schema功能,5.7更是针对Metadata-lock,提供了表来定位SQL. 再来回顾一下: Metadata-Lock的引入是为了在并发条件下,防止session1的查询事务未结束的情况