解决Message cannot connect to Mysql server的问题?
问题:后台内容进行全部整体更新的时候会出现此错误 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的原因》
本文地址:http://www.45fan.com/dnjc/19532.html