当前位置: 首页 > news >正文

MySQL 实战笔记 第02期:MySQL 元数据锁

作者简介

无为,多年 MySQL DBA 工作经验,现就职于某知名互联网公司,对 MySQL、 Redis、PostgrepSQL 等主流数据库有一定了解,拥有丰富的一线运维经验。

当我们在 MySQL 中执行 DDL 语句时,经常会发现语句没有在你预期的时间完成,这时候我们通常会使用 show full processlist ,来看看发生了什么状况。当你看到 waiting for table metadata lock 时,那就碰到元数据锁了。那元数据锁是怎样产生的又应该怎样避免呢?让我们从这篇文章开始了解它。

1、什么是元数据锁

MDL 全称为 metadata lock,即元数据锁,一般也可称为字典锁。MDL 的主要作用是为了管理数据库对象的并发访问和确保元数据一致性。元数据锁适用对象包含:table、schema、procedures, functions, triggers, scheduled events、tablespaces 。

2、加锁规则

获取规则:

  • 语句逐个( one by one )获取元数据锁,不是同时获取,并在获取过程中执行死锁检测。

  • DML 语句获取锁按照语句中 table 出现的顺序来获取锁。

  • DDL 语句、LOCK TABLES 和其他类似语句按名称顺序获取锁,对于隐式使用的表(例如外键关系中也必须锁定的表)可能会以不同的顺序获取锁。

  • DDL 的写锁请求优先级高于 DML

3、模拟加锁规则

两个相同表结构的表 t 和 t_new 开始。三个线程来操作这些表:

场景一

线程 1:

LOCK TABLE t WRITE, t_new WRITE;

该语句按表名顺序在 t 和 t_new 上获取写锁

线程 2:

INSERT INTO t VALUES(1);

该语句处于也需要获取表 t 上的 MDL 所以处于等待状态

线程 3:

RENAME TABLE t TO t_old, t_new TO t;

该语句需要按表名顺序在 t 、t_new、t_old 上获取互斥锁,所以也处于等待状态

线程 1:

UNLOCK TABLES;

该语句释放对 t 和 t_new 的写锁定。线程 3 对 t 加写锁的优先级高于 线程 2 ,因此线程 3 在 t 上优先获得互斥锁,然后依次在 t_new、t_old 上获取互斥锁,执行重命名后释放其锁定。线程 2 获得 t 上的写锁,执行插入操作,然后释放其锁定。rename 操作在 insert 之前执行。

场景二

两个具有相同表结构的表 t 和 new_t ,同样是三个线程来操作这些表

线程 1:

LOCK TABLE t WRITE, new_t WRITE;

该语句按表名顺序在 new_t 和 t 上获取写锁              

线程 2:

INSERT INTO t VALUES(1);

该语句处于也需要获取表 t 上的 MDL 所以处于等待状态

线程 3:

RENAME TABLE t TO old_t, new_t TO t;

该语句需要按表名顺序在 new_t 、old_t、t 上获取互斥锁,所以也处于等待状态

该语句释放对 t 和 new_t 的写锁定。对于 t 首先发起锁请求的是线程 2 ,因此线程 2 优先获得了 t 上的元数据写锁,执行完插入操作,然后释放该锁。线程 3 首先获取的是 new_t 、old_t 的互斥锁,最后才会请求 t 上的互斥锁,所以线程 3 在线程 2 执行完毕之前都是处于等待状态的。rename 操作在 insert 操作之后。

4、 如何监控元数据锁

performance_schema.metadata_locks 表中记录了元数据锁相关的信息,开启方式如下:

在线开启 metadata_locks,操作如下:

--UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME ='global_instrumentation';
--此值默认已开启了,可检查确认。


UPDATE performance_schema.setup_instruments SET ENABLED = 'YES' WHERE NAME ='wait/lock/metadata/sql/mdl';

若可停库维护,则在 my.cnf 中添加如下:

[mysqld]
performance-schema-instrument='wait/lock/metadata/sql/mdl=ON'

5、如何优化元数据锁

MDL 锁一旦发生会对业务造成极大影响,因为后续所有对该表的访问都会被阻塞,造成连接积压。我们日常要尽量避免 MDL 锁的发生,下面给出几点优化建议可供参考:

  • 开启 metadata_locks 表记录 MDL 锁。

  • 设置参数 lock_wait_timeout 为较小值,使被阻塞端主动停止。

  • 规范使用事务,及时提交事务,避免使用大事务。

  • 增强监控告警,及时发现 MDL 锁。

  • DDL 操作及备份操作放在业务低峰期执行。

另外,悦专栏欢迎各位大牛投稿,内容可以是数据库、开发、算法、大数据、运维、产品、运营等。只要在公众号回复“投稿”即可。

LIKECOLUMN

悦专栏

在这里,学好编程

做更优秀的 IT人!

各大平台都可以找到我

  • 微信公众号:杨建荣的学习笔记

  • Github:@jeanron100

  • CSDN:@jeanron100

  • 知乎:@jeanron100

  • 头条号:@杨建荣的学习笔记

  • 网易号:@杨建荣的数据库笔记

  • 大鱼号:@杨建荣的数据库笔记

  • 百家号:@杨建荣的数据库笔记

  • 腾讯云+社区:@杨建荣的学习笔记

  • QQ群号:763628645

    QQ群二维码如下, 添加请注明:姓名+地区+职位,否则不予通过

相关文章:

  • 经常用Redis,这些坑你知道吗?
  • Redis为什么这么快?
  • 迁移至MySQL的数据流转流程优化
  • 长文:读《经济学32定律》
  • 使用Rancher搭建K8S测试环境
  • 深度学习在视觉搜索和匹配中的应用
  • MySQL 5.7和MySQL 8.0的4个细节差异
  • 开启读书模式-2021
  • 我收集了如下的一些语录
  • 《大江大河2》最触动我的一段经典对话
  • 从生命周期的角度来规划数据库运维体系
  • 图片之外的细节和故事
  • 揭开服务降级的面纱!!!
  • 规避单点故障,MySQL 8.0 MGR软负载怎么选?
  • 对于近期工作状态的复盘
  • (三)从jvm层面了解线程的启动和停止
  • angular学习第一篇-----环境搭建
  • ES6核心特性
  • Invalidate和postInvalidate的区别
  • leetcode388. Longest Absolute File Path
  • PAT A1050
  • Rancher如何对接Ceph-RBD块存储
  • Spring核心 Bean的高级装配
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • Vue ES6 Jade Scss Webpack Gulp
  • VUE es6技巧写法(持续更新中~~~)
  • 马上搞懂 GeoJSON
  • 手机端车牌号码键盘的vue组件
  • 数据仓库的几种建模方法
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 思否第一天
  • 从如何停掉 Promise 链说起
  • #NOIP 2014#Day.2 T3 解方程
  • #pragma multi_compile #pragma shader_feature
  • #图像处理
  • (42)STM32——LCD显示屏实验笔记
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (二)WCF的Binding模型
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (三)elasticsearch 源码之启动流程分析
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (转)可以带来幸福的一本书
  • (转)原始图像数据和PDF中的图像数据
  • ... 是什么 ?... 有什么用处?
  • .net 程序发生了一个不可捕获的异常
  • ::before和::after 常见的用法
  • @拔赤:Web前端开发十日谈
  • [<事务专题>]
  • [ABC294Ex] K-Coloring
  • [AMQP Connection 127.0.0.1:5672] An unexpected connection driver error occured
  • [Android]如何调试Native memory crash issue
  • [C/C++]数据结构 堆的详解