连接数过多无法连接到 MySQL 服务器?

连接数过多无法连接到 MySQL 服务器?

今天我的数据库服务器已达到最大连接数,我的 Web 应用程序(在另一台服务器上)显示“连接数过多”错误消息。之后我重新启动了 MySQL 服务器,但出现了新问题。应用程序开始显示另一个错误“无法连接到 (4) 上的 MySQL 服务器‘数据库服务器 IP’”。我可以在本地连接到 MySQL 并运行查询,没有任何问题。我可以从 Web 服务器远程登录到数据库服务器中的端口 #3306。我清除了 MySQL 错误日志文件,然后再次进行了测试,但没有发现任何问题。我重新启动了两台服务器以确保所有连接都被终止,但重新启动服务器后仍然存在相同的问题。网络很好,两台服务器之间没有网络问题,没有数据包丢失,没有延迟,没有错误消息。三个小时后,数据库服务器恢复正常工作!

出现此问题的预期原因是什么?为什么服务器在三个小时后恢复工作?是否有与此相关的超时参数?

 Edit: My application is PHP and web-server is apache2.

答案1

听起来您的开发人员没有在代码中正确关闭连接。在 C# 中,情况应该是这样的:

var cn = new MySqlConnection(" connection string " );
var cmd = new MySqlCommand(" sql string ", cn);

cn.Open():
cmd.ExecuteNonQuery();
cn.Close();

上面的代码从根本上是有缺陷的,因为 SQL 代码中的错误将导致异常,因此永远不会到达关闭连接的代码。相反,他们需要这样写:

MySqlConnection cn;
try
{
    cn = new MySqlConnection(" connection string ");
    var cmd = new MySqlCommand(" sql string ", cn);

    cn.Open():
    cmd.ExecuteNonQuery();
}
finally
{
    cn.Close();
}

实际上,C# 有一些更好的模式,他们应该真正使用。但这也说明了这一点,也适用于其他语言——无论你的平台是什么,客户端代码都会关闭你的数据库连接必须以能够解释例外情况的方式发生。

答案2

也许您可以运行FLUSH HOSTS;

根据http://dev.mysql.com/doc/refman/5.0/en/flush.html

清空主机缓存表。如果某些主机更改了 IP 地址,或者您收到错误消息主机“host_name”被阻止,则应刷新主机表。当在连接到 MySQL 服务器时,给定主机连续发生超过 max_connect_errors 个错误时,MySQL 会认为出现了问题并阻止主机进一步的连接请求。刷新主机表可允许主机进一步尝试连接。请参见第 C.5.2.6 节“主机“host_name”被阻止”。您可以使用 --max_connect_errors=999999999 启动 mysqld 以避免出现此错误消息

我还会考虑降低以下内容:
join_buffer_size
sort_buffer_size
read_buffer_size
read_rnd_buffer_size

并增加 max_connections

相关内容