【MySQL 进阶之路】元数据锁(MDL)详解

news2024/12/27 3:56:41

MySQL 元数据锁(MDL)详解

在 MySQL 中,元数据锁(MDL,Metadata Lock)是 InnoDB 引擎用来保护表的元数据(如表结构)的一种锁。当一个事务对表进行查询或修改操作时,MySQL 会自动加上 MDL 锁,防止其他事务在该表的结构发生变动时进行数据操作,从而确保元数据的一致性。

1. 元数据锁的作用

MDL 锁的主要作用是确保对表结构的 DDL 操作(如 ALTER TABLEDROP TABLECREATE INDEX 等)和对数据的 DML 操作(如 SELECTINSERTUPDATEDELETE)能够并发地执行,同时避免产生冲突。

具体来说,MDL 锁通过限制表结构的变动来保证正在进行的 DML 操作不会被打断。

2. MDL 锁的类型

MDL 锁有两种基本类型:

  • 共享锁(S):当一个事务对表进行读取(如 SELECT)时,会申请一个共享 MDL 锁。这意味着其他事务可以同时对该表进行读取,但不能修改表结构。
  • 排他锁(X):当一个事务对表进行写操作时,会申请一个排他 MDL 锁。这意味着在该事务持有锁期间,其他事务无法修改表结构。

3. MDL 锁的工作机制

当执行 DML 操作时,MySQL 会自动为表加上 MDL 锁。例如,在执行一个 SELECT 查询时,MySQL 会对目标表加上共享 MDL 锁;而在执行 INSERTUPDATEDELETE 时,会加上排他 MDL 锁。

MDL 锁的作用是 防止在操作期间其他事务对表的结构进行更改。

例子:
假设客户端 A 执行了一个 SELECT 查询,客户端 B 尝试执行 ALTER TABLE 操作。

假设客户端 A 执行了一个 SELECT 查询,客户端 B 尝试执行 ALTER TABLE 操作。
在此情况下,客户端 B 会被阻塞,直到客户端 A 完成查询并释放 MDL 锁。这是因为 ALTER TABLE 需要修改表的结构,MDL 锁确保表结构不会在事务进行过程中被改变

4. MDL 锁与 DDL 操作

在 MySQL 中,元数据锁主要用于协调 DDL 操作DML 操作 之间的冲突。例如,当一个事务正在执行 DML 操作时,MDL 锁会防止另一个事务对表进行结构性修改。具体来说:

  • 当 DML 操作正在进行时,如 SELECTINSERT,MySQL 会为表加上 MDL 锁,这个锁保证了其他事务不能对表进行结构性变更。
  • 当 DDL 操作执行时,例如 ALTER TABLE,MySQL 会检查是否存在持有共享或排他 MDL 锁的事务。如果有,DDL 操作会被阻塞,直到 MDL 锁被释放。

5. MDL 锁与事务的关系

MDL 锁是与事务紧密关联的。每个事务在访问表时,会自动为该表申请 MDL 锁,确保对表的访问不会与其他事务的结构修改冲突。MDL 锁的生命周期与事务相同,事务提交或回滚后,MDL 锁会被释放

示例
假设有两个客户端,客户端 A 执行了一个 SELECT 查询,客户端 B 在同一时刻执行了 ALTER TABLE。由于客户端 A 的查询会为表加上共享 MDL 锁,客户端 B 必须等到客户端 A 完成查询并释放锁后,才能执行 ALTER TABLE 操作。

6. MDL 锁的回滚与死锁

如果在事务执行过程中发生了回滚,MDL 锁会随之被释放。通常情况下,MDL 锁不会导致死锁,但在高并发的环境中,如果某些事务长期持有 MDL 锁,可能会导致其他事务被阻塞,进而影响系统的响应时间和并发性能。

死锁情况

  • 表的结构变更:如果两个事务分别对同一张表执行 SELECTALTER TABLE 操作,且这些事务交替进行,它们可能会陷入锁等待的状态。为了避免这种情况,通常建议减少同时进行结构变更和数据操作的频率。

7. 如何检查 MDL 锁

可以使用 SHOW ENGINE INNODB STATUS; 命令查看当前锁的状态。该命令输出中包含有关 InnoDB 锁的详细信息,其中也包括 MDL 锁的相关信息。

示例查询

SHOW ENGINE INNODB STATUS;

分析 MDL 锁的输出

SHOW ENGINE INNODB STATUS; 的输出中,MDL 锁可能以如下方式显示:

  • Metadata lock on table_name:显示当前在 table_name 表上的元数据锁,表明有事务正在等待获取该表的 MDL 锁,或者某个事务已持有该锁。
  • Waiting for metadata lock:显示当前事务正在等待获取一个 MDL 锁,这通常是因为另一个事务正在持有锁,导致当前事务阻塞。
    在输出中,你可以看到有关锁的信息,包括 MDL 锁的类型、持有锁的事务、被阻塞的事务等。这有助于分析系统中锁的情况,及时发现潜在的性能问题。

