我有一个简单的UPDATE语句,运行在一个MySQL 5.6.34数据库上,这个数据库似乎是挂起的。该语句仅用时间戳更新单个行,如下所示:
UPDATE mytable SET last_updated='2017-05-31 02:13:43' WHERE id=123;然而,一个小时后,它仍在运行。
运行SHOW FULL PROCESSLIST;不会显示任何其他进程访问表,所以我不认为这是死锁。我试着杀人并重新运行这个过程,但它仍然挂着。
还有什么其他原因会导致这样一个简单的UPDATE语句挂起?我怎么诊断这个?
发布于 2017-05-31 18:31:40
只需在slow_query_log = 1 (如果>=5.6.1)或log_slow_queries = 1(如果<5.6.1)以及my.cnf中的slow_query_log_file = /path/to/logfile和long_query_time = 0中设置,然后重新启动mysql并查看日志文件。我不会在生产env上继续使用它,这样的日志记录是一个性能杀手,如果您负载很重,可能会导致一些不好的事情。它也可能很快变得非常大,因为long_query_time 0会记录所有内容,所以"/path/to“应该有足够的空闲空间。
发布于 2017-06-01 14:43:03
这个问题迫使我重新启动服务器,从而纠正了问题。
发布于 2022-04-24 22:28:50
如果它是一个InnoDB表,show engine innodb status应该给出它是否在等待锁的指示。
它仍然在运行的一个原因是一个相当大的表,而且id不是表中的主键或辅助键。
https://dba.stackexchange.com/questions/175430
复制相似问题