查询锁定了表,无法终止该进程。

14

我在MySQL中有一个查询锁定表(使用InnoDB):

UPDATE table SET status = 2 WHERE status = 3

这个查询在表上引起了死锁,无法绕过它。

我尝试做了以下操作:

show processlist

然后杀死进程ID,但我似乎无法杀死它。

我尝试过:

kill 9588

9588是进程ID。

接着我执行show processlist,在列表中仍然看到同一个查询。

我该如何强制终止这个进程?同时,为什么这个查询会导致死锁?我该如何解决它?


"kill -9" 是一个操作系统命令,而不是 MySQL 命令。 - tadman
如果UPDATE无法获取status=3的任何行的写入访问权限,它将会被阻塞。请确保所有事务都已提交其更改,并且没有未完成的select for update - cmd
4个回答

29
当您在RDS上运行MySQL实例并希望出于某种原因终止线程或查询时,您会发现您无法使用“KILL”或“mysqladmin kill”,因为您没有执行此操作的权限。
RDS提供了名为“mysql.rds_kill”和“mysql.rds_kill_query”的存储过程,分别用于终止线程和查询。要终止线程,请先使用“SHOW PROCESSLIST”获取线程列表并找到要终止的线程ID。假设线程ID为53512,则使用:
CALL mysql.rds_kill(53512)

Source: http://snak.tumblr.com/post/13856391340/killing-a-thread-or-query-of-mysql-running-on-rds


2
官方文档链接:http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.MySQL.CommonDBATasks.html - fideloper
1
快速创建存储过程的代码片段:Select concat('CALL mysql.rds_kill(',id,');') from information_schema.processlist; - Suresh Velusamy

5
KILL命令请求查询终止,命令状态应显示为Killed。没有方法可以强制终止进程并立即终止。作为最后的手段,您可以随时关闭和重新启动mysqld服务器进程。

“最后的手段”这个注释是毫无必要的。它不会有任何区别,你只能强制终止mysqld进程或者发出kill命令并等待其真正执行。 - Chibueze Opata
@ChibuezeOpata 我曾经见过 mysqld 处于一个不可终止的状态,根本无法关闭。如果它不能够安静地关闭,你可能需要强制重启。 - tadman
是的,那就是我想表达的意思。如果他们已经遇到了无法终止进程的问题,那么发出关机或重启命令是没有帮助的。你必须强制终止或者只需发出终止查询并等待。 - Chibueze Opata

5
你需要运行以下命令来终止进程。
> show processlist;  
> kill query processId;

查询参数指定我们需要终止查询命令进程。

杀死进程的语法如下:

KILL [CONNECTION | QUERY] processlist_id

参考此链接获取更多信息。


1

首先,您需要尝试关闭计算机上的 mysql/sql 服务,然后再尝试关闭运行查询的程序。

希望这对您有所帮助。


好的,这个终止了查询。谢谢。但是我遇到了死锁问题! - Mike
如果您能告诉我更多关于您的数据库以及您想要做什么,也许我可以帮助您解决查询问题。如果您还没有解决它,那就请告诉我吧。 - Robert Heeren
提供一个杀掉 MySQL 的示范命令,这个答案可以更好。 - mopo922

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接