以暴制暴,干掉mysql sleep线程

程序mysql连接处理的不够好,造成了巨多mysql连接,动不动就10000+搞的我们运维很紧张(绝大部分是sleep)。一直催大神们优化mysql的连接问题,同时我们也要有临时解决问题的方法,有mysql大神助攻感觉挺好。
1、查看mysql的总连接数:

select count(*)'连接数' from information_schema.processlist;

2、再设置下mysql的session超时时间,默认是8小时,后来是1500s,现在sleep的线程太多了,将超时时间设置成合理的值,这里设置成120s。

show global variables like "%timeout%";
+----------------------------+----------+
| Variable_name              | Value    |
+----------------------------+----------+
| connect_timeout            | 10       |
| delayed_insert_timeout     | 300      |
| innodb_lock_wait_timeout   | 50       |
| innodb_rollback_on_timeout | OFF      |
| interactive_timeout        | 1500      |
| lock_wait_timeout          | 31536000 |
| net_read_timeout           | 30       |
| net_write_timeout          | 60       |
| slave_net_timeout          | 3600     |
| wait_timeout               | 1500      |
+----------------------------+----------+

设置成120s,必须同时设置这两个参数才生效。

set global interactive_timeout=120
set global wait_timeout=120

3、设置超时时间只对新的session生效,之前的不会释放,需要手动kill
查询120s以上session 的id,排除不必要系统session。

select id from information_schema.processlist where time>120 and user<>'system user' and command <>'Binlog Dump' and command ='Sleep';

也可以根据用户名等查询

select id  from information_schema.processlist where time>120 and user='xxxxxuser' and command='Sleep'

写成脚本批量kill这些session

#!/bin/bash

s=`mysql -h 127.0.0.1 -P3306 -p’xxxxxx' -e "select id  from information_schema.processlist where time>120 and user='xxxxxxuser' and command='Sleep'"`

for i in $s
do
    echo $i
    mysql -h 127.0.0.1 -P3306 -p'xxxxxx' -e "kill $i"
done

然后整个世界就安静了,记得将更改的参数写到mysql的配置文件里。
文章出处:以暴制暴,干掉mysql sleep线程

发表评论:

你的电子邮件地址将不会被公开.

73 − 68 =