MySQL Sleep进程

MySQL中查询当前的连接数:

mysql> show status like ‘%Threads_connected%‘;

+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_connected | 27    |
+-------------------+-------+
1 row in set (0.00 sec)

查询最大连接数:

show variables like ‘%max_connections%‘;
set GLOBAL max_connections=800;
flush privileges
也可以修改/etc/my.cnf中的max_connections:
max_connections = 1000

在mysql客户端下执行show processlist可以看到很多sleep的进程,这些进程就是人们常说的死连接,它们会一直保持sleep,直到my.cnf里面设置的wait_timeout这个参数值的时间到了,mysql才会自己杀死它。在杀死它的时候,mysql还会在error-log里面记录一条Aborted connection xxx to db: ‘xxx‘ user: ‘xxx‘ host: ‘xxx‘的日志,用google翻译一下,会得到一个相当强悍的解释"胎死腹中的连接"!

可以通过如下命令查看系统设置的超时时间:

show global variables like ‘%timeout‘;
set global wait_timeout = 10;

那么造成sleep的原因,有三个,下面是mysql手册给出的解释:

  • 客户端程序在退出之前没有调用mysql_close()。(写程序的疏忽,或者数据库的db类库没有自动关闭每次的连接)
  • 客户端sleep的时间在wait_timeout或interactive_timeout规定的秒内没有发出任何请求到服务器. (类似常连,类似于不完整的tcp ip协议构造,服务端一直认为客户端仍然存在(有可能客户端已经断掉了))
  • 客户端程序在结束之前向服务器发送了请求还没得到返回结果就结束掉了. (参看:tcp ip协议的三次握手)

配置MySQL里的参数。超时时间设置。

  • max_connections:

允许的同时客户的数量。负载过大时,你将经常看到 too many connections 错误。已达到最大链接数,所以会出现这种情况。

  • wait_timeout

服务器在关闭连接之前在一个连接上等待行动的秒数,默认数值是28800,即如果没有事情发生,服务器在 8个小时后关闭连接。防止sleep过多而导致出现too many connections。

如果你的sleep进程数在同一时间内过多,再加上其他状态的连接,总数超过了max_connection的值,那mysql除了root用户外,就无法再继续处理任何请求无法与任何请求建立连接或者直接down了。所以,这个问题在大负载的情况下还是相当严重的。如果发现你的mysql有很多死连接存在,首先要先检查你的程序是否使用的是pconnect的方式,其次,检查在页面执行完毕前是否及时调用了mysql_close()。
        还有一个办法,你可以在my.cnf里面加上wait_timeout和interactive_timeout,把他们的值设的小一些,默认情况下wait_timeout的值是8小时的时间,你可以改成1个小时,或半个小时。这样mysql会更快的杀死死连接。防止连接总数超过max_connection的值。或者把max_connection的值设置的更大,不过这样显然不妥,连接的数量越多,对你服务器的压力越大。实际上那些连接都是冗余的,把它们尽快杀死才是上策。

wait_timeout过大有弊端,其体现就是MySQL里大量的sleep进程无法及时释放,拖累系统性能,不过也不能把这个指设置的过小,否则你可能会遭遇到“MySQL has gone away”之类的问题,通常来说,我觉得把wait_timeout设置为10是个不错的选择,但某些情况下可能也会出问题,比如说有一个CRON脚本,其中两次SQL查询的间隔时间大于10秒的话,那么这个设置就有问题了(当然,这也不是不能解决的问题,你可以在程序里时不时mysql_ping一下,以便服务器知道你还活着,重新计算wait_timeout时间).

参见:http://www.blogjava.net/xiaomage234/archive/2010/04/12/318046.html

http://blog.csdn.net/starnight_cbj/article/details/4492555

时间: 2024-12-28 00:47:20

MySQL Sleep进程的相关文章

shell命令批量杀死MySQL连接进程

(1)将所有的MySQL连接进程杀掉 for i in `mysql -uroot -pzhangyun -Bse "show processlist" | grep -v "show processlist" | awk '{print $1}'` do mysql -uroot -pzhangyun -e "kill $i" done 注:这里将自身命令的show processlist进程过滤掉 (2)删除指定用户的连接进程 for i i

mysql show processlist 显示mysql查询进程

1.进入mysql/bin目录下输入mysqladmin processlist; 2.启动mysql,输入show processlist; 如果有 SUPER 权限,则可以看到全部的线程,否则,只能看到自己发起的线程(这是指,当前对应的MySQL帐户运行的线程). 得到数据形式如下(只截取了三条): mysql> show processlist; +-----+-------------+--------------------+-------+---------+-------+----

批量kill mysql processlist进程

如果大批量的操作能够通过一系列的select语句产生,那么理论上就能对这些结果批量处理.但是mysql并没用提供eval这样的对结果集进行分析操作的功能.所以只能现将select结果保存到临时文件中,然后再执行临时文件中的指令.具体过程如下: mysql> SELECT concat('KILL ',id,';') FROM information_schema.processlist WHERE user='root';+------------------------+| concat('K

杀掉MYSQL死锁进程

vi /usr/local/killmysqlprocess.sh #!/bin/bash #*/1 * * * * /usr/local/src/killmysqlprocess.sh backdir="/usr/local/logs/" logfile="cms_mysql_killprocess_$(date +"%Y%m%d").log" mysqlbindir="/usr/local/mysql/bin/" #use

mysql 1067 进程意外终止 无法启动

查看日志 data/XXX.err 发现如下错误 [ERROR] InnoDB: Attempted to open a previously opened tablespace. Previous tablespace mysql/innodb_index_stats uses space ID: 2 at filepath: .\mysql\innodb_index_stats.ibd. Cannot open tablespace mydatabase/blackboard which u

杀MYSQL SLEEP进程

#!/bin/bashpasswd=""for id in `mysql -uxsjwslm_js -p$passwd -e "show processlist"|awk '/Sleep/{print $1}'`domysql -uxsjwslm_js -p$passwd -e "kill $id"echo `date +"%F %T"` "kill $id" >> ar/log/mysql_k

mysql sleep进程过多,应用级配置

<property name="hibernateProperties"> <props> <prop key="hibernate.dialect"> <!-- org.hibernate.dialect.MySQLDialect --> <!-- 解决No Dialect mapping for JDBC type: -1 --> framework.utils.MySQLDialect </pr

MySQL中进程显式%的情况分析

今天我一个朋友问我一个问题,通过show processlist看见一个%百分号,例: 这种情况是由于执行存储过程造成的,示例如下: DELIMITER $$ USE `test`$$ DROP PROCEDURE IF EXISTS `test`$$ CREATE DEFINER=`admin`@`%` PROCEDURE `test`() BEGIN SELECT SLEEP(60); END$$ DELIMITER ; 存储过程定义的执行账号的权限是%任意主机,所以执行存储过程就会看见%百

查看/杀死mysql进程

首先以管理员身份打开cmd命令行窗口,注意是管理员身份,不然无权限访问. 查看mysql进程 1)输入命令“tasklist| findstr "mysql"”,用于查找mysql的残留进程. 杀死mysql进程2)输入命令“taskkill/f /t /im mysqld.exe”,杀死MySQL进程 就可以将mysql残留进程全部杀死了. 当发现没杀死mysql进程时,可反复多次操作,一般就会成功 原文地址:https://www.cnblogs.com/zhishifx/p/12