45fan.com - 路饭网

搜索: 您的位置主页 > 电脑频道 > 电脑教程 > 阅读资讯:解决Message cannot connect to Mysql server的问题?

解决Message cannot connect to Mysql server的问题?

2015-08-31 18:45:50 来源:www.45fan.com 【

解决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
Tags: Can not Message
编辑:路饭网
关于我们 | 联系我们 | 友情链接 | 网站地图 | Sitemap | App | 返回顶部