MySQL 元数据锁及问题排查(Metadata Locks MDL)

news2024/11/27 10:41:12

"元数据"是用来描述数据对象定义的,而元数据锁(Metadata Lock MDL)即是加在这些定义上。通常我们认为非锁定一致性读(简单select)是不加锁的,这个是基于表内数据层面,其依然会对表的元数据加锁,保证读取数据期间表结构不会变更。

一、元数据锁简介

在事务执行过程中,MySQL会对所有涉及对象的定义加上元数据锁(语句执行的时候加锁),目的是保证事务执行过程中对象定义不被修改(你不能在别人查询的时候修改表结构或者把表删了)。

对表进行DML操作时(select, update等),MySQL会对表的定义施加一个共享元数据锁(S MDL),而进行DDL操作时,会施加排他元数据锁(X MDL)。DML之间的元数据锁时不会互相阻塞的,而普通用户通常只会执行DML,他们是感知不到元数据锁的。

如果DBA在业务运行期间执行了DDL,那么DDL也会尝试获取元数据锁,在事务都很短小的时候,可能很快就获取到了。但如果有长事务阻塞了DDL,那么就有可能导致严重的问题。

示例:在会话1中执行下面SQL:

create table t1 (id int primary key auto_increment);
begin;
select * from t1;

在这里插入图片描述

  • MySQL对DML默认是自动提交的,因此每条DML语句都是独立事务,当语句执行完,元数据锁就释放了,这里通过begin显式开启事务,让select语句执行完后,事务依然存在。

另启动一个会话2,执行下面DDL语句,可以发现其被阻塞(会话迟迟不返回):

alter table t1 add name varchar(16);

在这里插入图片描述

  • DDL在执行前会隐式提交事务并释放元数据锁,这就是为什么要另一个会话发起DDL。

启动会话3,执行show processlist;命令,即可看到会话2在等待元数据锁(Waiting for table metadata lock):

show processlist;

在这里插入图片描述

二、查看元数据锁

除了表,元数据锁也会加在表空间,存储过程,函数,触发器等对象上。但最常遇到的问题是我们想修改表结构,但是却被元数据锁阻塞了,导致DDL无法执行,进一步导致后续DML无法执行(业务停滞),此时需要进行人工干预。

2.1 查询元数据锁

MySQL提供了performance_schema.metadata_locks用来查询具体元数据锁信息,且默认就打开了元数据锁的信息收集,直接查询即可。表中包含了持有,等待及其他中间状态的MDL数据,当锁释放时,会从表中删除。

如果没有打开元数据锁信息收集,可以执行下面的SQL:

update performance_schema.setup_instruments
set enabled = 'YES', timed = 'YES'
where name = 'wait/lock/metadata/sql/mdl';

在这里插入图片描述
也可以持久化写入配置文件(需要重启):

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

我们依然用第1章的示例,在执行完会话1的SQL后,另开一个会话执行下面SQL:

select 
l.object_schema 数据库名,
l.object_type 对象类型, 
l.object_name 对象名称,
l.lock_type 锁类型,
l.lock_duration 持续类型,
l.lock_status 锁状态,
l.owner_thread_id 线程ID,
t.processlist_id 会话ID,
s.sql_text
from performance_schema.metadata_locks l
join performance_schema.threads t on t.thread_id=l.owner_thread_id
join performance_schema.events_statements_current s on s.thread_id=l.owner_thread_id
where l.object_schema='test'and l.object_name='t1';

在这里插入图片描述

  • 锁状态为granted,代表成功获取了元数据锁

随后执行会话2的DDL,再次执行查询SQL,可以看到锁状态pending(等待中):
在这里插入图片描述

  • 通过会话ID,锁状态和SQL_Text三个字段,可以判断会话ID为4107的select语句阻塞了alter table

2.2 常见问题

元数据锁的获取是有优先级的,X锁的优先级要高于S锁。在实际生产环境中,如果一个长事务阻塞了DDL,由于其尝试获取的是X锁(优先级高),那么它还会阻止后续DML获取S锁。即:DML => DDL阻塞 =>DML阻塞,从现象上看就是表无法执行任何操作。

