MySQL为什么会有一大堆在Sleep的进程?

作者&投稿:方黄 (若有异议请与网页底部的电邮联系)
MySQL为什么会有一大堆在Sleep的进程?~

以前我一直认为,当php的页面执行结束时,会自动释放掉一切。相信很多人都跟我想的一样。但事实证明并不是这样。比如session就不会随着页面执行完毕而释放。php的垃圾回收机制,其实只针对于php本身。对于mysql,php没权利去自动去释放它的东西。如果你在页面执行完毕前不调用mysql_close(),那么mysql那边是不会关闭这个连接的。如果你是用的是pconnect方式,即使你在页面执行完毕前调用mysql_close(),也无法另mysql关闭这个连接。也许在负载低的情况下,你感受不到有何不妥。下面我就来解释这两天我观察出的现象:在php中使用pconnect方式建立连接,然后到mysql客户端下执行show processlist;如果你的负载到一定程度的话,你可以看到很多sleep的进程,这些进程就是人们常说的死连接,它们会一直保持sleep,直到my.cnf里面设置的wait_timeout这个参数值的时间到了,mysql才会自己杀死它。在杀死它的时候,mysql还会在error-log里面记录一条Aborted connection xxx to db: 'xxx' user: 'xxx' host: 'xxx'的日志,用google翻译一下,会得到一个相当强悍的解释"胎死腹中的连接"!那么造成sleep的原因,有三个,下面是mysql手册给出的解释:1.客户端程序在退出之前没有调用mysql_close().2.客户端sleep的时间在wait_timeout或interactive_timeout规定的秒内没有发出任何请求到服务器.3.客户端程序在结束之前向服务器发送了请求还没得到返回结果就结束掉了.上面是我根据google的翻译改了下,可能有某些地方翻译的不准确。原文请见下面:1 The client program did not call mysql_close() before exiting.2 The client had been sleeping more than wait_timeout or interactive_timeout seconds without issuing any requests to the server.3 The client program ended abruptly in the middle of a data transfer如果你的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的值设置的更大,不过这样显然不妥,连接的数量越多,对你服务器的压力越大。实际上那些连接都是冗余的,把它们尽快杀死才是上策。以前总是说,在使用php连接mysql的时候,尽量不要使用pconnect的方式,看完我上面所说的那些,应该可以明白为什么了吧,因为我们使用php大多数情况下都是做web开发,web开发是面向多用户,那么用户的数量与mysql连接数是成正比的。使用pconnect的方式,即使你的调用mysql_close()也是无法释放数据库连接的,那么mysql中的死连接的数量就会越来越多了。我认为,只有当你的应用属于那种点对点方式,或者你能保证连接数量很少的情况,才有必要去采用pconnect的方式,因为连接数量少,那么让它一直处于连接状态,避免了重复打开关闭的过程。这样可能会比传统方式更好一些。至于何时该去调用mysql_close(),最正确的做法是如果下面不再执行mysql的操作了,在你上一次执行完mysql操作后,立刻就调用mysql_close()。这才是最正确的做法,并不是总要把mysql_close()写在页面最后一行就可以了。

做读写分离,加集群做负载均衡
主库集群单独负载,用于写入数据,从库集群负责读取和查询
主从自动同步

