MySQL数据库由于某些查询而挂起。
我该如何查找这些进程并杀死它们?
以下是解决方法:
show full processlist;
,获取导致数据库挂起的进程id、状态和查询内容;KILL <pid>;
来终止该进程。有时手动杀死每个进程可能不够。因此,我们需要使用一些技巧:
Select concat('KILL ',id,';') from information_schema.processlist where user='user';
打印所有带有 KILL
命令的进程;|
,再次复制和粘贴所有内容到查询控制台。 回车,搞定。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;
您可以像这样检查是否有任何 mysql
进程正在运行:
ps aux | grep mysqld
ps aux | grep mysql
那么如果它正在运行,您可以使用以下命令(根据当前正在运行的所有进程而定)来终止它:killall
killall -9 mysql
killall -9 mysqld
killall -9 mysqld_safe
kill -15
命令,并只有在进程继续运行时才转向使用kill -9
命令。通过使用kill -15
命令,您为进程提供了优雅终止的机会。 - sateesh关于RDS:
SELECT
concat('CALL mysql.rds_kill(',id,');')
FROM information_schema.processlist
ORDER BY time;
KILL [PID];
在 RDS 上同样有效。 - logicbloke
SELECT concat('KILL ',id,';') from information_schema.processlist where Command='Sleep';
或者SELECT concat('KILL ',id,';') from information_schema.processlist where Time>'300';
- KareemElashmawyselect group_concat(concat('KILL ',id,';') separator ' ')
,这样它们都会落在一行上,可以复制粘贴。 - architectonicSELECT group_concat(concat('KILL ',id,';') SEPARATOR ' \n') AS KILL_EVERYTHING FROM information_schema.processlist;
这条语句将返回一个名为 KILL_EVERYTHING 的字段,其中包含多个 "KILL" 命令,用于结束当前活动的 MySQL 进程。 - leerssej