首页 文章

Shell脚本自动杀死mysql睡眠进程

提问于
浏览
12

我们如何杀死mysql睡眠过程喜欢:

+------+-----------+-----------+------------------------+---------+------+----------------+-------------------------------------------------------------------------------------------+
| Id   | User      | Host      | db                     | Command | Time | State          | Info                                                                                      |
+------+-----------+-----------+------------------------+---------+------+----------------+-------------------------------------------------------------------------------------------+
| 2477 | stageuser | localhost | jj_production_11102013 | Query   |    0 | end            | SELECT * FROM wp_comments WHERE blog_id = 1071 ORDER BY comment_date_gmt DESC LIMIT 0, 50 |
| 3050 | stageuser | localhost | jj_production_11102013 | Query   |    0 | Sorting result | SELECT * FROM wp_comments WHERE blog_id = 1071 ORDER BY comment_date_gmt DESC LIMIT 0, 50 |
| 3052 | stageuser | localhost | jj_production_11102013 | Sleep   |  336 |                | NULL                                                                                      |
| 3056 | stageuser | localhost | NULL                   | Query   |    0 | NULL           | show processlist                                                                          |
| 3057 | stageuser | localhost | jj_production_11102013 | Sleep   |  301 |                | NULL                                                                                      |
| 3058 | stageuser | localhost | jj_production_11102013 | Sleep   |  299 |                | NULL                                                                                      |
| 3059 | stageuser | localhost | jj_production_11102013 | Sleep   |  298 |                | NULL                                                                                      |
| 3061 | stageuser | localhost | jj_production_11102013 | Sleep   |  273 |                | NULL                                                                                      |
| 3068 | stageuser | localhost | jj_production_11102013 | Sleep   |  251 |                | NULL                                                                                      |
| 3072 | stageuser | localhost | jj_production_11102013 | Sleep   |  233 |                | NULL                                                                                      |
| 3111 | stageuser | localhost | jj_production_11102013 | Sleep   |    1 |                | NULL                                                                                      |
+------+-----------+-----------+------------------------+---------+------+----------------+-------------------------------------------------------------------------------------------+
11 rows in set (0.00 sec)

这个睡眠过程会影响网站性能,就像其他查询速度慢吗

4 回答

  • 2

    我做到了 .

    创建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作业 .

  • 0

    Vishal 's answer works well if you'在MySQL服务器上运行该命令,但它赢得了't work if you'远程连接到服务器,或者如果您没有权限运行SOURCE或 SELECT ... INTO OUTFILE (例如,亚马逊's RDS). It'可能会重写它不依赖于这些功能虽然,然后它可以在任何地方工作:

    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 "%"
    
  • 10

    语法是:

    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';
    

    来自here

  • 5

    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

相关问题