博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Waiting for table metadata lock
阅读量:5754 次
发布时间:2019-06-18

本文共 1902 字,大约阅读时间需要 6 分钟。

在修改/增加表字段的时候,发现很慢,

show processlist; 时, Waiting for table metadata lock 能一直锁很久。

官网的一段话,可以理解下

一个没提交的事务使用了A表, 另外一个session 对A表进行alter,出现waiting for table metadata lock
 
 
MySQL版本为5.6.12。
在进行alter table操作时,有时会出现Waiting for table metadata lock的等待场景。而且,一旦alter table TableA的操作停滞在Waiting for table metadata lock的状态,后续对TableA的任何操作(包括读)都无法进行,也会在Opening tables的阶段进入Waiting for table metadata lock的队列。如果是产品环境的核心表出现了这样的锁等待队列,就会造成灾难性的后果。
造成alter table产生Waiting for table metadata lock的原因其实很简单,一般是以下几个简单的场景:
场景一:
通过show processlist可以看到TableA上有正在进行的操作(包括读),此时alter table语句无法获取到metadata 独占锁,会进行等待。
这是最基本的一种情形,这个和mysql 5.6中的online ddl并不冲突。一般alter table的操作过程中(见下图),在after create步骤会获取metadata 独占锁,当进行到altering table的过程时(通常是最花时间的步骤),对该表的读写都可以正常进行,这就是online ddl的表现,并不会像之前在整个alter table过程中阻塞写入。(当然,也并不是所有类型的alter操作都能online的,具体可以参见官方手册:http://dev.mysql.com/doc/refman/5.6/en/innodb-create-index-overview.html)
 
场景二:
通过show processlist看不到TableA上有任何操作,但实际上存在有未提交的事务,可以在information_schema.innodb_trx中查看到。在事务没有完成之前,TableA上的锁不会释放,alter table同样获取不到metadata的独占锁。
场景三:
通过show processlist看不到TableA上有任何操作,在information_schema.innodb_trx中也没有任何进行中的事务。这很可能是因为在一个显式的事务中,对TableA进行了一个失败的操作(比如查询了一个不存在的字段),这时事务没有开始,但是失败语句获取到的锁依然有效。从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.
也就是说除了语法错误,其他错误语句获取到的锁在这个事务提交或回滚之前,仍然不会释放掉。because the failed statement is written to the binary log and the locks protect log consistency 但是解释这一行为的原因很难理解,因为错误的语句根本不会被记录到二进制日志。
总之,alter table的语句是很危险的,在操作之前最好确认对要操作的表没有任何进行中的操作、没有未提交事务、也没有显式事务中的报错语句。如果有alter table的维护任务,在无人监管的时候运行,最好通过lock_wait_timeout设置好超时时间,避免长时间的metedata锁等待。
解决 kill 锁表ID

转载地址:http://qbckx.baihongyu.com/

你可能感兴趣的文章
Lnmp 配置多 PHP 开发环境
查看>>
Centos7安装Docker镜像仓库Harbor1.5.3之https
查看>>
负载均衡群集之一LVS-DR
查看>>
大学生为什么要参加软考
查看>>
linux学习第一月测验
查看>>
今日新闻-2019智能家居@智能硬件博览会
查看>>
今日头条架构演进之路——高压下的架构演进专题
查看>>
零基础学习嵌入式 嵌入式底层开发和上层应用
查看>>
shell编程进阶篇
查看>>
Pixelmator Pro mac专为macOS设计,与macOS High Sierra无缝集成
查看>>
system表空间空间解决(ORA-00604 ORA-01653 ORA-02002)
查看>>
sed 对目录进行操作
查看>>
How to convert Windows 7 on MBR/BIOS to GPT/UEFI
查看>>
四则运算总结
查看>>
【翻译】MVC Music Store 教程-概述(三)
查看>>
直接插入排序===
查看>>
表格基础操作
查看>>
求空间一点到另外一点(如原点)的距离
查看>>
gitolite push fail solutions
查看>>
WIFI电源管理
查看>>