45IT.COM- 电脑学习从此开始!
DIY硬件教程攒机经验装机配置
设计Photoshop网页设计特效
系统注册表DOS系统命令其它
存储主板显卡外设键鼠内存
维修显卡CPU内存打印机
WinXPVistaWin7unix/linux
CPU光驱电源/散热显示器其它
修技主板硬盘键鼠显示器光驱
办公ExcelWordPowerPointWPS
编程数据库CSS脚本PHP
网络局域网QQ服务器
软件网络系统图像安全
页面导航: 首页 > 设计学院 > 网络编程 > 数据库 >

Message:Can not connect to MySQL server的解决办法

电脑软硬件应用网 45IT.COM 时间:2012-08-24 12:59 作者:佚名
问题:后台内容进行全部整体更新的时候会出现此错误 can not connect to mysql server 部分更新的时候不会出错; 判断:mysql服务器在程序连接时出现问题,请求数量过大,服务器承担不起; 解决:将配置文件中改为持久连接 注: wmxx_cn: phpcms/include/config.inc.p

问题:后台内容进行全部整体更新的时候会出现此错误 can not connect to mysql server

          部分更新的时候不会出错;

判断:mysql服务器在程序连接时出现问题,请求数量过大,服务器承担不起;

解决:将配置文件中改为持久连接


注:

wmxx_cn:
phpcms/include/config.inc.php
define('DB_PCONNECT', 0); //0 或1,是否使用持久连接

 

=================以下为第二种解决方案=======================================================================================

 

Can not connect to MySQL server 的解决方案。
问题表现:

Can not connect to MySQL server
Can't connect to MySQL server on 'xxx.xxx.xxx.xxx' (4)


这个问题困扰很长一段时间了,google baidu 都找不到原因,今天沉下心来好好的思考了一翻,有点头绪。

通过 netstat -an 命令,发现在MySQL服务器上产生了大量的 WAIT_CLOSED | ESTABLISHED off 状态的链接。 是突然产生的,没有任何征兆。

因为web 服务器跑的是 fast-cgi php ,fast-cgi php 跟模块化的php不同的是,为了节省资源,fastcgi进程会管理mysql连接资源,fastcgi会与mysql产生一个持久连接,不会在一个php会话结束的时候释放mysql连接,而是将这个链接保存到“连接池”中,在下一个会话到来的时候,直接使用这个链接。

所以经过我初步判断,是连接超时引起的,我所有使用的mysqld 版本是 icc-5.1.39/40 (这两个版本都有这个问题)。尝试修改 /etc/my.cnf,
[mysqld]
wait_timeout = 96400
interactive_timeout=96400 # 这个必须要加上,否则show variables like '%timeout%' 会发现 wait_timeout 一直是 28800

# 96400 是一天的秒数+10000,因为我的mysql服务器每天会有一次冷备份,也就是会重启一次,所以设置的是这个数值。可以设置的更大一些,比如 86400000

接下来重启 mysqld。

应该可以了,观察中。

=================================

2009-12-11 接上面

很不幸,那个问题依然存在,根据朋友的提示做了以下工作:

1. yum update

2. 更新 libevent 库到最新的版本

问题依然存在!

后来查看系统日志 tail -n 1000 /var/log/message 发现有部分 can't open file 'bbs_post.MYD#' 类的字样,还有系统文件数打开数达到上限的提示,突然想到, 可能是MYSQL分区引起的文件打开数过多!


这与之前的一个方案有关系,经过测试,每个表的记录数在50w的时候,根据主键查询速度很快,达到 100w PV 的时候,会下降5-8倍,500w+ 时,根据主键查询一条需要 0.3s 左右(1U 4核 4G 普通服务器)。所以在分区的时候我分的比较小,50W一个区,结果产生了大量的分区文件。而MYSQL在运行时都是打开状态的,所以文件打开数达到了上限,通过 lsof -p 123|wc -l (123 为mysqld pid)可以知道mysqld打开文件数。做如下调整:

做了一个php脚本优化/修复了一下表:

脚本 /root/optimizer_table.php 如下:

<?php

       $dbhost = '192.168.1.1';

      $dbuser = 'dbuser';

      $dbpw = 'dbpw';

      $dbname = 'test';

      system("service nginx stop");
        set_time_limit(0);
        $db = mysql_connect($dbhost, $dbuser, $dbpw);

      
        mysql_select_db($dbname);
        $query = mysql_query('show tables');
        while($row = mysql_fetch_assoc($query)){
                $tablename = $row['Tables_in_'.$dbname];
                mysql_query("optimize table $tablename");
        }
        system("service nginx start");

?>

执行: /usr/local/php/bin/php-cgi /root/optimizer_table.php

ulimit -HSn 65536

另外有可能是PHP的EA加速造成,关闭PHP EA加速。


问题到此解决,到底是mysql分区导致打开文件过多,还是EA,我没有时间去深究,有兴趣的朋友可以试一下,记录下解决过程,供大家参考。

 
==============第三种解决方案==========================


这个是一个连接错误,意思就是告诉你,现在你的MYSQL服务器连接数量已经太多,无法建立新的连接了。


因为mysql默认是100个连接,你要是作为第101个用户去访问,去连接,显然就报错了。

你得修改max_connections,自己去改大一点吧。


更多参考教程《提示Can not connect to MySQL server的原因
顶一下
(6)
42.9%
踩一下
(8)
57.1%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码:点击我更换图片
推荐知识