日志片段

I/O thread 1 state: waiting for completed aio requests (write thread)
I/O thread 2 state: waiting for completed aio requests (read thread)
...
Insert buffer (Buffer pool: 8192 pages, 7055 free)
Log sequence number 2508379799
Log flush list empty
...
Pages read: 964, created: 173, written: 648
System pages read: 9655
...

分析:

  1. I/O线程状态

    • 日志显示系统的两个 I/O 线程处于 等待完成异步 I/O 请求 (waiting for completed requests) 的状态。这是正常的现象,表明系统并没有卡住,I/O 线程在有新的磁盘操作时会继续执行。
    • 对应的,write thread 表示写入操作,read thread 表示读取操作。

    背后意思:目前系统处于低负载状态,磁盘操作不频繁。

  2. 插入缓冲和页面状态

    • Insert buffer 表示插入缓冲区的状态。日志显示Buffer pool: 8192 pages, 7055 free,这意味着数据库总共有 8192 页的内存缓冲区,其中 7055 页是空闲的,表明数据库有大量的内存可供使用。

    背后意思:内存使用情况良好,当前系统的读写操作不多,处于空闲状态。

  3. 日志序列号和日志状态

    • Log sequence number 2508379799 表示日志系统的一个序列号,是数据库在执行写操作时生成的。
    • Log flush list empty 表示没有待刷写的日志,意味着所有的日志操作都已经写入磁盘。

    背后意思:日志系统工作正常,所有的写操作都已经完成,不存在日志积压。

总结

MDL 锁是 MySQL 中一种确保表元数据一致性的机制,它通过协调 DML 和 DDL 操作的执行,防止数据和结构的冲突。在高并发环境下,MDL 锁有时会对性能产生一定影响,了解其工作机制及使用场景对于优化数据库性能和避免死锁至关重要。

通过合理使用事务和锁机制,合理优化查询和 DDL 操作,能够有效减少 MDL 锁带来的阻塞问题,并提高数据库的并发处理能力。

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

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

相关文章

计算机毕业设计Python轨道交通客流预测分析可视化 智慧交通 机器学习 深度学习 人工智能 爬虫 交通大数据

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

从计算服务器角度看智算与算力

计算服务器于智算和算力领域的地位堪称中流砥柱。人工智能旨在赋予计算机人类智能的使命,对计算服务器提出了近乎苛刻的要求。 在智算层面,它是计算服务器通向高效能的核心动力。凭借 CPU 与 GPU、FPGA、ASIC 等构建的异构组合,计算服务器可…

Lighthouse(灯塔)—— Chrome 浏览器性能测试工具

1.认识 Lighthouse Lighthouse 是 Google 开发的一款开源性能测试工具,用于分析网页或 Web 应用的性能、可访问性、最佳实践、安全性以及 SEO 等关键指标。开发人员可以通过 Lighthouse 快速了解网页的性能瓶颈,并基于优化建议进行改进。 核心功能&…

Logistic Regression(逻辑回归)、Maximum Likelihood Estimatio(最大似然估计)

Logistic Regression(逻辑回归)、Maximum Likelihood Estimatio(最大似然估计) 逻辑回归(Logistic Regression,LR)逻辑回归的基本思想逻辑回归模型逻辑回归的目标最大似然估计优化方法 逻辑回归…

使用Hadoop MapReduce进行大规模数据爬取

Hadoop MapReduce概述 Hadoop MapReduce是一个编程模型,用于处理和生成大数据集。它由Map和Reduce两个主要阶段组成。Map阶段负责处理输入数据,并将结果输出为键值对;Reduce阶段则对Map阶段的输出进行汇总和合并,生成最终结果。 …

AI驱动的低代码平台:解密背后的算法与架构创新

引言 在如今的数字化浪潮中,企业对软件的需求正以前所未有的速度增长。传统的开发方式由于开发周期长、成本高,已逐渐无法满足市场的快速变化。而低代码平台的出现,使得开发者和业务人员能够以极简的方式快速构建应用。然而,随着企…

【Spring工具插件】lombok使用和EditStarter插件

阿华代码,不是逆风,就是我疯 你们的点赞收藏是我前进最大的动力!! 希望本文内容能够帮助到你!! 目录 引入 一:lombok介绍 1:引入依赖 2:使用 3:原理 4&…

释放超凡性能,打造鸿蒙原生游戏卓越体验

