清理mysql的sleep链接
— 单mysql虽然生产环境用的不多,但还是很有用的哦, 我来整理篇博客,哈哈, 前半描述部分是摘抄于前同事:
前言
我们通过show processlist可以看到Command 列为sleep的连接,sleep表示正在等待客户端发送请求. 另外, 可以查看连接数设置的最大值,连接数可能超出设置值.
数据库在默认情况下,sleep超时时间一般会默认为8小时,8小时后mysql会把这些sleep连接从连接池中剔除,下次业务则需重连。可以根据业务情况,是否有超过8小时就已导致前端访问缓慢了.
提前总结
造成睡眠连接过多的原因?
1. 使用了太多持久连接(个人觉得,在高并发系统中,不适合使用持久连接)
2. 程序中,没有及时关闭mysql连接
3. 数据库查询不够优化,过度耗时。
当然,更根本的方法,还是从以上三点排查:
1. 程序中,不使用持久链接,即使用mysql_connect而不是pconnect
2. 程序执行完毕,应该显式调用mysql_close
3. 只能逐步分析系统的SQL查询,找到查询过慢的SQL,优化之
脚本分享
- SHELL版
- PHP版
SHELL版
#It is used to kill processlist of mysql sleep
#!/bin/sh
MYSQLDIR=/usr/local/mysql/bin
MYSQLTOOL=$MYSQLDIR/mysql
MYSQLUSER=myadmin
MYSQLPASS="password"
usage()
{
echo "Usage: $0 ip port db_user"
echo "Example: $0 1.1.1.1 3306 db_user"
exit
}
if [ $# -ne 3 ];then
usage
fi
hostip=$1
port=$2
user=$3
sleepid="SELECT ID FROM information_schema.PROCESSLIST t WHERE t.COMMAND='Sleep' and user='$3' and time >1000;"
echo $sleepid
$MYSQLTOOL -h$hostip -u$MYSQLUSER -p$MYSQLPASS -P$port -e "$sleepid" >sleepIDs
while read sID
do
echo $sID
$MYSQLTOOL -h$hostip -u$MYSQLUSER -p$MYSQLPASS -P$port -e "kill $sID"
done<sleepIDs
PHP版
<?php
define('MAX_SLEEP_TIME', 1000);
$hostname = "ip:port";
$username = "username";
$password = "password";
$connect = mysql_connect($hostname, $username, $password);
$result = mysql_query("SHOW PROCESSLIST", $connect);
while ($proc = mysql_fetch_assoc($result)) {
if ($proc["Command"] == "Sleep" && $proc["Time"] > MAX_SLEEP_TIME) {
@mysql_query("KILL " . $proc["Id"], $connect);
}
}
mysql_close($connect);
?>
参考资料
Kill mysql sleep proccessesWhy persistent connections are bad更多
时间: 2024-09-20 09:35:17