同事说开发机更改一个表结构,加字段,但是一直挂在那里,没反应。一开始以为表测试数据量很大,因为mysql增加表字段会重写表,后来看了下数据量很小,就另外查看过程、原因分析和处理如下:

 一、环境 
 mysql 5.6.21 
 Red Hat 6.5

 二、问题还原处理

--做了一个更改表结构加字段的操作,但是一直挂着不返回:
mysql> alter table tbl_test add remark varchar(8) after col_url; --开启另一个窗口看进程
mysql> show processlist;
+------+--------+------------------------+-------------+---------+-------+---------------
| Id | User | Host | db | Command | Time | State Info
| 7113 | root | localhost | testdb| Sleep | 5512 | | NULL |
| 7134 | root | localhost | testdb| Sleep | 5513 | | NULL |
| 7141 | root | localhost | NULL | Sleep | 7942 | | NULL |
| 7142 | root | localhost | testdb| Sleep | 1755 | | NULL |
| 7153 | root | localhost | testdb| Sleep | 6950 | | NULL
| 7214 | root | localhost | testdb| Sleep | 4614 | | NULL |
| 7217 | root | localhost | testdb| Sleep | 4232 | | NULL |
| 7219 | root | localhost | testdb| Sleep | 4285 | | NULL |
| 7221 | root | localhost | testdb| Sleep | 4229 | | NULL |
| 7226 | root | localhost | testdb| Sleep | 878 | | NULL |
| 7254 | root | localhost | NULL | Sleep | 2137 | | NULL |
| 7256 | root | localhost | testdb| Sleep | 1511 | | NULL |
| 7269 | root | localhost | testdb| Query | 129 | Waiting for table metadata lock | alter table tbl_test add remark varchar(8) comment |
| 7271 | root | localhost | testdb| Query | 0 | init | show processlist |
| 7276 | root | localhost | NULL | Sleep | 1000 | | NULL
--有收获,显示是Waiting for table metadata lock,元数据上锁了,但是没有更详细的信息,只是提示表被锁了。既然提示锁,那我们再深入看一下是哪把锁锁住了。mysql的可以通过information_schema.locks、information_schema.innodb_trx和information_schema.innodb_lock_waits来查询。 mysql>SELECT trx_id,trx_state,trx_mysql_thread_id,trx_isolation_level,FROM information_schema.innodb_trx;
trx_id trx_state trx_mysql_thread_id trx_isolation_level
2080971 RUNNING 7134 REPEATABLE READ --7134在processlist里面,目前只发现了这个事务,innodb_trx是innodb引擎包含了各种内部事务的系统表,目前在list里面是sleep状态的 --手工kill掉进程,生产上kill进程需要和研发的同学确认
mysql> kill 7134;
Query OK, 0 rows affected (0.00 sec) --然后重新执行
mysql>alter table tbl_test add remark varchar(8) after col_url;
Query OK, 0 rows affected (0.07 sec)
Records: 0 Duplicates: 0 Warnings: 0

三、分析 
引起这个锁的原因很简单,就是有人开启了一个事务,然后对数据库对象做了操作,哪怕只是一个查询,但是事务一直挂在那里,不提交也不回滚,这样对其他Session的DDL事务就会造成排它锁。这有可能是开发人员的程序疏忽,也可能是某些工具使用不到位或者存在BUG,需要研发人员继续定位,此版本还可以开启profile来trace。

四、参考: 
官网上的metadata lock说明,以及如何重现 
http://dev.mysql.com/doc/refman/5.6/en/metadata-locking.html 
以及系统表的说明: 
http://dev.mysql.com/doc/refman/5.5/en/innodb-trx-table.html

