mysql元数据死锁日志,MySQL 实战笔记 第02期:MySQL 元数据锁
当我们在 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 元数据锁相关推荐
- 【宋红康 MySQL数据库 】【高级篇】【02】MySQL字符集、比较规则、大小写规范、sql_mode
持续学习&持续更新中- 学习态度:守破离 [宋红康 MySQL数据库 ][高级篇][02]MySQL字符集.比较规则.大小写规范.sql_mode 默认字符集 MySQL8 MySQL5 修改 ...
- mysql查询死锁的次数_一次神奇的MySQL死锁排查记录
一次神奇的MySQL死锁排查记录 发布时间:2020-08-29 00:50:26 来源:脚本之家 阅读:135 作者:咖啡拿铁 背景 说起Mysql死锁,之前写过一次有关Mysql加锁的基本介绍,对 ...
- mysql 快速查询变更记录_MySQL学习笔记(7)—— MySQL 查询/更新数据记录
除非最终检索它们并利用它们来做点事情,否则将记录放入数据库没什么好处.这就是数据记录查询的用途,即帮助取出数据,也是 Python API 与 MySQL 交互的重要部分.SELECT 大概是 SQL ...
- mysql元数据死锁日志_这个未修复的MySQL 5.7死锁Bug,你知道么?
破产码农 IT圈最会讲故事的网红 · 南山彭于晏 最近在生产上变更时遇到从机死锁的问题.表现的现象为:同一张的表的DROP TABLE操作进入了同一组.而由于并行复制,并且从机提交顺序需要保证与主机一 ...
- 如何阅读MySQL死锁日志
现象描述 客户在夜间批量执行数据处理时发生了死锁现象,是由不同的会话并发删除数据引起的,这个问题原因是比较简单,但想通过这个案例让大家熟悉如何去排查死锁问题,如何去阅读死锁日志这才是目的.通过模拟用户 ...
- 数据采集之解析Mysql的binlog日志发送至Kafka实时消费(转:https://blog.csdn.net/liguohuabigdata/article/details/79472777)
本文采用Maxwell来实现实时解析mysql的binlog日志发送至kafka 1.开启mysql binlog 环境中mysql是docker容器,所以需要进入容器修改mysql配置.docker ...
- mysql之binlog日志
binlog日志(binary log) 1.开启mysql的binlog日志 1.1 查看binlog是否开启 mysql> show variables like '%log_bin%'; ...
- mysql如何开启日志???
方法1: 1.mysql配置文件地址: 2.mysql配置文件中 日志文件的配置 **如果/var/log/mysql目录下没有mysql.log这一日志文件 则可自己创建 并添加读写权限 ** 3. ...
- mysql颠覆实战笔记(五)--商品系统设计(二):定时更新商品总点击量
继续回到沈老师的MYSQL颠覆实战,首先回顾下上一节课的内容,请大家会看下上节课写的存储过程. 打开prod_clicklog表, 我们只要把日期(不含时分秒)的部分存在数据库中, 如果同一日期有相同 ...
最新文章
- 老男孩博客获三大搜素引擎搜索自然排名第一位(百度谷歌搜狗)
- 架构师之路 — 数据库设计 — 关系型数据库理论
- Boost asio学习笔记之二—— 网络编程
- 除了Open Day,Nibiru与DigiArtist来CJ 搞事情了
- springboot约定优于配置的体现
- HashedWheelTimer时间轮原理分析
- python获取windows系统信息_Python获取Windows系统信息
- STL 关联容器的lower_bound()和upper_bound()
- 解决无法下载安装Android SDK的问题
- 使用vue+HBulider云游戏接口开发单击斗地主网页版
- 极课大数据完成C轮融资,投资方为好未来
- Hibernate中类的继承使用union-subclass实现
- C语言 | 杭州电子科技大学ACM | 求和问题
- RSA的APT峰会会议纪要
- 7段数码管和打印机接口
- 一生中必看的30个故事
- 前端css实现左侧盒子宽度固定,右侧宽度自适应布局
- KF、EKF、UKF的matlab代码实现
- 产品智慧化 智慧水务企业探索水厂建设新模式
- 基于STM32的外围系统设计