您的位置:首页 > 数据库 > MySQL

清理mysql的sleep链接

2015-07-02 16:39 671 查看

清理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 proccesses

Why persistent connections are bad

更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: