MDL锁导致mysql夯住_MySQL MetaData Lock 案例分享

前言:今天开发童鞋遇到一个奇怪的问题,在测试环境里面执行drop database dbname发现一直夯住不动,等了很久也没有执行,于是问题就到我这里了

一、什么是MetaData Lock?

MetaData Lock即元数据锁,在数据库中元数据即数据字典信息包括db,table,function,procedure,trigger,event等。metadata lock主要为了保证元数据的一致性,用于处理不同线程操作同一数据对象的同步与互斥问题

二、MetaData Lock的前世今生

mdl锁是为了解决一个有名的bug#989,所以在5.5.3版本引入了MDL锁。其实5.5也有类似保护元数据的机制,只是没有明确提出MDL概念而已。但是5.5之前版本(比如5.1)与5.5之后版本在保护元数据这块有一个显著的不同点是,5.1对于元数据的保护是语句级别的,5.5对于metadata的保护是事务级别的。所谓语句级别,即语句执行完成后,无论事务是否提交或回滚,其表结构可以被其他会话更新;而事务级别则是在事务结束后才释放MDL。引入MDL锁主要是为了解决两个问题:

事务隔离问题:比如在可重复隔离级别下,会话A在2次查询期间,会话B对表结构做了修改,两次查询结果就会不一致,无法满足可重复读的要求。

数据复制问题:比如会话A执行了多条更新语句期间,另外一个会话B做了表结构变更并且先提交,就会导致slave在重做时,先重做alter,再重做update时就会出现复制错误的现象。也就是上面提到的bug#989。

三、Waiting For Table MetaData Lock场景重现(这也是我们今天遇到的问题)

session A:注意这里是显示的提交一个事务

root@localhost:mysql.sock 18:03:49 [tom]>desc test;

+------------+-------------+------+-----+-------------------+----------------+

| Field | Type | Null | Key | Default | Extra |

+------------+-------------+------+-----+-------------------+----------------+

| id | int(10) | NO | PRI | NULL | auto_increment |

| name | varchar(32) | YES | | NULL | |

| age | int(10) | YES | | NULL | |

| createtime | datetime | NO | | CURRENT_TIMESTAMP | |

+------------+-------------+------+-----+-------------------+----------------+

4 rows in set (0.01 sec)

root@localhost:mysql.sock 18:03:43 [tom]>start transaction;

Query OK, 0 rows affected (0.00 sec)

root@localhost:mysql.sock 18:03:46 [tom]>select c99 from test;

ERROR 1054 (42S22): Unknown column 'c99' in 'field list'

session B:执行Online DDL(我这个是MySQL5.7.14官方版本哦)

root@localhost:mysql.sock 18:02:26 [tom]>Start transaction;

Query OK, 0 rows affected (0.00 sec)

root@localhost:mysql.sock 18:04:16 [tom]>alter table test drop column age;

发生阻塞...

session C:processlist看不到任何test表操作,但是有MDL锁

root@localhost:mysql.sock 18:02:31 [tom]>show processlist;

+-------+---------+----------------+------+---------+------+---------------------------------+----------------------------------+

| Id | User | Host | db | Command | Time | State | Info |

+-------+---------+----------------+------+---------+------+---------------------------------+----------------------------------+

| 743 | monitor | 10.0.0.6:54020 | NULL | Sleep | 3 | | NULL |

| 92210 | monitor | 10.0.0.6:46778 | NULL | Sleep | 1 | | NULL |

| 93740 | root | localhost | tom | Query | 0 | starting | show processlist |

| 93742 | root | localhost | tom | Sleep | 64 | | NULL |

| 93743 | root | localhost | tom | Query | 8 | Waiting for table metadata lock | alter table test drop column age |

+-------+---------+----------------+------+---------+------+---------------------------------+----------------------------------+

5 rows in set (0.00 sec)

innodb engine监控看不到任何锁冲突信息

------------

TRANSACTIONS

------------

Trx id counter 112477

Purge done for trx's n:o < 112477 undo n:o < 0 state: running but idle

History list length 556

LIST OF TRANSACTIONS FOR EACH SESSION:

---TRANSACTION 421340178270032, not started

0 lock struct(s), heap size 1136, 0 row lock(s)

---TRANSACTION 421340178271856, not started

0 lock struct(s), heap size 1136, 0 row lock(s)

---TRANSACTION 421340178270944, not started

0 lock struct(s), heap size 1136, 0 row lock(s)

--------

FILE I/O

--------

查看information_schema

root@localhost:mysql.sock 18:18:46 [tom]>select trx_id,trx_state,trx_started,trx_mysql_thread_id from information_schema.innodb_trx;

Empty set (0.00 sec)

