13

我们如何杀死 mysql 睡眠进程如:

+--------+-----------+------------+------ ------+---------+------+----------------+--------- -------------------------------------------------- --------------------------------+
| 身份证 | 用户 | 主持人 | 分贝 | 命令 | 时间 | 状态 | 信息 |
+--------+-----------+------------+------ ------+---------+------+----------------+--------- -------------------------------------------------- --------------------------------+
| 第2477章 舞台用户 | 本地主机 | jj_production_11102013 | 查询 | 0 | 结束 | SELECT * FROM wp_comments WHERE blog_id = 1071 ORDER BY comment_date_gmt DESC LIMIT 0, 50 |
| 3050 | 舞台用户 | 本地主机 | jj_production_11102013 | 查询 | 0 | 排序结果 | SELECT * FROM wp_comments WHERE blog_id = 1071 ORDER BY comment_date_gmt DESC LIMIT 0, 50 |
| 3052 | 舞台用户 | 本地主机 | jj_production_11102013 | 睡眠 | 336 | | 空 |
| 3056 | 舞台用户 | 本地主机 | 空 | 查询 | 0 | 空 | 显示进程列表 |
| 3057 | 舞台用户 | 本地主机 | jj_production_11102013 | 睡眠 | 301 | | 空 |
| 3058 | 舞台用户 | 本地主机 | jj_production_11102013 | 睡眠 | 299 | | 空 |
| 3059 | 舞台用户 | 本地主机 | jj_production_11102013 | 睡眠 | 298 | | 空 |
| 3061 | 舞台用户 | 本地主机 | jj_production_11102013 | 睡眠 | 273 | | 空 |
| 3068 | 舞台用户 | 本地主机 | jj_production_11102013 | 睡眠 | 251 | | 空 |
| 3072 | 舞台用户 | 本地主机 | jj_production_11102013 | 睡眠 | 233 | | 空 |
| 3111 | 舞台用户 | 本地主机 | jj_production_11102013 | 睡眠 | 1 | | 空 |
+--------+-----------+------------+------ ------+---------+------+----------------+--------- -------------------------------------------------- --------------------------------+
11 行(0.00 秒)

这种睡眠过程是否会像其他查询一样影响站点性能?

4

5 回答 5

13

我做到了。

创建 kill_sleep.sh 文件

mysql -u<user> -p<password> -h<host> -e "select concat('KILL ',id,';')  into outfile '/tmp/sleep_processes.txt' from information_schema.processlist where Command = 'Sleep'"
mysql -u<user> -p<password> -h<host> -e "source /tmp/sleep_processes.txt;"
rm -rf /tmp/sleep_processes.txt

并将 kill_sleep.sh 设置为 cron job 。

于 2013-11-18T13:55:21.250 回答
6

如果您在 MySQL 服务器上运行该命令,Vishal 的回答效果很好,但如果您远程连接到服务器或者您没有运行 SOURCE 或SELECT ... INTO OUTFILE(例如 Amazon 的 RDS)的权限,它将无法正常工作。可以重写它以不依赖这些功能,然后它可以在任何地方工作:

mysql -h<host> -u<user> -p -e "SELECT CONCAT('KILL ',id,';') FROM information_schema.processlist WHERE Command = 'Sleep'" > sleep.txt
cat sleep.txt | xargs -I% mysql -h<host> -u<user> -p -e "%"
于 2014-02-23T06:36:54.127 回答
5

语法是:

KILL thread_id

在你的情况下:

  mysql > KILL 3057

但是为了删除所有的睡眠进程,一个命令不能使用,你需要遍历整个进程列表,在获取 tmp 表中的所有进程并循环它之后:

select concat('KILL ',id,';') from information_schema.processlist where Command='Sleep';

select concat('KILL ',id,';') from information_schema.processlist where Command='Sleep' into outfile '/tmp/a.txt';

这里引用

于 2013-11-18T13:00:17.803 回答
0

Percona 工具:

pt-kill --match-command Sleep --idle-time 100 --victims all  --interval 30 --kill

这将找到所有处于“睡眠”状态且空闲 100 秒或更长时间的连接并终止它们。--interval 30 将使其保持每 30 秒执行一次。所以你可以打开一个屏幕 -S ptkill 然后在那个屏幕上运行上面的命令,然后 ctrl-A, D 分离并退出终端,它会继续运行清理你的连接。

https://www.percona.com/doc/percona-toolkit/2.1/pt-kill.html

于 2016-03-16T14:24:54.187 回答
0

一个简单的方法:

for i in `mysql -e "show processlist" | awk '/Sleep/ {print $1}'` ; do mysql -e "KILL $i;"; done
于 2020-08-10T15:14:40.437 回答