1. 云栖社区>
  2. 博客列表>
  3. 正文

【MySQL】MetaData Lock 之一

北在南方 2016-04-13 14:48:04 浏览545 评论1

云数据库RDS

摘要: 一 简介 和MySQL打交道比较多的朋友,肯定遇到过 "Waiting for table metadata lock"或者由于MDL导致的故障,不过本文介绍MDL锁之前 我们先看一个著名的bug#989 大致情况如下:  s1:   BEGIN;   INSERT INTO t .

一 简介
 和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的实现原理和运行机制,加入一些常见的案例和解决方法。


版权声明:本文内容由互联网用户自发贡献,本社区不拥有所有权,也不承担相关法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:yqgroup@service.aliyun.com 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。

用云栖社区APP,舒服~

【云栖快讯】首届阿里巴巴中间件技术峰会,揭秘阿里10年分布式技术沉淀!阿里高可用体系核心缔造者、全链路压测创始人,DRDS与TDDL负责人等大咖出场,干货分享,不可错过!  详情请点击

网友评论

1F
1322199411605473

所谓语句级别,即语句执行完成后,无论事务是否提交或回滚,其表结构可以被其他会话更新;
--5.1测试后,事务如果不提交或者回滚,另一个session也是被阻塞的。
session1:
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t1 values(2,'a','b');
Query OK, 1 row affected (0.01 sec)

mysql>

session2:
mysql> alter table t1 add name3 char(10);
被阻塞,等待状态

查看这两个session状态:
| 12691 | root | localhost | DB | Query | 3 | copy to tmp table | alter table t1 add name3 char(10) |

支持以数据库为核心的结构化存储产品之间的数据传输。 它是一种集数据迁移、数据订阅及数据实时同步于一体的数据传输服... 更多>

RDS是一种稳定可靠、可弹性伸缩的在线数据库服务。支持MySQL、SQL Server、PostgreSQL、高... 更多>

基于飞天分布式系统和高性能存储,提供三节点副本集的高可用架构,容灾切换,故障迁移完全透明化。并提供专业的数据库在... 更多>

为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效率,降低 IT 成本... 更多>
2017杭州云栖大会火热抢票

2017杭州云栖大会火热抢票