11月26日在华为Mate品牌盛典上,全新Mate70系列及多款全场景新品正式亮相。在游戏领域,HarmonyOS NEXT加持下游戏的性能得到充分释放。HarmonyOS SDK为开发者提供了软硬协同的系统级图形加速解决方案——Graphics Accelerate Kit(图形加速服务…

Zynq(6)FATFS读写eMMC

文章目录 1.简介eMMc与FAT2.eMMC与FAT的关系3.添加xilinx库4.用 FATFS完成emmc的读写5.传送门 1.简介eMMc与FAT eMMC (embedded MultiMediaCard) 是一种嵌入式闪存存储解决方案,由NAND闪存和内置的控制器组成,NAND闪存存储数据,而控制器负责…

【Linux】gdb / cgdb 调试 + 进度条

🌻个人主页:路飞雪吖~ 🌠专栏:Linux 目录 一、Linux调试器-gdb 🌟开始使用 🌠小贴士: 🌟gdb指令 🌠小贴士: ✨watch 监视 ✨打条件断点 二、小程序----进…

如何解决maven项目使用Ctrl + /添加注释时的顶格问题

一、问题描述 相信后端开发的程序员一定很熟悉IDEA编译器和Maven脚手架,使用IDEA新建一个Maven工程,通过SpringBoot快速构建Spring项目。在Spring项目pom.xml文件中想添加注释,快捷键Ctrl /,但是总是顶格书写。 想保证缩进统一…

python学习——数据的验证

文章目录 1. str.isdigit()2. str.isnumeric()3. str.isalpha()4. str.isalnum()5. str.islower()6. str.isupper()7. str.istitle()8. str.isspace()实操 以下是Python中字符串数据验证方法的详细解释: 1. str.isdigit() 这个方法用于检查字符串中的所有字符是否都…

基于Springboot+Vue的在线答题闯关系统

基于SpringbootVue的在线答题闯关系统 前言:随着在线教育的快速发展,传统的教育模式逐渐向互联网教育模式转型。在线答题系统作为其中的一个重要组成部分,能够帮助用户通过互动式的学习方式提升知识掌握度。本文基于Spring Boot和Vue.js框架&…

Web(CSS+JS+HTML实现简单界面)

前言 写的是个人博客界面,代码比较冗余,web的一个小作业。。。。。。 因为后面改了一次,有些css是直接写到了html文件中,重复的代码也比较多。 项目结构 CSS style.css * {margin: 0;padding: 0;box-sizing: border-box; }b…

Scala:正则表达式

object test03 {//正则表达式def main(args: Array[String]): Unit {//定义一个正则表达式//1.[ab]:表示匹配一个字符,或者是a,或者是b//2.[a-z]:表示从a到z的26个字母中的任意一个//3.[A-Z]:表示从A到Z的26个字母中的任意一个//4.[0-9]:表示从0到9的10…

经验帖 | Matlab安装成功后打不开的解决方法

最近在安装Matlab2023时遇到了一个问题: 按照网上的安装教程成功安装 在打开软件时 界面闪一下就消失 无法打开 但是 任务管理器显示matlab在运行中 解决方法如下: matlab快捷方式–>右键打开属性–>目标 填写许可证文件路径 D:\MATLAB\MatlabR20…

VCU——matlab/simulink软件建模

一、认识MATLAB/Simulink 1. matlab主界面 2. simulink 二、Simulink 建模基础 1. Simulink模块 2. 模型的仿真 matlab 中比较两个浮点型,不要用,采取差值和Compare To Constant的方案 3. 自动代码生成

(软件测试文档大全)测试计划,测试报告,测试方案,压力测试报告,性能测试,等保测评,安全扫描测试,日常运维检查测试,功能测试等全下载

1. 引言 1.1. 编写目的 1.2. 项目背景 1.3. 读者对象 1.4. 参考资料 1.5. 术语与缩略语 2. 测试策略 2.1. 测试完成标准 2.2. 测试类型 2.2.1. 功能测试 2.2.2. 性能测试 2.2.3. 安全性与访问控制测试 2.3. 测试工具 3. 测试技术 4. 测试资源 4.1. 人员安排 4.2. 测试环境 4.2.…

Crash-SQLiteDiskIOException

目录 相关问题 日志信息 可能原因 问题排查 相关问题 蓝牙wifi无法使用 日志信息 可能原因 磁盘空间不足:当设备上的可用存储空间不足时,SQLite无法完成磁盘I/O操作,从而导致SQLiteDiskIOException。 数据库文件损坏:如果数…

PyTorch 深度学习框架简介:灵活、高效的 AI 开发工具

PyTorch 深度学习框架简介:灵活、高效的 AI 开发工具 PyTorch 作为一个深度学习框架,以其灵活性、可扩展性和高效性广受欢迎。无论是在研究领域进行创新实验,还是在工业界构建生产级的深度学习模型,PyTorch 都能提供所需的工具和…