这种情况是一个特例,存在一个查询失败的语句,比如查询不存在的列,语句失败返回,但是事务没有提交,此时alter仍然会被堵住。通过show processlist看不到表上有任何操作,在information_schema.innodb_trx中也没有任何进行中的事务。这很可能是因为在一个显式的事务中,对表进行了一个失败的操作(比如查询了一个不存在的字段),这时事务没有开始,但是失败语句获取到的锁依然有效。从performance_schema.events_statements_current表中可以查到失败的语句。

If the server acquires metadata locks for a statement that is syntactically valid but fails during execution, it does not release the locks early. Lock release is still deferred to the end of the transaction because the failed statement is written to the binary log and the locks protect log consistency.

定位问题SQL,然后杀掉对应的SQL。查看每一个session正在执行的sql,然后通过下面语句定位到问题sql,杀掉就可以了

select * from performance_schema.events_statements_current\G

select * from sys.session\G

select * from sys.processlist\G

为了方便大家交流,本人开通了微信公众号,和QQ群291519319。喜欢技术的一起来交流吧

8ee405e99bbacaa385ff4ef0a5942c3d.png

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

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

相关文章

ubuntu16 黑主题_给Ubuntu 8.10安装超炫酷黑色新主题

Linux系统的Netbook定做了一套漂亮的界面,名称叫做 HP Mini 1000 Mi Edition。这套界面是基于 Ubuntu 8.04 Hardy Heron的,平常我们熟悉的Ubuntu程序等都可以在这里都使用.不过让 Mi Edition 脱颖而出的是这看起来根本不像是我们平时看过的Ubuntu界面, 看上去倒像媒体中心。这个…

docker 分布式管理群集_Coolpy7分布式物联网MQTT集群搭建

Coolpy7分布式技术&#xff0c;支持多个Coolpy7 Core提供跨数据中心(多活)模式组建群集&#xff0c;支持群集零手动维护(基于Gossip分布式协议作为群集节点状态维护)。Coolpy7从版本号V7.3.2.3开始支持本功能。请到Coolpy7之github项目release下载相关版本https://github.com/C…

vue 数值 拼接字符串_【Vue原理】Compile - 白话版

写文章不容易&#xff0c;点个赞呗兄弟 专注 Vue 源码分享&#xff0c;文章分为白话版和 源码版&#xff0c;白话版助于理解工作原理&#xff0c;源码版助于了解内部详情&#xff0c;让我们一起学习吧 研究基于 Vue版本 【2.5.17】如果你觉得排版难看&#xff0c;请点击 下面链…

gpio驱动蜂鸣器出现破音_五款蜂鸣器驱动电路原理图

蜂鸣器驱动电路图一&#xff1a;典型的蜂鸣器驱动电路&#xff0c;蜂鸣器驱动电路一般包含&#xff1a;一个三极管、一个蜂鸣器、一个续流二极管、一个滤波电容。1、蜂鸣器&#xff1a;发声元件&#xff0c;在其两端施加直流电压(有源蜂鸣器)或者方波(无源蜂鸣器)就可以发声&am…

php和mysql的实践报告_PHP+MySQL项目开发与实践

前言部分基础篇任务一PHP基础知识简介1.1静态网页与动态网页的工作原理1.1.1静态网页与工作原理1.1.2动态网页与工作原理1.2初识PHP1.3习题任务二PHP程序的运行环境搭建2.1配置Apache服务器2.1.1安装Apache服务器2.1.2Apache服务器安装过程中的问题及解决方案2.1.3Apache主目录…

mediumint 在mysql 中是什么类型_mysql中bigint、int、mediumint、smallint 和 tinyint的取值范围...

mysql数据库设计&#xff0c;其中&#xff0c;对于数据性能优化&#xff0c;字段类型考虑很重要&#xff0c;搜集了些资料&#xff0c;整理分享出来&#xff0c;这篇为有关mysql整型bigint、int、mediumint、smallint 和 tinyint的语法介绍&#xff0c;如下&#xff1a;1、bigi…

mysql备份还原数据库操作系统_mysql 命令行备份还原数据库操作

一 备份操作1.备份全部数据库mysqldump -uroot -p --all databases > aa.sql2.备份某个数据库并压缩mysqldump -uroot -p databasename |gzip > aa.sql.gz3 .备份单个表mysqldump -uroot -p -table dbname tbname1 tbname2 >aa.sql4.同时备份多个数据库mysqldump -ur…

python表示当前对象_对象操作

[TOC]# 对象操作## help:返回对象的帮助信息~~~>>> help(str)Help on class str in module builtins:class str(object)| str(object) -> str| str(bytes_or_buffer[, encoding[, errors]]) -> str|| Create a new string object from the given object. If enc…

