暂无图片
暂无图片
暂无图片
暂无图片
暂无图片
mdl——lock
492
6页
0次
2020-05-21
5墨值下载
当你在
MySQL
中执行一条
SQL
时,语句并没有在你预期的时间内执行完成,
这时候我们通常会登陆到
MySQL
数据库上查看是不是出了什么问题,通常会
使用的一个命令就是
show processlist
,看看有哪些
session
,这些
session
做什么事情。当你看到
waiting for table metadata lock
时,那就是遇到
MDL
元数据锁了。本篇文章将会介绍
MDL
锁的产生与排查过程。
1.
什么是
MDL
MDL
全称为
metadata lock
,即元数据锁。
MDL
锁主要作用是维护表元数据的
数据一致性,在表上有活动事务(显式或隐式)的时候,不可以对元数据进行
写入操作。因此从
MySQL5.5
版本开始引入了
MDL
锁,来保护表的元数据信
息,用于解决或者保证
DDL
操作与
DML
操作之间的一致性。
对于引入
MDL
,其主要解决了
2
个问题,一个是事务隔离问题,比如在可重复
隔离级别下,会话
A
2
次查询期间,会话
B
对表结构做了修改,两次查询结
果就会不一致,无法满足可重复读的要求;另外一个是数据复制的问题,比如
会话
A
执行了多条更新语句期间,另外一个会话
B
做了表结构变更并且先提交,
就会导致
slave
在重做时,先重做
alter
,再重做
update
时就会出现复制错误的
现象。
元数据锁是
server
层的锁,表级锁,每执行一条
DML
DDL
语句时都会申请
MDL
锁,
DML
操作需要
MDL
读锁,
DDL
操作需要
MDL
写锁(
MDL
加锁过程
是系统自动控制,无法直接干预,读读共享,读写互斥,写写互斥),申请
MDL
锁的操作会形成一个队列,队列中写锁获取优先级高于读锁。一旦出现写
锁等待,不但当前操作会被阻塞,同时还会阻塞后续该表的所有操作。事务一
旦申请到
MDL
锁后,直到事务执行完才会将锁释放。(这里有种特殊情况如果
事务中包含
DDL
操作,
mysql
会在
DDL
操作语句执行前,隐式提交
commit
以保证该
DDL
语句操作作为一个单独的事务存在,同时也保证元数据排他锁的
释放)。
注: 支持事务的
InnoDB
引擎表和不支持事务的
MyISAM
引擎表,都会出现
Metadata Lock Wait
等待现象。一旦出现
Metadata Lock Wait
等待现象,后续
所有对该表的访问都会阻塞在该等待上,导致连接堆积,业务受影响。
2.
模拟与查找
MDL
MDL
锁通常发生在
DDL
操作挂起的时候,原因是有未提交的事务对该表进行
DML
操作。而
MySQL
的会话那么多,不知道哪个会话的操作没有及时提交影
响了
DDL
。通常我们排查这类问题,往往需要从
information_schema.innodb_trx
表中查询当前在执行的事务,但当
SQL
已经执
行过了,没有
commit
,这个时候这个表中是看不到
SQL
的。
MySQL5.7
中,
performance_schema
库中新增了
metadata_locks
表,专门
记录
MDL
的相信息。先要开
MDL
锁记录,执行如下
SQL
1.
UPDATE performance_schema.setup_instruments
2.
SET ENABLED = 'YES', TIMED = 'YES'
3.
WHERE NAME = 'wait/lock/metadata/sql/mdl';
面展示下模拟及查找
MDL
锁的过程:
1.
#
会话
1
事务中执行
DML
操作
2.
mysql> begin;
3.
Query OK, 0 rows affected (0.00 sec)
of 6
5墨值下载
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文档的来源(墨天轮),文档链接,文档作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

关注
最新上传
暂无内容,敬请期待...
下载排行榜
Top250 周榜 月榜