以暴制暴,干掉mysql sleep线程

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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,必须同时设置这两个参数才生效。

1
2
set global interactive_timeout=120
set global wait_timeout=120

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

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

也可以根据用户名等查询

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

写成脚本批量kill这些session

1
2
3
4
5
6
7
8
9
#!/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的配置文件里。

----------------本文结束 感谢阅读----------------