Metadata Lock原理2的更多相关文章

  1. Metadata Lock原理6

      一 简介   上一篇文章 <MetaData Lock 之一>  简单的介绍了MySQL 引入MDL 的前因后果,本文深入了解MDL的实现原理和运行机制.二 MDL 的类型  meta ...

  2. Metadata Lock原理5

    [MySQL] 之一2015-09-05 15:46:51 分类: MySQL 一 简介 和MySQL打交道比较多的朋友,肯定遇到过 "Waiting for table metadata ...

  3. Metadata Lock原理4

     http://blog.chinaunix.net/uid-28212952-id-3400571.html    Alibaba  今天发生一个故障,MM复制结构(主备库),备库slave del ...

  4. Metadata Lock原理8

    http://www.kancloud.cn/taobaomysql/monthly/67141 MySQL· 5.7优化·Metadata Lock子系统的优化 背景 引入MDL锁的目的,最初是为了 ...

  5. Metadata Lock原理7

    http://blog.itpub.net/22664653/viewspace-1791744/ 一 简介 通过前面两篇文章的介绍,相信读到这里的各位对MDL 锁已经有了比较深入的了解了,本文将结合 ...

  6. Metadata Lock原理3

      http://blog.itpub.net/26515977/viewspace-1208250/   腾讯工程师 随着5.5.3引入MDL,更多的Query被“Waiting for table ...

  7. Metadata Lock原理1

    https://www.percona.com/blog/2013/02/01/implications-of-metadata-locking-changes-in-mysql-5-5/ impli ...

  8. mysql metadata lock(三)

    前言 MDL锁主要用来保护Mysql内部对象的元数据,通过MDL机制保证DDL与DML以及SELECT查询操作的并发.MySQL Meta Lock(一)和MySQL Meta Lock(二)已经讲了 ...

  9. mysql metadata lock(二)

    上一篇<mysql metadata lock(一)>介绍了为什么引入MDL,MDL作用以及MDL锁导致阻塞的几种典型场景,文章的最后还留下了一个小小的疑问.本文将更详细的介绍MDL,主要 ...

随机推荐

  1. HDU 5750 Dertouzos 简单数学

    感悟:这又是zimpha巨出的一场题,然后04成功fst(也就是这题) 实际上还是too young,要努力增加姿势, 分析:直接枚举这些数不好枚举,换一个角度,枚举x*d,也就是d的另一个乘数是多少 ...

  2. SQL经典笔试题之一

    本题用到下面三个关系表: CARD     借书卡.   CNO 卡号,NAME 姓名,CLASS 班级 BOOKS    图书.     BNO 书号,BNAME 书名,AUTHOR 作者,PRIC ...

  3. 暴雪hash算法

    你有一个非常大的字符串数组A,现在又有一个字符串B,需要你去检测B是否存在于A中.最简单粗暴的方法是遍历整个A,但是这个方法投入到实际应用时的运行速度是难以接受的.在没有与其他所有字符串比较前怎么知道 ...

  4. Trail: JDBC(TM) Database Access(3)

    java.sql,javax.sql,javax.naming包    默认TYPE_FORWARD_ONLY:结果集只能向前滚动,只能调用next(),不能重定位游标 TYPE_SCROLL_INS ...

  5. JVM内存结构

    前言 在Java语言开发过程中,out of memory错误是很常见的一种错误.对于JVM的内存结构有更深入的了解,更更好的帮我们排查此类问题,有效的避免此类问题发生.在JAVA 8中内存结构有进行 ...

  6. Spark RDD概念学习系列之Spark的算子的分类(十一)

    Spark的算子的分类 从大方向来说,Spark 算子大致可以分为以下两类: 1)Transformation 变换/转换算子:这种变换并不触发提交作业,完成作业中间过程处理. Transformat ...

  7. 【转】新建maven工程为什么jdk会是默认版本 而不是自己设置的版本?

    原文链接:为什么我eclipse新建项目的时候默认的是JRE1.5? 修改Maven中conf目录里的setting.xml文件内容,加上如下内容: <profiles> <!-- ...

  8. POJ 3660 Cow Contest (最短路dijkstra)

    MPI Maelstrom 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/G Description BIT has recen ...

  9. codeforces 630H (组合数学)

    H - Benches Time Limit:500MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit S ...

  10. DATASNAP为支持FIREDAC而增加的远程方法的数据类型TFDJSONDataSets

    前面的博客提到用FIREDAC全面替代COM那一套东西:DATAPROVIDER,OLEVARIANT,CLIENTDATASET,DBEXPRESS... 显然,DATASNAP的远程方法必须增加对 ...