在上面示例的基础上,再重新开几个会话执行下面的SQL,你会发现所有类型DML都无法返回(甚至无法读):

insert into t1 values(1,'Vincent');
update t1 set name='Victor' where id=1;
delete from t1 where id=1;
select * from t1;

在这里插入图片描述
如果生产环境出现了DDL阻塞,你的processlist可能就是下面的样子,堆积的DML会越来越多,最后挤爆线程:

show procelist;

在这里插入图片描述

解决方案:

  • 尽量避免在业务活跃期间执行DDL,特别是有长事务的时候
  • 如果已经产生了阻塞,立刻取消DDL或将其会话kill掉,先让业务运行下去

注:Online DDL在运行过程中也会短暂地获取X锁,所以并不能解决DDL阻塞问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1492681.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何解决代理ip服务器连接问题

在当今的数字化时代,互联网连接已成为生活和工作中不可或缺的一部分。然而,在尝试访问互联网资源时,用户有时会遇到“代理服务器可能有问题,或地址不正确(你尚未连接)”的错误提示。这种情况通常表明计算机的网络设置存在问题&…

OWASP Top 10 网络安全10大漏洞——A01:2021-访问控制中断

10大Web应用程序安全风险 2021年top10中有三个新类别、四个类别的命名和范围变化,以及一些合并。 A01:2021-访问控制中断 从第五位上升到top1,94%的应用程序都经过了某种形式的访问控制破坏测试,平均发生率为 3.81%且在贡献的…

CSS标准文档流与脱离文档流,分享一点面试小经验

大厂面试真题整理 CSS: 1,盒模型 2,如何让一个盒子水平垂直居中? 3,css 优先级确定 4,解释下浮动和它的工作原理,清除浮动的方法? 5,CSS隐藏元素的几种方法 6&#xff0…

MapReduce内存参数自动推断

MapReduce内存参数自动推断。在Hadoop 2.0中,为MapReduce作业设置内存参数非常繁琐,涉及到两个参数:mapreduce.{map,reduce}.memory.mb和mapreduce.{map,reduce}.java.opts,一旦设置不合理,则会使得内存资源浪费严重&a…

【2024】使用Vuetifi搭建vue3+Ts项目,并使用tailwind.css

目录 使用Vuetifi搭建项目使用tailwind.css 只要跟着官方文档来就不会出错。 使用Vuetifi搭建项目 npm create vuetifyyarn create vuetifypnpm create vuetifybun create vuetify在终端运行一个就行,之后就可以选配置了。 使用tailwind.css 先运行: …

【力扣经典面试题】14. 最长公共前缀

目录 一、题目描述 二、解题思路 三、解题步骤 四、代码实现(C版详细注释) 五、总结 欢迎点赞关注哦!创作不易,你的支持是我的不竭动力,更多精彩等你哦。 一、题目描述 编写一个函数来查找字符串数组中的最长公共前缀。…

Mysql80服务无法启动请输入Net helpMsg3534以获得更多的帮助

起因&情景: 朋友正在操作数据库,然后电脑突然死机,再重启电脑后启动数据库服务报: 然后朋友尝试各种操作都没有办法正常启动, 一、网上解决方案:(先别操作) 1 删掉&#xff1a…

Docker的安装跟基础使用一篇文章包会

目录 国内源安装新版本 1、清理环境 2、配置docker yum源 3、安装启动 4、启动Docker服务 5、修改docker数据存放位置 6、配置加速器 现在我们已经完成了docker的安装和初始配置。以下为基本测试使用 自带源安装的版本太低 docker官方源安装的话速度太慢了 所以本篇文…

RocketMQ—如何解决消息堆积问题

RocketMQ—如何保证消息不丢失 生产者发送到MQ的消息,会放到broker的硬盘内,这便是消息的持久化。消息会有两种持久化策略: 同步刷盘:消息过来就会进入磁盘,再向生产者发送写成功,这会很安全,…

【数据结构】顺序表+链表

