当我们在 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 操作及备份操作放在业务低峰期执行。

mysql元数据死锁日志,MySQL 实战笔记 第02期:MySQL 元数据锁相关推荐

  1. 【宋红康 MySQL数据库 】【高级篇】【02】MySQL字符集、比较规则、大小写规范、sql_mode

    持续学习&持续更新中- 学习态度:守破离 [宋红康 MySQL数据库 ][高级篇][02]MySQL字符集.比较规则.大小写规范.sql_mode 默认字符集 MySQL8 MySQL5 修改 ...

  2. mysql查询死锁的次数_一次神奇的MySQL死锁排查记录

    一次神奇的MySQL死锁排查记录 发布时间:2020-08-29 00:50:26 来源:脚本之家 阅读:135 作者:咖啡拿铁 背景 说起Mysql死锁,之前写过一次有关Mysql加锁的基本介绍,对 ...

  3. mysql 快速查询变更记录_MySQL学习笔记(7)—— MySQL 查询/更新数据记录

    除非最终检索它们并利用它们来做点事情,否则将记录放入数据库没什么好处.这就是数据记录查询的用途,即帮助取出数据,也是 Python API 与 MySQL 交互的重要部分.SELECT 大概是 SQL ...

  4. mysql元数据死锁日志_这个未修复的MySQL 5.7死锁Bug,你知道么?

    破产码农 IT圈最会讲故事的网红 · 南山彭于晏 最近在生产上变更时遇到从机死锁的问题.表现的现象为:同一张的表的DROP TABLE操作进入了同一组.而由于并行复制,并且从机提交顺序需要保证与主机一 ...

  5. 如何阅读MySQL死锁日志

    现象描述 客户在夜间批量执行数据处理时发生了死锁现象,是由不同的会话并发删除数据引起的,这个问题原因是比较简单,但想通过这个案例让大家熟悉如何去排查死锁问题,如何去阅读死锁日志这才是目的.通过模拟用户 ...

  6. 数据采集之解析Mysql的binlog日志发送至Kafka实时消费(转:https://blog.csdn.net/liguohuabigdata/article/details/79472777)

    本文采用Maxwell来实现实时解析mysql的binlog日志发送至kafka 1.开启mysql binlog 环境中mysql是docker容器,所以需要进入容器修改mysql配置.docker ...

  7. mysql之binlog日志

    binlog日志(binary log) 1.开启mysql的binlog日志 1.1 查看binlog是否开启 mysql> show variables like '%log_bin%'; ...

  8. mysql如何开启日志???

    方法1: 1.mysql配置文件地址: 2.mysql配置文件中 日志文件的配置 **如果/var/log/mysql目录下没有mysql.log这一日志文件 则可自己创建 并添加读写权限 ** 3. ...

  9. mysql颠覆实战笔记(五)--商品系统设计(二):定时更新商品总点击量

    继续回到沈老师的MYSQL颠覆实战,首先回顾下上一节课的内容,请大家会看下上节课写的存储过程. 打开prod_clicklog表, 我们只要把日期(不含时分秒)的部分存在数据库中, 如果同一日期有相同 ...

最新文章

  1. 老男孩博客获三大搜素引擎搜索自然排名第一位(百度谷歌搜狗)
  2. 架构师之路 — 数据库设计 — 关系型数据库理论
  3. Boost asio学习笔记之二—— 网络编程
  4. 除了Open Day,Nibiru与DigiArtist来CJ 搞事情了
  5. springboot约定优于配置的体现
  6. HashedWheelTimer时间轮原理分析
  7. python获取windows系统信息_Python获取Windows系统信息
  8. STL 关联容器的lower_bound()和upper_bound()
  9. 解决无法下载安装Android SDK的问题
  10. 使用vue+HBulider云游戏接口开发单击斗地主网页版
  11. 极课大数据完成C轮融资,投资方为好未来
  12. Hibernate中类的继承使用union-subclass实现
  13. C语言 | 杭州电子科技大学ACM | 求和问题
  14. RSA的APT峰会会议纪要
  15. 7段数码管和打印机接口
  16. 一生中必看的30个故事
  17. 前端css实现左侧盒子宽度固定,右侧宽度自适应布局
  18. KF、EKF、UKF的matlab代码实现
  19. 产品智慧化 智慧水务企业探索水厂建设新模式
  20. 基于STM32的外围系统设计

热门文章

  1. Spring 事务API 架构图
  2. 大型网站的架构演进从一个电商网站开始
  3. 开发中为什么使用线程池的原因
  4. springboot集成rocketmq消费者
  5. idea 自动导入包和自动将没用的包去除
  6. GraphQL入门之什么是GraphQL?
  7. SpringBoot新版
  8. 设计模式之_Iterator_03
  9. html2canvas截图页面中某块区域的图不全_截图操作千千万,唯舒适最重要!你更Pick谁?...
  10. linux防火墙阻断目的,基于Linux防火墙的内部邮件监控与阻断系统