首页 > 数据库 >MySQL启用跟踪MDL(元数据锁)功能

MySQL启用跟踪MDL(元数据锁)功能

时间:2023-04-09 23:22:22浏览次数:55  
标签:schema mdl MDL 启用 lock MySQL metadata wait

 

MySQL启用跟踪MDL(元数据锁)功能

 

MDL锁:全称为meta data lock, 中文叫元数据锁,是从MySQL5.5开始引入的锁,是为了解决DDL操作和DML操作之间操作一致性。从锁的作用范围上来说,MDL算是一种表级锁,是一个server层的锁。

其实MDL加锁过程是系统自动控制,无法直接干预,也不需要直接干预,当我们对一个表做增删改查操作的时候,会自动加MDL读锁;当我们要更新表结构的时候,加MDL写锁。加读锁则所有线程可正常读表的元数据,并且读锁不影响表的增删改查操作,只是不能修改表结构;而加写锁只有拥有锁的线程可以读写元数据,即只拥有锁的线程才能更新表结构,其他线程不能修改结构也不能执行相应的增删改查。

即MDL中,读读共享,读写互斥,写写互斥。

出自:传送门

官方文档介绍:https://dev.mysql.com/doc/refman/8.0/en/metadata-locking.html

 

有时候"show processlist"能看到 Waiting for table metadata lock 状态的会话,此状态意味着查询正在等待新类型的表锁:元数据锁 (MDL)。

这样的锁在第一次访问表时获取,并在查询完成执行或事务(如果使用)关闭时释放。MDL可以通过SELECT、DML( Data Manipulation Language,特别是UPDATE、INSERT、DELETE)DDL(Data Definition Language)查询来设置。它还会影响非事务表,例如使用MyISAM存储引擎的表。

 

如何找出持有锁的会话?

可以依靠性能模式来隔离长时间运行的事务并了解正在发生的事情:事务可能挂在一个很长的查询上,或者编码错误可能忘记提交显式事务。

为了跟踪MDL,请确保启用了正确的工具: (在我的MySQL8中,默认是启用的,MySQL5中默认是禁用的。)

8.0.30版本:
(root@localhost 23:10:15) [(none)]> select * from performance_schema.setup_instruments where name='wait/lock/metadata/sql/mdl';
+----------------------------+---------+-------+------------+------------+---------------+
| NAME                       | ENABLED | TIMED | PROPERTIES | VOLATILITY | DOCUMENTATION |
+----------------------------+---------+-------+------------+------------+---------------+
| wait/lock/metadata/sql/mdl | YES     | YES   |            |          0 | NULL          |
+----------------------------+---------+-------+------------+------------+---------------+
1 row in set (1.39 sec)

5.7.30版本:
mysql> select * from performance_schema.setup_instruments where name='wait/lock/metadata/sql/mdl';
+----------------------------+---------+-------+
| NAME                       | ENABLED | TIMED |
+----------------------------+---------+-------+
| wait/lock/metadata/sql/mdl | NO      | NO    |
+----------------------------+---------+-------+
1 row in set (0.00 sec)

 

 

开启方式1(重启失效): 来源:文档 ID 2102004.1
mysql> update performance_schema.setup_instruments set enabled='yes', timed='yes' where name = 'wait/lock/metadata/sql/mdl';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

--该视图可以不用commit
mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from performance_schema.setup_instruments where name='wait/lock/metadata/sql/mdl';
+----------------------------+---------+-------+
| NAME                       | ENABLED | TIMED |
+----------------------------+---------+-------+
| wait/lock/metadata/sql/mdl | YES     | YES   |
+----------------------------+---------+-------+
1 row in set (0.00 sec)

mysql> select * from performance_schema.metadata_locks;
+-------------+--------------------+-------------------+-----------------------+---------------------+---------------+-------------+--------+-----------------+----------------+
| OBJECT_TYPE | OBJECT_SCHEMA      | OBJECT_NAME       | OBJECT_INSTANCE_BEGIN | LOCK_TYPE           | LOCK_DURATION | LOCK_STATUS | SOURCE | OWNER_THREAD_ID | OWNER_EVENT_ID |
+-------------+--------------------+-------------------+-----------------------+---------------------+---------------+-------------+--------+-----------------+----------------+
| TABLE       | performance_schema | setup_instruments |       139744478585792 | SHARED_READ         | TRANSACTION   | GRANTED     |        |              45 |             30 |
| TABLE       | performance_schema | metadata_locks    |       139744478603296 | SHARED_READ         | TRANSACTION   | GRANTED     |        |              45 |             32 |
| TABLE       | zkm                | test              |       139744478570080 | SHARED_READ         | TRANSACTION   | GRANTED     |        |              45 |             33 |
| GLOBAL      | NULL               | NULL              |       139744143008352 | INTENTION_EXCLUSIVE | STATEMENT     | GRANTED     |        |              47 |              8 |
| SCHEMA      | zkm                | NULL              |       139744143018304 | INTENTION_EXCLUSIVE | TRANSACTION   | GRANTED     |        |              47 |              8 |
| TABLE       | zkm                | test              |       139744143025760 | EXCLUSIVE           | TRANSACTION   | PENDING     |        |              47 |              8 |
+-------------+--------------------+-------------------+-----------------------+---------------------+---------------+-------------+--------+-----------------+----------------+
6 rows in set (0.00 sec)

 