中国大学慕课python答案第七章_中国大学慕课mooc用Python玩转数据章节答案

嵌体来源A.嵌入牙冠内的修复体 B.没有覆盖前牙唇面或后牙颊面的部分冠修复体艺术不是象牙塔里的_____ &#xff0c;所谓的“为艺术而艺术”&#xff0c;说到底不过是唯美主义_____的志向。自古以来&#xff0c;艺小轿车的速度比卡车的速度每小时快6千米&#xff0c;小轿车和卡车…

mysql 多项式_mysql主从复制原理及实现

一.主从复制原理利用MySQL提供的Replication&#xff0c;其实就是Slave从Master获取Binary log文件&#xff0c;然后再本地镜像的执行日志中记录的操作。由于主从复制的过程是异步的&#xff0c;因此Slave和Master之间的数据有可能存在延迟的现象&#xff0c;此时只能保证数据最…

python迭代器是什么百度百科,python迭代器的接口是什么?

What are the required methods for defining an iterator? For instance, on the following Infinity iterator, are its methods sufficient? Are there other standard or de factor standard methods that define an iterator?class Infinity(object):def __init__(self…

python逻辑表达式3+45and_python入门到精通(一)| python基础语法与各种运算符的使用...

一、python中的基础语法1、输入语句 input格式&#xff1a;变量input(“输入提示信息”)功能&#xff1a;从键盘上输入一行文本信息到变量中&#xff0c;可以强转为各种数据类型。案例&#xff1a; xinput(“您的个人基本信息”)注意点&#xff1a;只能接受一行信息2 input语句…

java中文分词算法_Java实现逆向最大匹配中文分词算法

写道//Java实现逆向最大匹配中文分词算法public class SplitChineseCharacter {public static void main(String[] args) {String input "太好了&#xff0c;今天是星期六啊"; // 要匹配的字符串new Split(input).start();}}class Split {private String[] dictiona…

途牛java面试题_途牛java面试题.docx

途牛java面试题途牛java面试题  QUESTION NO: 1   publicclass Test1 {   publicstaticvoid changeStr(String str){   str"welcome";   }   publicstaticvoid main(String args) {   String str"1234";   changeStr(str);   (str);   …

java httpclient 异步请求_java_java实现HttpClient异步请求资源的方法,本文实例讲述了java实现HttpClien - phpStudy...

java实现HttpClient异步请求资源的方法本文实例讲述了java实现HttpClient异步请求资源的方法。分享给大家供大家参考。具体实现方法如下&#xff1a;package demo;import java.util.concurrent.CountDownLatch;import org.apache.http.HttpResponse;import org.apache.http.cli…

idea创建web项目运行报404错误_使用IDEA新建Web工程启动报404的错误

新换了一个项目组被人吐槽配置文件都能写错&#xff0c;所以打算从头开始一步步搭建一个项目&#xff0c;包含ssm基础框架、mongodb工具类、redis工具类、jsf配置、log配置等今天先来搭建一个web工程。工程搭建好运行时发现404我们都知道&#xff0c;一般404都是由于请求资源的…

java高效写文件_java如何高效读写10G以上大文件

有一份10G以上大文本文件&#xff0c;需要替换里面的一些文本信息(每一行都有)&#xff0c;如何高效读并替换掉生成新的文件先分割成多个文件多个线程操作多个文件&#xff0c;避免两个线程操作同一个文件按行读文件并按行写入新的文件合并所有文件1,4用linux命令就可以了&…

java md2_GitHub - edzjx/Md2Crypto

此项目来源一个字谜解体过程一个程序猿在自己的微信公众号里出了一个字谜。其中用到了MD2加密算法&#xff0c;这是各很古老的加密算法。从网上搜到作者92年发布的C代码还能正常执行。此项目介绍解题过程&#xff0c;和使用C&#xff0c;C#,Java,Python3来测试代码。文章结构破…

java stringbuffer原理_深入理解Java:String

在讲解String之前&#xff0c;我们先了解一下Java的内存结构。一、Java内存模型按照官方的说法&#xff1a;Java 虚拟机具有一个堆&#xff0c;堆是运行时数据区域&#xff0c;所有类实例和数组的内存均从此处分配。JVM主要管理两种类型内存&#xff1a;堆和非堆&#xff0c;堆…

java dubbo jsf_cubelink

cubelink概要设计[TOC]1. 撰写记录更新时间内容作者2017-08-23 08:39:31撰写参数回调章节内容林斌2017-08-22 21:26:52增加了异步响应和异步回调章节林斌2017-08-22 14:36:36确定文档结构和大致框架林斌2. 设计目标设计一个具备治理&#xff0c;监控&#xff0c;服务发现能力的…