MySQL-mysql 出現too many connections后,大家都是怎麼解決的呢?
mysql的connection是一個有限的資源,每個connection一個線程,所以不能開太多。 如果出現too many connections 後,大家都有什麼好的方法解決呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
可以使用mysql_pconnect(),同时对于数据库连接部分使用设计模式中的--单态模式,这样可以减少很多连接数,并且速度上也有提升。。。
增加链接池,再根据实际情况调整参数
max_connections可以开大点,但还是有限的,不能无限大。硬伤。
首先可以查查那些慢SQL操作,优化代码,很多情况下是由于SQL查询慢,不能及时释放连接。
一般我们会增加连接池,分库分表设计。尽可能地减少单次SQL操作的时间。
脚本执行完毕的时候,手动关闭连接,尽快释放连接资源。
出现too many connections除了访问量激增的情况下,多半是因为某些SQL引起了拥堵所致,注意根据满查询日志来调优,另外mysql持久链接是鸡肋,多数情况下无济于事,只会节外生枝。
一般这种情况的出现有两种情况
1.业务激增,这个需要根据实际情况分析来进行优化
2.有慢操作阻塞
建议对是否有慢操作进行检查、优化
如果未达到预期目的,再进行加大connection、换机器之类的工作
尽量采用中间件+异步的方式操作数据库,这样可以避免资源方面的限制。
加大最大连接数,减少wait_timeout时间,这个需要实际应用中多尝试
用mysql_pconnect()代替mysql_connect(),减少连接和断开次数
检查耗时的读写sql,针对性的分库分表,读写分离,减少瓶颈库表的压力
复杂的sql语句建议用存储过程代替
补充一下,上面好多兄弟对mysql_pconnect提出了疑问,我建议的初衷是如果频繁与数据库建立连接与断开接连,这种开销会很大,可能会造成大量连接出现CLOSE_TIMEOUT情况出现,导致连接被占用,而mysql_pconnect设计的目的是为了提供一种机制来减少与Mysql服务器建立/断开连接的开销,如果这种方案应用得当可以解决这类问题。当然了,如果mysql持久链接应用不当,比如持久链接使用表锁时,异常情况下会锁表造成其它用户被阻塞,所以这些都得视情况而定,灵活应用,不能一棍子打死
php环境中得mysql持久链接没有意义只会造成 too many connections,所以请关闭mysql持久链接。
以 Linux + Nginx + PHP + MySQL 为例
一般我会从下面几个思路来寻找解决方法
a. 是否 WEB 的连接数就很大
那么可以考虑用 Varnish(或Squid) 来 Cache 一些动态的请求
通过这个步骤来减少这些动态请求对 MySQL 的请求
b. 机器负载是否很高
可以考虑,哪些是静态数据,哪些是不活跃数据,哪些是活跃数据
如果静态数据较小,那么可以试试静态数据直接保存成 PHP 文件
如果较大,可以放在 TTServer 中去
活跃数据的话,可以保存在 Memcache 中,如果需要持久化,也可
以保存在 TTServer 等 NoSQL 中去
c. 是不是有不合格的 SQL 语句在运行
那么可以用 mysqldumpslow 分析 mysql 的slow query log
d. PHP 里的 mysql.pconnect 可能不太好使
那是很久前我用 mysql.pconnect ,容易出现 MySQL 宕机的情况,改为
mysql.connect 后情况好转,其他语言,或现在的 PHP 未必有这个
情况
e. 申请新机器 :)