MySQL Waiting for table metadata lock的解决方法

Posted php小小菜鸟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL Waiting for table metadata lock的解决方法相关的知识,希望对你有一定的参考价值。

最近需要在某一个表中新增字段,使用Sequel Pro 或者Navicat工具都会出现程序没有反应,使用 show processlist 查看,满屏都是 Waiting for table metadata lock 状态的连接,第一反应当然是 kill 掉这些链接,但是假如太多怎么办?遂在找寻其他办法。

在网上查询得知mysql在进行一些alter table等DDL操作时,如果该表上有未提交的事务则会出现 Waiting for table metadata lock ,而一旦出现metadata lock,该表上的后续操作都会被阻塞(http://www.bubuko.com/infodetail-1151112.html)。所以这个问题需从两方面解决:

1. 查看未提交事务


从 information_schema.innodb_trx 表中查看当前未提交的事务

select trx_state, trx_started, trx_mysql_thread_id, trx_query from information_schema.innodb_trx;

字段意义:

trx_state: 事务状态,一般为RUNNING
trx_started: 事务执行的起始时间,若时间较长,则要分析该事务是否合理
trx_mysql_thread_id: MySQL的线程ID,用于kill
trx_query: 事务中的sql

一般只要kill掉这些线程,DDL操作就不会Waiting for table metadata lock。

2. 调整锁超时阈值
lock_wait_timeout 表示获取metadata lock的超时(单位秒),允许的值范围为1到31536000(1年)。 默认值为31536000 (1年)。官方解释:https://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_lock_wait_timeout 。

修改等待时间:

set session lock_wait_timeout = 1800;
set global lock_wait_timeout = 1800;

经过以上操作,我司的数据库暂时还未出现情况,有相同经历的不妨试一试,如果有更好的解决方案,欢迎留言!!

以上是关于MySQL Waiting for table metadata lock的解决方法的主要内容,如果未能解决你的问题,请参考以下文章

MySQL线程处于Waiting for table flush的分析

MySQL出现Waiting for table metadata lock的原因以及解决方法

Waiting for table metadata lock

MySQL Waiting for table metadata lock的解决方法

MySQL出现Waiting for table metadata lock的原因以及解决方法(转)

20180117MySQL出现Waiting for table metadata lock的原因以及解决方法