清理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 proccessesWhy persistent connections are bad
更多
相关文章推荐
- mysql修改主键
- mysql触发器
- MySQL基础笔记(四) 索引
- MySQL基础笔记(四) 索引
- MYSQL查询语句优化
- c mysql 连接 过程
- MYSQL隔离级别及测试包括脏读,幻读
- java使用jdbc对mysql数据库进行操作的步骤和代码
- MySQL常用命令
- Mysql MERGE引擎简介
- mac下彻底卸载mysql方法
- mysql-5.6.25-winx64免安装配置
- MySQL配置
- mysql修改密码
- ubuntu安装mysql错误处理
- Mysql循环插入百万条数据
- MySQL增加表字'
- Mysql 数据文件&&日志文件 目录地址迁移指南
- mysql 复制和原理
- mysql 过滤