问题描述:
经常有客户遇到表元数据锁的等待Waiting for table metadata lock情况
如下图:
解决过程:
1、通过show processlist看不到Table上有任何操作,但实际上存在有未提交的事务,可以在information_schema.innodb_trx中查看到。在事务没有完成之前,Table上的锁不会释放,其他语句获取不到metadata的独占锁。
2、通过上图,可以查看到占用元数据锁的事务ID,获取了这个事务ID后,就可以和showprocesslist 命令(图一)内的PID对应上具体的session了
3
、定位到具体的锁线程后,问题基本上就迎刃而解了,本例中是一个
sleep
的查询线程,该线程存在未提交的事务导致长期霸占元数据锁,清理掉该线程后,其他
session
就能正常的执行下去了。
关于 Waiting for metadata locking 的出现情景有很多
通常情况下,可以通过show processlist可以看到Table上有正在进行的操作(包括读),此时alter table语句无法获取到metadata 独占锁,会进行等待
另外,如本案例中描述的,通过show processlist看不到Table上有任何操作,但实际上存在有未提交的事务,可以在information_schema.innodb_trx中查看到。
PS:手工的分析排查可能会增加时间和运维成本, RDS运维管理工具DMS已经提供了Innodb锁等待的自动化分析功能
DMS =
》实例信息
=
》
InnoDB
锁等待 查看并终止这些会话。