我最近一直在我的服务器上得到这些错误:
mysql_connect() [function.mysql-connect ]: Can't connect to MySQL server on 'xxx.xxx.xxx.xxx' (4)
我不认为这是一个凭证问题,因为用户名,密码,主机IP和数据库名称都是从平面文件configuration中读取并存储在一个PHP常量中。 另外我的错误日志告诉我,使用的凭据实际上是configuration中的。
我试图谷歌这一点,并指出我max_connections问题。 该网站仍处于testing阶段,并发用户数不超过10.我max_connections的值,它是在2048
MySQL版本是5.0.91,服务器是Gentoo Linux( version_comment说的)。 套接字文件位于/var/run/mysqld/mysqld.sock ,端口为3306
真正困扰我的是这个错误似乎是间歇性的。 当我试图重现它时,我实在无法理解它。 有人从一个站点说,错误索引(4)意味着中断的系统调用。
这是否意味着我可以将错误视为我的虚拟主机中的错误而不是我的PHP脚本?
试着看看你是否没有超出最大打开文件的限制键入dmesg和观看“太多打开的文件”错误。
如果您正在使用它,则必须通过使用以下语句更改/etc/security/limits.conf来增加系统固定的限制:
mysql soft nofile 2048 mysql hard nofile 4096
其中2048和4096是用户“mysql”可以打开的最大文件数。 (这包括所有的文件描述符,如套接字)
你可以通过使用mysql_error()和mysql_errno()函数进一步挖掘,但是从我所知道的来看,你的假设是正确的。
作为一个短的错误修正(我通常在我的web应用程序中实现)是两秒钟后重新连接logging:
$i = 0; if ($i < 3 && ($db = mysql_connect(...)) == false) { trigger_error('Could not connect to ...', E_USER_WARNING); $i++; sleep(2); } if (!$db) die('Could not connect to ... for 3 times with a 2 second dely - giving up');
由于该网站stream量较低,因此可以考虑在服务器上运行一个tcpdump文件,并configurationphp脚本,以便在连接失败时向您发送警告。 通过tcpdump文件复制到本地机器,并通过wireshark分析连接失败。
你也应该检查你的系统上的mysql-daemon日志和系统日志,在exception发生的时候。
请注意,logging您的stream量会loggingstream量的所有内容,包括密码和其他敏感信息,因此可能违反公司政策或法律。 停用日志logging后,应该清除tcpdump文件,不要让任何敏感信息留在服务器上,并通过ssh或任何其他适当的encryption连接传输文件。
如果您的连接stringref的服务器节点名称并要求DNS,请确保它不是中间缓慢的DNSparsing导致连接尝试超时。 如果适用,使用本地主机。 运行本地DNS(如果适用)。 LMHOSTS文件中的短路(如果适用)。 完全消除对DNS的需求,并在适当的情况下指定IP地址。 无论是否需要不依赖外部有时缓慢DNS连接string中的服务器名称查找。
有时连接string没有错; 有时,DNSparsing是间歇性的太慢。 这可能是间歇性连接问题的一个原因。
例如:假设你有一个托pipemysql和apache的云实例,但是有时你在本地devo机器上运行站点。 因此,在连接string中,您使用完整的服务器节点名称,因此该网站可以从部署网站或您的devo计算机上“运行”。 可能是这种情况,它永远不会在你的devo机上失效(因为你的devo机DNS总是shiny的),但是你在部署的站点上会出现间歇性的连接问题(因为即使mysql实例是共址的,你的连接string仍然需要要把DNSparsing回自己,但是你的云实例上的DNS有时候不那么光鲜,有点疯狂,因为在部署的实例中,mysql实例实际上是本地的,但实际上并不是实际上甚至是点 – ,所有负载条件下的devo机器DNS响应时间与云实例上的相同,所以在云实例上尽可能简单,即使这样,错误也不会是“DNS太慢”是根本原因。