MDL锁(Metadata Lock),即元数据锁。元数据指的是描述数据的数据,对数据及信息资源的描述性信息,在数据库中元数据即数据字典信息,包括db,table,function,procedure,trigger,event等。

MySQL从 5.5版本开始引入MDL锁,MDL锁主要为了保证元数据的一致性(主要是保证DDL操作与DML操作之间的一致性),用于处理不同线程操作同一元数据对象的同步与互斥问题,在各个业务场景中会十分频繁地使用到。

具体而言,MySQL引入MDL锁可以解决如下问题:一是事务隔离问题,比如在可重复读隔离级别下,会话A在2次查询期间,会话B对表结构做了修改,2次查询结果就会不一致,无法满足可重复读的要求。二是数据复制问题,比如会话A执行了多条更新语句期间,另外一个会话B做了表结构变更并且先提交,就会导致slave在重做时,先重做alter,再重做update时就会出现复制错误的现象。

何为MDL锁视图?

社区版MySQL无法获取表MDL锁的详细信息,当客户遇到类似“Waiting for metadata lock”的问题而阻塞DML或DDL后,由于无法确定各session之间的关联,往往无从下手,复杂情况下,只能重启实例,从而增加解决问题的成本,对业务产生较大影响。而且在业务场景较复杂的情况下,一旦涉及对数据库元数据的互斥操作(如DDL、LOCK Table等),此类问题便会频繁发生,给一线运维和客户带来很大的困扰。

针对以上痛点,华为云数据库MySQL在充分调研内核的基础上,推出了MDL锁视图特性,可以清晰查看数据库各session持有和等待的元数据锁信息,方便现网运维进行问题定位,有效进行系统诊断,帮助客户更好地优化自身业务。

MDL锁视图以系统表的形式呈现,该表位于INFORMATION_SCHEMA,表名:METADATA_LOCK_INFO,表结构如下:

MDL锁视图主要由7个字段组成,各字段详情为:

  • THREAD_ID:session的ID,即会话ID
  • LOCK_STATUS:MDL锁的状态,主要分为PENDING和GRANTED两种,分别表示session正在等待该MDL锁和session已获得该MDL锁
  • LOCK_MODE:加锁的模式,如MDL_SHARED 、MDL_EXCLUSIVE 、MDL_SHARED_READ、MDL_SHARED_WRITE等
  • LOCK_TYPE:MDL锁的类型,如Table metadata lock、Schema metadata lock、Global read lock、Tablespace lock等
  • LOCK_DURATION:MDL锁的范围,有三种取值:MDL_STATEMENT、MDL_TRANSACTION、MDL_EXPLICIT,分别表示语句级别、事务级别、global级别
  • TABLE_SCHEMA:数据库名,对于部分global级别的MDL锁,该值为空
  • TABLE_NAME:表名,对于部分global级别的MDL锁,该值为空

MDL锁视图好在哪?

下面通过两则案例来对MDL锁视图进行进一步的说明。

场景一:长时间未提交事务,阻塞DDL,继而阻塞所有同表的操作

T

Session 2

Session 3

Session 4

Session 5

T1

begin;

select *from t1;

   

T2

 

begin;

select *from t2;

 

T3

   

truncate table t2;

(blocked)

T4

begin;

select *from t2;

(blocked)

客户发现表t2的truncate一直被阻塞后,业务流程中对表t2的select操作也全部被阻塞。DDL被阻塞后,客户立刻执行show processlist:

但是通过processlist信息,只能看到session 4执行truncate操作时被其他session持有的table metadata lock阻塞,session 5执行select操作时也同样被阻塞,无法确定哪个session阻塞了session 4和session 5。此时,如果盲目的去kill其他session(2或3)会给线上业务带来很大风险,因此只能等待其他session释放该MDL锁。

而当客户引入MDL锁视图后,执行SELECT * FROM INFORMATION_SCHEMA.METADATA_LOCK_INFO:

结合show processlist的结果,从元数据锁视图中可以明显看出,session 4 pending在表t2的metadata lock,session 3持有表t2的metadata lock,该MDL锁为事务级别,只要session 3的事务不提交,session 4便会一直阻塞。因此,客户只需要在session 3中执行commit或kill session 3,便可以让业务继续运行。

场景二:长时间持有MDL锁,导致全备失败

T

Session 2

Session 3

Session 4

Session 5

T1

lock tables t1 write;

   

T2

select *from t1;

insert into t2;

 

select *from t3

T3

   

Lock tables for backup;

(blocked)

T4

begin;

select *from t2;

begin;

insert into t3;

客户实例最近几次全备均失败,但是业务表现似乎正常,而且最近系统业务量不高,未出现明显问题。运维团队发现全备被阻塞后,立刻show processlist,发现有多个活跃的用户session:

全备是基于xtrabackup,在执行真正的备份之前需要执行lock tables for backup,但从show processlist中只能看到:lock tables for backup时一直被某个MDL锁阻塞,全备超时失败;客户的多个session业务量很小,都处于sleep状态,于是客户继续执行show open tables where in_use >=1:

发现有个表t1始终处于in use状态,所以猜测是用户某个session持有了该表t1的MDL锁未释放,导致lock tables for backup等待超时。但是结合show processlist仍然无法确定是哪个session持有表t1的MDL锁,想让全备执行成功,只能通知客户逐一断连session或者重启实例。

引入MDL锁视图后,客户执行SELECT * FROM INFORMATION_SCHEMA.METADATA_LOCK_INFO:

结合show processlist的结果,从元数据锁视图中可以明显看出,session 4 pending在全局backup lock上;session 2持有全局的backup lock,该MDL锁类型为MDL_EXPLICIT,global级别。因此,客户只需要在session 2显式调用unlock tables释放锁或者kill session 2即可让业务继续运行。

