同事说开发机更改一个表结构,加字段,但是一直挂在那里,没反应。一开始以为表测试数据量很大,因为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. [irving] C# Windows Beep 调用声音文件

    方法一:Console.Beep(); 方法二:可以用Console.WriteLine("/a");来代替Beep(). MSDN:http://msdn.microsoft.c ...

  2. 获取本机外网IP的方式笔记

    1.IP138 网址:http://www.ip138.com/: 分离出的快速查询地址:http://20140507.ip138.com/ic.asp(2014年8月9日有效) 个人经验:百度搜索 ...

  3. 【跟我一起学Python吧】python with statement 进阶理解

    由于之前有一个项目老是要打开文件,然后用pickle.load(file),再处理...最后要关闭文件,所以觉得有点繁琐,代码也不简洁.所以向python with statement寻求解决方法.以 ...

  4. wuzhicms 后台登录存留时间实现方式

    在五指后台管理登录后,超过半小时不操作后台(不刷新页面或切换页面),就就会强制退出后台. 实现的思路是,在每次刷新页面都把当前时间存储下来,利用php的session机制来检测比对当前时间和数据库中存 ...

  5. 最长公共子序列LCS

    LCS:给出两个序列S1和S2,求出的这两个序列的最大公共部分S3就是就是S1和S2的最长公共子序列了.公共部分 必须是以相同的顺序出现,但是不必要是连续的. LCS具有最优子结构,且满足重叠子问题的 ...

  6. leetcode@ [355] Design Twitter (Object Oriented Programming)

    https://leetcode.com/problems/design-twitter/ Design a simplified version of Twitter where users can ...

  7. XML学习笔记(2)--dom4j操作XML

    1. 介绍(四种方式的比较这部分转载自:http://www.blogjava.net/xcp/archive/2010/02/12/312617.html) 1)DOM(JAXP Crimson解析 ...

  8. Foreach与Random

    [记忆贴] 1)foreach语句可以用于数据或者其他任何Iterable,但是并不意味着数组肯定也是一个Iterable,而任何自动包装也不会自动发生. package thinking.in.ja ...

  9. Android实例-读取设备联系人(XE8+小米2)

    相关资料: http://www.colabug.com/thread-1071065-1-1.html 结果: 1.将权限打开Read contacts设置为True,不然报图一的错误. 2.搜索空 ...

  10. UVALive 7457 Discrete Logarithm Problem (暴力枚举)

    Discrete Logarithm Problem 题目链接: http://acm.hust.edu.cn/vjudge/contest/127401#problem/D Description ...