前言:今天开发童鞋遇到一个奇怪的问题,在测试环境里面执行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。喜欢技术的一起来交流吧

MDL锁导致mysql夯住_MySQL MetaData Lock 案例分享相关推荐

  1. 数据库周刊59丨GaussDB(for openGauss)开放商用;人大金仓保障冬奥会演练顺利完成;MDL锁导致的MySQL问题分析;PG日志使用手册;达梦表空间查询;数据库笔试题面试题集……

    热门资讯 1.openGauss 上线华为云正式商用 - GaussDB(for openGauss) [摘要]近日,GaussDB(for openGauss)已于华为云官网全面开放商用.该产品是华 ...

  2. kfaka storm写入mysql_基于Storm+Kafka+Zookeeper锁+Memcached+mysql架构全方位系统Storm项目案例实战...

    基于Storm+Kafka+Zookeeper锁+Memcached+mysql架构全方位系统Storm项目案例实战 适应人群 有一定Storm基础.Kafka基础.Memcached基础.Zooke ...

  3. mysql MDL锁如何解决_MYSQL METADATA LOCK(MDL LOCK)MDL锁问题分析

    一.前言 MYSQL中MDL锁一直是一个比较让人比较头疼的问题,我们谈起锁一般更加倾向于INNODB下层的gap lock.next key lock.row lock等,因为它很好理解,也很好观察, ...

  4. mysql数据库truncate 夯住_MySQL如何优雅的删除大表实例详解

    前言 删除表,大家下意识想到的命令可能是直接使用DROP TABLE "表名",这是初生牛犊的做法,因为当要删除的表达空间到几十G,甚至是几百G的表时候.这样一条命令下去,MySQ ...

  5. mysql hang住_mysql 5.7不定期的hang住重启-问答-阿里云开发者社区-阿里云

    线上一台mysql 5.7.17版本实例,系统centos 6.4 ,96G内存,SSD磁盘,buffer pool 60G,buffer pool instance 8,24 CPU.实例访问情况如 ...

  6. mysql从库夯住_MySQL从库维护经验分享

    前言: MySQL 主从架构应该是最常用的一组架构了.从库会实时同步主库传输来的数据,一般从库可以作为备用节点或作查询使用.其实不只是主库需要多关注,从库有时候也要经常维护,本篇文章将会分享几点从库维 ...

  7. amp mysql升级_【简单的案例分享,停机10分钟】10204升级CRSamp;amp;DB的PSU至1

    发现一个现象,AIX5.3+HACMP+10.2.0.4RAC+RAW的环境,运行五六年的数据库crsd.log都会报以下错误: ----------------------------------- ...

  8. 网络闪断导致oracle监听终止,一个由网络闪断导致的CICS交易网关异常的案例分享...

    本文描述了一则因网络问题导致的cics交易中间件异常的处理方法与思路,如有问题欢迎随时交流~ 一.问题描述: 10月25日,柜面网关 系统 报ctg报错: 10/25/15 03:16:02.775 ...

  9. mysql proxies priv_Mysql 5.7.18 运用MySQL proxies_priv完成类似用户组管理案例分享

    软件安装:装机软件必备包 SQL是Structured Query Language(结构化查询语言)的缩写.SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言.在使用它时,只需要发出& ...

最新文章

  1. AndroidUI 视图动画-旋转动画效果 (RotateAnimation)
  2. arttemplate 不转义html,使用artTemplate模板引擎渲染错误
  3. linux 可执行文件权限不够,root执行/media可执行文件权限不够,chmod修改权限无效...
  4. java join()源码_Java Thread的join() 之刨根问底
  5. Java I/O系统学习系列一:File和RandomAccessFile
  6. vue2移动端使用vee-validate进行表单验证
  7. Mysql(5)——数据库中表的操作(1)
  8. 使用地图触发功能处理相干事件
  9. [react] 在React中组件和元素有什么区别?
  10. 【英语学习】【WOTD】asperity 释义/词源/示例
  11. java jexl_一种表达式语言的解析引擎JEXL简单使用
  12. 大数据之-Hadoop之HDFS的API操作_判断是文件还是文件夹---大数据之hadoop工作笔记0062
  13. Tomcat7.0下配置javabeanservlet路径问题
  14. 坐标计算机在线使用,caslo计算器计算坐标的方法
  15. 一个80后神话的倒掉----郑立
  16. 二维码图片生成(带文字显示)
  17. SSL证书的申请流程
  18. 支付宝小程序uni-app的map多边形polygons不显示问题解决
  19. matlab光线追击,MATLAB在追迹光线计算中的应用
  20. 实用工具推荐【待更新】

热门文章

  1. div+css 单行或者多行超出文本,数字,字母长度自动省略
  2. spring boot配置dubbo(XML)
  3. 谈谈对ThreadLocal的理解?(基于jdk1.8)
  4. python 折线图中文乱码_彻底解决 Python画图中文乱码问题--Pyplotz组件
  5. typeof 数据类型转换
  6. java的队列实现方法_Java实现队列的三种方法集合
  7. mysql blgg__MySQL_exceptions.ProgrammingError:(2014,“命令不同步;您现在无法运行此命令”)?...
  8. mysql 分区 性能更差_用案例分析MySQL 5.7分区表性能下降的根本原因
  9. vim插件自动补齐_给VIM添加REPL
  10. css线条伸缩_CSS3弹性伸缩布局之box布局