mysql_connect() : Too many connections-数据库连接数过多
早上正是网站访问的高峰时,突然访问不了了,还好我及时发现,数据库连接不上了,报出了:
Warning: mysql_connect() [function.mysql-connect]: Too many connections in …/conn.php on line 6 cannot connect
的错误。用远程查看服务器,mysql进程已经占了CPU的99%了,mysql的也登陆不进去了。
当时马上判断是数据库连接数过多了,最快的办法就是重启服务器,所以我立刻做了:
1.通知托管商重启服务器(马上联系了托管,说了又得抱怨了,起个服务器他们既然拖了半个多小时);2.马上修改代码,屏蔽掉错误提示,因为这个错误提示已经把我们网站的代码路径显示出来了。
重启服务器后网站恢复了正常,后来我查找原因,用mysqldumpslow -s c -t 20 mysql-slow.log查慢查询,找慢查询的语句,这时才发现我们网站的mysql慢查询日志没有开启,所以我没法通过日志知道到底是哪些sql查询比较耗资源和耗时间;对于这次问题,我的分析是:1.9点到11点之间是一天内我们网站受访的一个高峰,这个高峰本来数据库操作就比较 多,再加上今天这个时刻我再后台添加和修改新闻,这么多数据操作中任何一个低效率的sql语句都有可能导致数据库操作的死锁; 2.当同事们都听说网站访问不了的时候,都在不断地刷新主页,这就更加加重了数据库的负载,这个时候CPU的mysql进程达到了99%,有个 时间降到了80%,但大家还都在不断的刷新主页,负载又升到了99%;3.代码里的sql查询语句可能有一些是低效率的;4. 服务器上目前放在几个网站,其中主站、sns的数据库操作比较频繁,当数据库操作频繁时,都有可能造成一些sql查询死锁,当死锁量一多起来后,服务器的 压力将非常大。
解决办法:1.如何优化数据库访问是任何一个拥有相对比较多的数据库操作的网站所要面临 的问题,这是我们网站第一次碰到这个问题,所以还有待观察和分忻;2.检查代码里的sql语句,优化低效率的sql查询(目前我只 能检查主站的,sns网站上的由于时间和精力无法一一检查)3.开启mysql慢查询日志,这个需要何老师来做,在 mysql的配置文件my.cnf里添加
log-slow-queries=/var/lib/mysql/slowquery.log long_query_time=2 |
第一行是慢查询日志的存放路径,第二行是查询超过2秒才记录
4.如果以后还继续发生这类 事件,咱们可以减少 apache的连接数和mysql的连接数,目前咱们的网站不算大,apache和mysql的连接数分别是150和100,连接数都不算多,如果以后还 继续发生这类事件就需要调的更少。
以上是我对mysql连接数过多导致死锁过多问题的暂时解决办法,希望更多的人提出有益的建议和方法。