mysql报错问题汇总

  • Post author:
  • Post category:mysql




waiting for table metadata lock

场景三:

通过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 但是解释这一行为的原因很难理解,因为错误的语句根本不会被记录到二进制日志。

处理方法:通过performance_schema.events_statements_current找到其sid, kill 掉该session. 也可以 kill 掉DDL所在的session.

总之,alter table的语句是很危险的(其实他的危险其实是未提交事物或者长事务导致的),在操作之前最好确认对要操作的表没有任何进行中的操作、没有未提交事务、也没有显式事务中的报错语句。如果有alter table的维护任务,在无人监管的时候运行,最好通过lock_wait_timeout设置好超时时间,避免长时间的metedata锁等待。


参考

show full processlist;
kill 49214;

select *
from performance_schema.threads
where THREAD_ID = 49338;

SELECT *
FROM INFORMATION_SCHEMA.INNODB_LOCKS;

SELECT *
FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;

SELECT *
FROM information_schema.INNODB_TRX;

select *
from performance_schema.threads
where THREAD_ID = 49338;



版权声明:本文为xkx_07_10原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。