如何停止正在运行的MySQL查询?


258

mysql从Linux Shell 连接到。我时不时地运行一个SELECT太大的查询。它可以打印,我已经知道这不是我的意思。我想停止查询。

击中Ctrl+C(几次)会mysql完全杀死并把我带回外壳,所以我必须重新连接。

是否可以在不杀死mysql自己的情况下停止查询?


1
值得一提的是,MySQL 5.7支持服务器端SELECT语句超时。此处的更多信息:mysqlserverteam.com/server-side-select-statement-timeouts
Morgan Tocker 2014年

Answers:


462
mysql>show processlist;

mysql> kill "number from first col";

1
谢谢,我只知道如何在phpmyadmin中做到这一点!
Zilverdistel

5
mysql正在打印...我看不到提示
David B 2010年

34
我同意这种基本方法,但是对于这种情况,我认为使用KILL QUERY它要好一些KILL。这样,查询将被杀死,但连接不会被杀死。
艾克·沃克

3
如果您的进程列表正在滚动经过缓冲区,一个有用的提示是设置寻呼机。只需在提示符下输入'\ P more'。dbasquare.com/2012/03/28/…
Scott

1
如果在AWS RDS上使用MySQL,则没有运行权限KILL,但可以运行:CALL mysql.rds_kill(12345)
Kip

70

只是添加

KILL QUERY **Id** Id是来自的连接ID show processlist

如果您不希望从某些应用程序运行时通常终止连接,则更可取。

有关更多详细信息,您可以在此处阅读mysql doc


我有一个与此相关的问题,连接只是重生,还是终止连接最终会导致池大小太小而无法运行应用程序?
Iroh叔叔

48

连接到mysql

mysql -uusername -p  -hhostname

显示完整的进程列表:

mysql> show full processlist;
+---------+--------+-------------------+---------+---------+------+-------+------------------+
| Id      | User   | Host              | db      | Command | Time | State | Info             |
+---------+--------+-------------------+---------+---------+------+-------+------------------+
| 9255451 | logreg | dmin001.ops:37651 | logdata | Query   |    0 | NULL  | show processlist |
+---------+--------+-------------------+---------+---------+------+-------+------------------+

杀死特定的查询。此处id = 9255451

mysql> kill 9255451;

如果您拒绝权限,请尝试以下SQL:

CALL mysql.rds_kill(9255451)

13
注意:如果使用AWS RDS实例,则需要最后一个查询。
基普(Kip)

13

使用mysqladmin杀失控查询:

运行以下命令:

mysqladmin -uusername -ppassword pr

然后记下进程ID。

mysqladmin -uusername -ppassword kill pid

失控查询应该不再消耗资源。


9

如果mysqladmin有空的话,您可以通过以下方式获得查询列表:

> mysqladmin -uUSERNAME -pPASSWORD pr

+-----+------+-----------------+--------+---------+------+--------------+------------------+
| Id  | User | Host            | db     | Command | Time | State        | Info             |
+-----+------+-----------------+--------+---------+------+--------------+------------------+
| 137 | beet | localhost:53535 | people | Query   | 292  | Sending data | DELETE FROM      |
| 145 | root | localhost:55745 |        | Query   | 0    |              | show processlist |
+-----+------+-----------------+--------+---------+------+--------------+------------------+

然后,您可以停止托管长时间运行的查询的mysql进程:

> mysqladmin -uUSERNAME -pPASSWORD kill 137

6

您需要运行以下命令来终止该进程。

> show processlist;  
> kill query processId;

查询参数指定我们需要杀死查询命令的过程。

kill过程的语法如下

杀死[连接| QUERY] processlist_id

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


1

这个问题的作者提到,通常只有在MySQL打印其输出后,他才意识到执行了错误的查询。如前所述,在这种情况下,Ctrl-C无济于事。但是,我注意到它 会中止当前查询 -如果您打印任何输出之前捕获了它。例如:

mysql> select * from jos_users, jos_comprofiler;

MySQL忙于生成上述两个表的笛卡尔积,您很快就会注意到MySQL尚未在屏幕上打印任何输出(进程状态为Sending data),因此您键入Ctrl-C

Ctrl-C -- sending "KILL QUERY 113240" to server ...
Ctrl-C -- query aborted.
ERROR 1317 (70100): Query execution was interrupted

Ctrl-C可以类似地用于停止UPDATE查询。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.