以前我一直认为,当php的页面执行结束时,会自动释放掉一切。相信很多人都跟我想的一样。但事实证明并不是这样。比如session就不会随着页面执行完毕而释放。
php的垃圾回收机制,其实只针对于php本身。对于mysql,php没权利去自动去释放它的东西。如果你在页面执行完毕前不调用mysql_close(),那么mysql那边是不会关闭这个连接的。如果你是用的是pconnect方式,即使你在页面执行完毕前调用mysql_close(),也无法另mysql关闭这个连接。
也许在负载低的情况下,你感受不到有何不妥。下面我就来解释这两天我观察出的现象:
在php中使用pconnect方式建立连接,然后到mysql客户端下执行show processlist;如果你的负载到一定程度的话,你可以看到很多sleep的进程,这些进程就是人们常说的死连接,它们会一直保持sleep,直到my.cnf里面设置的wait_timeout这个参数值的时间到了,mysql才会自己杀死它。在杀死它的时候,mysql还会在error-log里面记录一条Aborted connection xxx to db: 'xxx' user: 'xxx' host: 'xxx'的日志,用google翻译一下,会得到一个相当强悍的解释"胎死腹中的连接"!
那么造成sleep的原因,有三个,下面是mysql手册给出的解释:
1.客户端程序在退出之前没有调用mysql_close().
2.客户端sleep的时间在wait_timeout或interactive_timeout规定的秒内没有发出任何请求到服务器.
3.客户端程序在结束之前向服务器发送了请求还没得到返回结果就结束掉了.
上面是我根据google的翻译改了下,可能有某些地方翻译的不准确。原文请见下面:
1 The client program did not call mysql_close() before exiting.
2 The client had been sleeping more than wait_timeout or interactive_timeout seconds without issuing any requests to the server.
3 The client program ended abruptly in the middle of a data transfer
如果你的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的值设置的更大,不过这样显然不妥,连接的数量越多,对你服务器的压力越大。实际上那些连接都是冗余的,把它们尽快杀死才是上策。
以前总是说,在使用php连接mysql的时候,尽量不要使用pconnect的方式,看完我上面所说的那些,应该可以明白为什么了吧,因为我们使用php大多数情况下都是做web开发,web开发是面向多用户,那么用户的数量与mysql连接数是成正比的。使用pconnect的方式,即使你的调用mysql_close()也是无法释放数据库连接的,那么mysql中的死连接的数量就会越来越多了。
我认为,只有当你的应用属于那种点对点方式,或者你能保证连接数量很少的情况,才有必要去采用pconnect的方式,因为连接数量少,那么让它一直处于连接状态,避免了重复打开关闭的过程。这样可能会比传统方式更好一些。
至于何时该去调用mysql_close(),最正确的做法是如果下面不再执行mysql的操作了,在你上一次执行完mysql操作后,立刻就调用mysql_close()。这才是最正确的做法,并不是总要把mysql_close()写在页面最后一行就可以了。


