如何查找MySQL进程列表并终止这些进程?

140

MySQL数据库由于某些查询而挂起。

我该如何查找这些进程并杀死它们?

5个回答

253

以下是解决方法:

  1. 登录数据库;
  2. 运行命令 show full processlist;,获取导致数据库挂起的进程id、状态和查询内容;
  3. 选择该进程id并执行命令 KILL <pid>; 来终止该进程。

有时手动杀死每个进程可能不够。因此,我们需要使用一些技巧:

  1. 登录 MySQL;
  2. 运行查询 Select concat('KILL ',id,';') from information_schema.processlist where user='user'; 打印所有带有 KILL 命令的进程;
  3. 复制查询结果,粘贴并删除管道符号 |,再次复制和粘贴所有内容到查询控制台。 回车,搞定

10
这个查询很棒!对于那些在MySQL方面经验较少的人,你还可以通过“Host”、“db”、“Command”、“Time”、“State”或“Info”来筛选查询结果:SELECT concat('KILL ',id,';') from information_schema.processlist where Command='Sleep';或者SELECT concat('KILL ',id,';') from information_schema.processlist where Time>'300'; - KareemElashmawy
8
感谢您的查询!我使用了一种增强版,可以节省一些手动编辑时间:select group_concat(concat('KILL ',id,';') separator ' '),这样它们都会落在一行上,可以复制粘贴。 - architectonic
1
查询没问题,但你可能会结束自己的进程。在重新运行“kill all”之前,我建议先检查进程ID列表。 - Patrick.SE
3
为了方便我立即处理剪贴板中的内容(即使有烦人的开闭双引号),我修改 @architectonic 的评论,如下: SELECT group_concat(concat('KILL ',id,';') SEPARATOR ' \n') AS KILL_EVERYTHING FROM information_schema.processlist; 这条语句将返回一个名为 KILL_EVERYTHING 的字段,其中包含多个 "KILL" 命令,用于结束当前活动的 MySQL 进程。 - leerssej

46
select GROUP_CONCAT(stat SEPARATOR ' ') from (select concat('KILL ',id,';') as stat from information_schema.processlist) as stats;

然后将结果复制并粘贴回终端。就像这样:

KILL 2871; KILL 2879; KILL 2874; KILL 2872; KILL 2866;

21

您可以像这样检查是否有任何 mysql 进程正在运行:

ps aux | grep mysqld
ps aux | grep mysql

那么如果它正在运行,您可以使用以下命令(根据当前正在运行的所有进程而定)来终止它:killall

killall -9 mysql
killall -9 mysqld
killall -9 mysqld_safe    

8
楼主询问的是在MySQL服务器内运行的进程。 - reinierpost
9
虽然不是要求的内容,但这对我很有帮助,因为这是在搜索如何在Linux上杀死所有mysqld进程时Google返回的第一项。 - IncredibleHat
顺便说一下,我们应该始终尝试使用kill -15命令,并只有在进程继续运行时才转向使用kill -9命令。通过使用kill -15命令,您为进程提供了优雅终止的机会。 - sateesh

2

关于RDS:

SELECT
  concat('CALL mysql.rds_kill(',id,');')
  FROM information_schema.processlist
  ORDER BY time;

KILL [PID]; 在 RDS 上同样有效。 - logicbloke

-2
对于 MYSQL 8.xx 版本,您可以使用 mysqladmin shutdown 命令来关闭。不确定在旧版本上是否适用。
以下是以 root 身份并带有密码 SomePass 为例:
mysqladmin -u root -pSomePass shutdown
此外,您也可以在 /var/log/mysql/error.log 中看到关闭的记录。

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