通过以上两个案例,MDL锁视图的重要性不言而喻,它可以让客户和一线运维人员清晰地查看数据库各session持有和等待的元数据锁信息,从而找出数据库MDL锁等待的根因,准确地进行下一步决策,有效降低对业务的影响。

【华为云技术分享】华为云MySQL新增MDL锁视图特性,快速定位元数据锁问题相关推荐

  1. 【华为云技术分享】云原生数据库三驾马车之TaurusDB

    [前言]Taurus是华为对标AWS Aurora的一款重磅云原生数据库.其设计思想是Log-as-database以最小化网络IO,采用计算存储分离的架构.Taurus的市场定位是OLTP的企业级市 ...

  2. 【华为云技术分享】云小课 | “VPC连接”知多少

    摘要:华为云提供了丰富的网络服务,可满足多种网络互连场景. 同Region的两个VPC怎么连通?" "跨Region的两个VPC又怎么连通?" "VPC内的EC ...

  3. 【华为云技术分享】云小课 | 磁盘容量不够用?小课教你来扩容!

    摘要:当已有云硬盘容量不足时,可以扩容云硬盘,扩容云硬盘分为在"正在使用"状态扩容和"可用"状态扩容两种,扩容结束后需要扩展分区和文件系统.我们一起来看下具体怎 ...

  4. 【华为云技术分享】云小课 | 迁移第三方云厂商数据至OBS,两种方式任你选

    如何将我在第三方云厂商对象存储上的数据迁移至华为云OBS?华为云主要提供对象存储迁移服务(Object Storage Migration Service,OMS)和云数据迁移(Cloud Data ...

  5. 【华为云技术分享】初识MySQL隔离级别

    我们知道MySQL有四种不同的隔离级别,分别是:read-uncommit.read-commit.repeat-read和serializable.这四种隔离级别分别解决了不同的数据一致性问题,也存 ...

  6. 【华为云技术分享】云小课 | SAP扩容实战

    随着SAP业务的发展,当购买的资源无法满足业务需求时,我们可以在华为云上通过扩容相应的资源来解决问题. 在SAP上云的场景下,扩容可以分为两个部分:计算资源扩容和存储资源扩容. 计算资源扩容就是升级弹 ...

  7. 【华为云技术分享】云容器引擎 CCE权限管理实践

    随着容器化的快速发展,大数据原有的分布式任务调度模式,正在被基于Kubernetes的技术架构所取代.CCE云容器引擎是华为云推出的支持Kubernetes社区原生应用和工具,应用级自动弹性伸缩,自动 ...

  8. 【华为云技术分享】云小课 | WAF反爬虫“三板斧”:轻松应对网站恶意爬虫

    反爬虫是一个复杂的过程,针对爬虫常见的行为特征,WAF反爬虫三板斧--Robot检测(识别User-Agent).网站反爬虫(检查浏览器合法性)和CC攻击防护(限制访问频率)可以全方位帮您解决业务网站 ...

  9. 【华为云技术分享】云小课 | SAP容灾一点通

    许多企业已经在华为云上部署了SAP HANA系统来运行它们的业务,为了保障SAP业务的连续性,SAP解决方案所提供的高可用(HA)和灾难恢复(DR)方案是这些企业选择云上部署的重要因素.除了SAP软件 ...

最新文章

  1. Mysql-InnoDB 锁学习
  2. python基础教程第四版-python基础教程第4版pdf
  3. AMDF换成ACF和AMDF合作算法
  4. python转移环境_python 虚拟环境及项目快速迁移
  5. 自定义react-navigation的TabBar
  6. 初步认识Volatile-JMM
  7. java泛型程序设计——反射和泛型
  8. 视觉SLAM笔记(58) 字典
  9. 初试cocos2d-x坐标系
  10. 51nod 1574: 排列转换
  11. (转)常见LCD接口
  12. 读Thinking in Java(1~4)
  13. 免费好用的虚拟服务器,六大免费好用的虚拟主机管理系统
  14. 【采用】社交网络分析与金融反欺诈应用(知识图谱?)
  15. C/C++语言 结构体数组初始化 结构体数组元素全部置0 memset函数将结构体数组初始化
  16. DNS是什么意思?DNS怎么设置?
  17. 【公司邮箱怎么注册】Foxmail帐户邮箱数据保存在什么地方?如何备份一个帐户?
  18. CCF系列题解--2015年9月第二题 日期计算
  19. with/as 用法
  20. 西门子免授权CNC数控系统数据采集c#、C、python都支持,可支持再各种操作系统上运行,无须西门子OPC,支持828D 840dsl 808 802dsl 840d 810d 西门子数控DNC程序

热门文章

  1. getprofile()获取不到路径_获取链接文件Document——Dynamo Python系列教程(一)
  2. 基于matlab的电子时钟,基于LCD1602电子时钟毕业设计报告.doc
  3. html盒子模型子元素怎么水平占满父元素_CSS盒子模型、溢出处理、浮动、高度坍塌问题...
  4. jq 点击按钮跳转到微信_小程序 web-view组件跳转到小程序页面
  5. cass读取dat文件_南方CASS教程+视频讲解+插件汇总,小白快速上手的测绘神器
  6. java闭包和lambda关系_Lambda表达式和闭包Closure
  7. [Swift]LeetCode1017. 负二进制转换 | Convert to Base -2
  8. Java - 安装jdk并设置环境变量
  9. 详述 hosts 文件的作用及修改 hosts 文件的方法
  10. JAVA Map 和 List 排序方法