据我所知,这是最近在我的本地服务器上开始发生的错误:
Can't connect to MySQL server on 'localhost' (10048).
我的网站可以运行一段时间,然后它会随机抛出此错误,然后再次开始运行。有什么关于如何修复此问题的建议吗?我在网上搜索过,大多数人都声称这是一个基于 Windows 的错误,需要修复注册表,但我想看看是否有其他人遇到过此问题并有更好的建议?谢谢!
答案1
我建议在出现此错误时查看“netstat -ano”的输出。如果这是 Windows Server 2003,则默认的临时端口范围只有 1024-5000。如果此端口范围已满,您将无法建立新的出站连接,包括“出站”到本地主机。您可以通过更改注册表中的 MaxUserPort 设置来解决这个问题,如果 netstat 显示您有大量处于 TIME_WAIT 状态的连接,则可能还要更改 TCPTimedWaitDelay 设置。'netstat -ano |find /C ":"' 将为您提供(有点误导性的)活动套接字数。
但是,如果您发现此端口范围全部被使用,如其他人所述,则可能存在连接未关闭的潜在问题。这可能是代码问题。
此外,如果您的 Web 服务器和数据库服务器在同一台机器上运行,您可能需要考虑除 TCP/IP 之外的连接协议,例如内存或命名管道。
答案2
感谢 jlupolt 的帖子,它准确地指出了解决我所面临的问题的关键。
一些高曝光率的横幅广告在短时间内(几小时)为我们的网站带来大量流量,并且随机(并非总是)出现“无法连接到 MySQL 服务器...”错误。
这段时间内db server的内存使用率和CPU负载还是很低的,mysql server的打开连接数也远低于其max_connections的限制,所以应该不是mysql的问题。
按照 jlupolt 的建议,我们发现 Web 服务器(不是数据库服务器,在我们的例子中是另一台机器)的默认临时端口范围(1024~5000)全部处于 TIME_WAIT 状态。进一步搜索后,我们发现了此页面:
B.5.2.2.1. 在 Windows 上连接 MySQL 服务器失败 http://dev.mysql.com/doc/refman/5.1/en/can-not-connect-to-server.html
将 MaxUserPort 提高到 20000 并将 TcpTimedWaitDelay 降低到 20(需要重新启动)后,连接错误从未发生过。我们使用的 MaxUserPort 和 TcpTimedWaitDelay 值可能不是最适合您的情况的。这些值取决于 tcp/ip 连接数的增长速度,并且该组合应允许足够数量的新连接和释放未使用连接的时间。
答案3
解决方案:
打开注册表编辑器regedit
TcpTimedWaitDelay 设置:
找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters
注册表子项并创建一个名为 的新 REG_DWORD 值TcpTimedWaitDelay
。
将此值设置为十进制的 30,十六进制的0×0000001e
。此值将等待时间为 30 秒。
默认值:0xF0
(16229),等待时间设置为 240 秒。
MaxUserPort设置(增加最大端口连接):
找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters
注册表子项,新建一个名为 的 REG_DWORD 值MaxUserPort
。
设置为十进制的最低值 32768。
默认值:5000(十进制)。
关闭注册表编辑器,然后重新启动Windows系统。
答案4
最近出现了一些“本地主机”问题。
查看 /etc/hosts 并确保您有一个未被推荐的本地主机条目(例如:)127.0.0.1 localhost
- 一些较新的 Linux 版本(和 Windows 7)最近已停止了此功能。
此外,值得检查的是,您是否将 SQL 绑定到环回和实际 IP 地址,并尝试在那里访问它。