...MYSQL在读写时会自动给表或者行加锁,那为什么还会出现所谓的并发问题...
我理解的是:读表的锁表是指在读的过程中上锁,不允许中途还insert其他记录,当读表完毕,获得select结果后,表就解锁了,可以继续新的select或insert等操作。例子里:2人同时借钱,没有业务锁的话,两个请求发到后端后可能同时去select,此时2次借款操作select余额都是1000(在另一人借200后回写余额...

在mysql中为什么我把varchar转为float会出错?
首先,打开数据库管理工具NavicatPremium,新建一个表结构,特别地,将age列设置为varchar类型,以模拟实际操作环境。接着,为这个新表填充一些数据,这有助于我们理解问题的具体表现。在处理少量数据时,可以尝试直接使用sum()函数进行求和。在SQL中,这个函数会自动识别数据类型,对于较小规模的数据,这种...

为什么桌面有时候会弹出MySql的CMD命令
1、像是Mysql安装失败后在重启运行的选项里它一直存在 2、或者有其它程序正常运行需要连接及安装Mysql数据库

在什么场景下,你会选用mysql做为数据库,什么场景下,会选用oracle做为数...
场景?这个词很内涵- - mysql首先它是免费,支持数据量也不小,一般对于小型网站,数据量不大,最多几万条的,采用MYSQL 而ORACLE则是大型数据库,数据量支持达到上亿,对于大型公司,企业的系统就采用ORACLE,比如电信啊`银行啊`数据量大`所以用这个`...

mysql 为什么有些字段首字母是大写的在插入时会变成小写?
这跟数据库本身的属性有关,比如数据库的连接字符集、数据库编码字符集等等,如果你选的是utf8_general_ci字符集,这种编码是不区分大小写的,即字母A跟a是没有区别的。

原因为什么MySQL不会存储视图而只是用查询语句来创建它们mysql不存放视图...
那么,为什么MySQL不会像表一样存储视图呢?1.提高性能 如果MySQL将视图存储在数据库中,那么每次更新表时都需要更新对应的视图。对于大型数据库来说,这将是一个非常耗时的操作,严重影响性能。而将视图定义存储在数据库中,每次查询时只需要重新执行SQL语句,可以提高查询效率,减少对数据库的压力。2....

为什么mysql select * from 会有语法错误
把你的具体sql语句发上来,假如你只是select from 这样去查询的话肯定会错,因为你都没有指定要查询的表

为什么安装mysql会出现start service错误
注册表中有关MySQL的东西可能删除的不彻底,ctrl+F查找mysql,之后用F3循环查找,将有关MySQL这个软件的全部有关项删除 注意(删除项时出错):无法删除 LEGACY_MYSQL51(自己建数据库时置的用户名): 删除项时出错。解决办法:注册表项里右键增加administrators所有权限 之后打开360安全卫士或金山卫士清理一下注册...

默认情况下,在安装MySQL数据库系统时会自动安装MySQL
会。在安装MySQL时,会自动安装一个名为mysql的数据库,该数据库中的表都是权限表。关于安装mysql数据库后系统自动创建的数据库的相关内容,安装mysql数据库后系统会自动创建安装数据库,统一默认安装在一个目录中。

移动云数据库MySQL为什么有时候备份任务会失败?
可能是遇到了网络环境不稳定、实例状态异常、参数修改异常等情况,都会导致自动备份出现失败,此时需要进行手动备份,才可以保障数据的安全。如果在备份过程中,执行了DDL操作⌄就会锁表,也会导致备份失败。

丰镇市18570278554: MySQL为什么会有一大堆在Sleep的进程? -
葛肿爱汝: 以前我一直认为,当php的页面执行结束时,会自动释放掉一切.相信很多人都跟我想的一样.但事实证明并不是这样.比如session就不会随着页面执行完毕而释放. php的垃圾回收机制,其实只针对于php本身.对于mysql,php没权利去自动去...

丰镇市18570278554: 怎样能健康的减肥.
葛肿爱汝: 1、食物采购大变身: 如果家里还有一堆不太健康的零食,或是家里基本已经弹尽粮绝,你首要做的就是去买吃的.听上去挺让人高兴的对吧,减肥不要先想着饿肚子,而是应当想着怎么吃会比较健康.如果这一周会比较忙,就采购一周的食物...

丰镇市18570278554: 如何将一大堆的后缀为.frm、.opt、.myi、myd的MySql数据文件导入到mysql数据库中 -
葛肿爱汝: 在你的MYSQL的数据文件夹下(往往可能是MYSQL安装文件夹的DATA下)新建立一个文件夹作为数据库名,然后把这些文件拷贝到那个数据库文件夹下就可以了.MYSQL里面使用MYISAM数据引擎的情况下,DATA文件夹下一个数据库就是一个文件夹,例如你建立了文件夹DATA\abc,就表示有一个叫做abc的数据库.一个表对应三个文件,你上面的文件拷贝到DATA\abc下,就有了admin、bbs_main、bbs_ref几个表.

丰镇市18570278554: 每次链接数据库都打印一大堆日志,如何去掉 -
葛肿爱汝: 简单恢复模式下 使用backup log with NO_log是否没有意义? 1.清空日志 DUMP TRANSACTION 库名 WITH NO_LOG 2.截断事务日志: BACKUP LOG 数据库名 WITH NO_LOG 3.收缩数据库文件(如果不压缩,数据库的文件不会减小 企业管...

丰镇市18570278554: 配置 sql2005 网络配置 tcp/ip属性,怎么会有一大堆IP地址…… -
葛肿爱汝: 你点开看一下,只有一个IP地址是类似123.123.123.133这样的,配置这个就可以了.

丰镇市18570278554: 用c++制作软件时为什么不会出现dll文件,但是我们安装软件有一大堆的dll -
葛肿爱汝: 首先,你自己写的软件也是有动态库依赖的,只不过这些DLL文件是系统,在系统目录中,不是在应用程序目录下,程序在运行时,系统会自动到系统目录去找这些动态库,因此,看起来好像完全没有依赖DLL.很多软件会有DLL,大概有以下两个原因:1 我们安装的软件中,很大一部分是有引用别的动态库,这些库是别人已经编译好,不用重新编译了,或者是没有代码,没办法直接编译成软件的一部分2 编程的抽象化,就是将所有业务代码封装成一个个的DLL,而应用程序只是个入口,根据需要来加载不同的动态库

丰镇市18570278554: 为什么刚才会自动弹出一大堆的命令提示符窗口? -
葛肿爱汝: 你有没有随便删除过什么文件致使程序加载不成功.还有就是中毒了,到安全模式里全面扫描一下.再不成你就重装一下系统,到DOS里完全格式化所有磁盘分区,然后重装.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网