目录 1.顺序表 1.1初始化顺序表 1.2销毁顺序表 1.3检查容量并扩容 1.4把某个元素插入到下标为pos的位置 1.5头插和尾插 1.6删除下标为pos的元素 1.7头删和尾删 2.顺序表的问题及思考 3.链表 3.1链表的访问 3.2链表的增删查改 1.顺序表 顺序表的本质其实就是一个数组…

Java | vscode如何使用命令行运行Java程序

1.在vscode中新建一个终端 2.在终端中输入命令 输入格式&#xff1a; javac <源文件>此命令执行后&#xff0c;在文件夹中会生成一个与原java程序同名的.class文件。然后输入如下命令&#xff1a; java <源文件名称>这样java程序就运行成功了。&#x1f607;

【LeetCode每日一题】【BFS模版与例题】【二维数组】1293. 网格中的最短路径

BFS基本模版与案例可以参考&#xff1a; 【LeetCode每日一题】【BFS模版与例题】863.二叉树中所有距离为 K 的结点 【LeetCode每日一题】【BFS模版与例题】【二维数组】130被围绕的区域 && 994 腐烂的橘子 思路&#xff1a; 特殊情况&#xff1a; 最短的路径是向下再向…

云计算科学与工程实践指南--章节引言收集

云计算科学与工程实践指南–章节引言收集 //本文收集 【云计算科学与工程实践指南】 书中每一章节的引言。 我已厌倦了在一本书中阅读云的定义。难道你不失望吗&#xff1f;你正在阅读一个很好的故事&#xff0c;突然间作者必须停下来介绍云。谁在乎云是什么&#xff1f; 通…

#QT(TCP网络编程-服务端)

1.IDE&#xff1a;QTCreator 2.实验&#xff1a;编写一个tcp服务端 QTcpsever QTcpsocket 3.记录&#xff1a; (1)先搭建界面 &#xff08;2&#xff09;服务端代码 a. pro QT core gui networkgreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c1…

html实体字符,已拿offer入职

面试知识点 主要内容包括html&#xff0c;css&#xff0c;前端基础&#xff0c;前端核心&#xff0c;前端进阶&#xff0c;移动端开发&#xff0c;计算机基础&#xff0c;算法与数据结构&#xff0c;设计模式&#xff0c;项目等等。 html 1.浏览器页面有哪三层构成&#xff0c…

video视频播放

1.列表页面 <template><div><ul><li class"item" v-for"(item,index) in list" :key"index" click"turnPlay(item.videoUrl)"><img :src"item.img" alt""><div class"btn…

Go 简单设计和实现可扩展、高性能的泛型本地缓存

相信大家对于缓存这个词都不陌生&#xff0c;但凡追求高性能的业务场景&#xff0c;一般都会使用缓存&#xff0c;它可以提高数据的检索速度&#xff0c;减少数据库的压力。缓存大体分为两类&#xff1a;本地缓存和分布式缓存&#xff08;如 Redis&#xff09;。本地缓存适用于…

论文目录3:大模型时代(2023+)

1 instruction tuning & in context learning 论文名称来源主要内容Finetuned Language Models Are Zero-Shot Learners2021 机器学习笔记&#xff1a;李宏毅ChatGPT Finetune VS Prompt_UQI-LIUWJ的博客-CSDN博客 早期做instruction tuning的work MetaICL: Learning to …

CSS文本样式值,web前端开发资料

正文 什么是行内元素&#xff1f; display属性为inline的元素为行内元素&#xff0c;英文&#xff1a;inline element&#xff0c;其中文叫法有多种&#xff0c;如&#xff1a;内联元素、内嵌元素、行内元素、直进式元素等。 特点&#xff1a; 和其他元素都在一行上&#x…

补点基础——几何尺寸和公差

几何尺寸与公差&#xff08;Geometric dimensioning and tolerancing&#xff09;代号&#xff1a;GD&T&#xff0c;主要是以下两个组织制定&#xff1a; 1.美国机械工程师学会&#xff08;ASME&#xff09; ASME Y14.5 是 GD & T 的完整定义&#xff0c;其中包含所有…