同事说开发机更改一个表结构,加字段,但是一直挂在那里,没反应。一开始以为表测试数据量很大,因为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. 在PC上测试移动端网站和模拟手机浏览器的5大方法

    在PC上测试移动端网站和模拟手机浏览器的5大方法 来源:互联网 作者:佚名 时间:03-19 10:14:54 [大 中 小]                最近公司要开发网站的移动版,让我准备准备知 ...

  2. 树-哈夫曼树(Huffman Tree)

    概述 哈夫曼树:树的带权路径长度达到最小. 构造规则 1. 将w1.w2.-,wn看成是有n 棵树的森林(每棵树仅有一个结点): 2. 在森林中选出根结点的权值最小的两棵树进行合并,作为一棵新树的左. ...

  3. Ajax异步请求PHP数据

    来源:http://www.ido321.com/1138.html 接到了老师的一个作业,实现的布局如图: 如果输入了科室ID,科室名字只显示与ID对应的,若没有输入,则显示全部,然后根据I科室名字 ...

  4. bzoj 2393 Cirno的完美算数教室(容斥原理+搜索)

    [题意] 定义C数为只包含数字2和9的数,求[L,R]内能被C数整除的个数. [思路] Dfs预处理出C数,并去除其中倍数的情况. Dfs搜索出现情况,奇数加,偶数减,当数值大于R时剪枝. [代码] ...

  5. web服务器分析与设计(二)

    面向对象分析与设计第二步:寻找对象,建立问题域模型 1,用例场景描述 接上一篇中的用例,编写用例场景 U1: 上网者:打开网站(www.xxx.com) 浏览器:连接网站 目标系统:接受连接 检查连接 ...

  6. hadoop-1.1.2集群搭建

    Hadoop安装分为三种不同模式: 本地模式:hadoop在运行时,不使用hdfs,而是使用linux操作系统的文件系统.(默认hadoop就是本地模式) 伪分布模式:在一个节点上运行hadoop(指 ...

  7. CentOS6 root 用户 vi/vim 无法开启高亮

    编辑 /etc/profile.d/vim.sh if [ -n "$BASH_VERSION" -o -n "$KSH_VERSION" -o -n &quo ...

  8. Apache Spark GraphX的简介

    简单地说,GraphX是大规模图计算框架. GraphX 是 Spark 中的一个重要子项目,它利用 Spark 作为计算引擎,实现了大规模图计算的功能,并提供了类似 Pregel 的编程接口. Gr ...

  9. homework-05 GoldNumberServer

    作业要求 这次作业要求实现一个黄金数游戏服务器,游戏流程如下,每个client向服务器提交一个有理数,服务器接收到所有客户端的提交后计算这些数字的平均数,再将其乘以黄金分割得到一个GoldNumber ...

  10. JQuery中的AJAX参数详细介绍

    Jquery中AJAX参数详细介绍 参数名 类型 描述 url String    (默认: 当前页地址) 发送请求的地址. type String (默认: "GET") 请求方 ...