开启方式2(重启生效):

来源:文档 ID 1473704.1

[mysqld]
performance_schema_instrument                              = wait/lock/metadata/sql/mdl=ON

 

 

可以同时采用两种方式,达到无需重启永久生效的效果。

 

 

参考文档:

https://blog.csdn.net/weixin_43189971/article/details/126436023

Metadata Locking -- Which Connection is Holding on to the Lock? (文档 ID 1473704.1)

How to Retrieve Table Level or Global Read Lock Status from Running MySQL Server (文档 ID 2102004.1)

What Does Thread Status "Waiting for table metadata lock" in the MySQL Server Processlist Mean? (文档 ID 1365549.1)

 

标签:schema,mdl,MDL,启用,lock,MySQL,metadata,wait
From: https://www.cnblogs.com/PiscesCanon/p/17301430.html

相关文章

  • MySQL、Oracle、SQLServer、PostgreSQL、DB2、Sybase、GBase、Informix关系型数据库简
    MySQLMySQL是一种开源的关系型数据库管理系统,它是最流行的数据库之一。MySQL具有高性能、可靠性和易用性的特点,支持多种操作系统和编程语言。MySQL的优点包括:优点:开源免费,可自由使用和修改高性能,支持大规模数据存储和高并发访问易于安装和使用,具有良好的文档和社区支持支......
  • mysql的主键超过最大值会发生什么?
    设置主键的情况下在自增主键达到int64最大后,再次插入一行记录,报错如下:Duplicateentry‘4294967295’forkey‘increment_id_test.PRIMARY’唯一键冲突报错:当auto_incement达到上限后,再次申请下一个id时,得到的值保持不变。在建表时,通常都会将主键id设置为8字节的bigintu......
  • SQL基础操作_3_数据字典(涵盖SQL Server、Oracle、Mysql常见系统数据字典)
    目录数据库元数据查询7.5.1列出模式中所有的表7.5.2列出所有的数据库7.5.3列出给定表的基本信息7.5.4列出给定表的索引信息7.5.5列出给定表的主键、外键约束7.5.6列出给定表的外键引用7.5.7列出给定表的检查约束7.5.8列出给定表的默认约束7.5.9列出给定表的所有约束7.5.10......
  • MySQL Cursor 的定义和使用
    前言最近项目中需要迁移数据,对旧表A的每一行记录处理后插入新表B。Google一下,发现MySQLCursor适合这种场景,上篇文章介绍了handler,那么本篇就一起看下Cursor是什么吧!本文基于MySQL8.0定义我们来看看ChatGPT是怎么理解MySQLCursor的吧:我:MySQLCursor是什么......
  • 爬虫最后一天,爬取到的数据存到mysql中,爬虫和下载中间件、加代理、cookie、header、se
    爬到的数据存到mysql中classFirstscrapyMySqlPipeline:defopen_spider(self,spider):print('我开了')self.conn=pymysql.connect(user='root',password="",host='127.0.0.1......
  • 多表查询和python操作mysql
    目录多表查询的两种方法方法1:连表操作方法2:子查询小知识点补充说明可视化软件NaviCat多表查询练习题1、查询所有的课程的名称以及对应的任课老师姓名2.查询平均成绩大于八十分的同学的姓名和平均成绩3.查询没有报李平老师课的学生姓名4.查询没有同时选修物理课程和体育课程的学生......
  • Android 启用 Material Design 3(Material You) 小白教程
    介绍md3的效果:原本是红色壁纸对应的红色App主题,在改成绿色壁纸之后,App主题也相应的变成绿色了。这个效果主要是使用了MaterialYou中的动态颜色功能。官方文档https://m3.material.io具体每个组件的代码示例,在github上:https://github.com/material-components/materia......
  • (已解决)安装PyMySQL出现问题--'pip' 不是内部或外部命令,也不是可运行的程序 或批处理文
    问题描述:输入cmd,进入命令窗口,输入pipinstallpymysql时候出现下面的问题: 然后进入python环境中去输入还是报错:问题原因:环境变量配置出错,cmd下无法调用pip程序。解决办法:①首先退出python环境,输入命令:exit() ②然后去电脑里面找到python的安装位置,如图类似这样的文件......
  • Navicat软件、python操作MySQL
    目录Navicat软件1.软件简介2.navicat基本操作python操作MySQL1.链接、执行sql、关闭(游标)2.查询结果3.增删改查4.使用pymysql写一个注册和登录的案例Navicat软件1.软件简介第三方开发的用来充当数据库客户端的简单快捷的操作界面 无论第三方软件有多么的花里胡哨,底层的本质还......
  • 讲解MySQL8.0备份与还原工具(mysqlbackup)
    一、安装mysqlbackup下载登录oracleedelivery,进入下载连接选择适合你系统的版本下载,在这里我使用的是银河麒麟KylinOSServerV10SP2,因此我选择一个通用的预编译二进制的tar包,如下图:没有Oracleedelivery账号的朋友可以到私信我索取软件安装包。安装[root@light]tarx......