今天我的数据库服务器达到了最大连接数,我的web应用程序(在另一台服务器上)显示“连接太多”的错误信息。 之后,我重新启动MySQL服务器,但显示一个新的问题。 (4)“上的应用程序开始显示另一个错误”无法连接到MySQL服务器的数据库服务器IP“。 我可以在本地连接到MySQL,运行quires没有任何问题。 我可以从Web服务器telnet到数据库服务器的端口#3306。 我清除了MySQL的错误日志文件,我再次做了testing,但我没有发现任何问题。 我重新启动了两台服务器,以确保所有连接都被终止,但重新启动服务器后仍然存在相同的问题。 networking很好,两台服务器之间没有networking问题,没有丢包,没有延迟,没有错误信息。三个小时后,DB服务器恢复正常工作!
这个问题的预期原因是什么? 为什么服务器在三个小时后重新开始工作? 是否有任何超时参数与此有关?
Edit: My application is PHP and web-server is apache2.
这听起来像你的开发人员没有正确closures代码中的连接。 在C#中,这将是这样的:
var cn = new MySqlConnection(" connection string " ); var cmd = new MySqlCommand(" sql string ", cn); cn.Open(): cmd.ExecuteNonQuery(); cn.Close();
上面的代码基本上是有缺陷的,因为sql代码中的错误将导致exception,因此代码closures您的连接永远不会到达。 相反,他们需要这样写:
MySqlConnection cn; try { cn = new MySqlConnection(" connection string "); var cmd = new MySqlCommand(" sql string ", cn); cn.Open(): cmd.ExecuteNonQuery(); } finally { cn.Close(); }
而实际上C#有一些更好的模式,他们应该真正使用。 但是,这也以适用于其他语言的方式说明了问题 – 无论您的平台如何,closures数据库连接的客户端代码必须以解决exception的方式进行。
也许你可以运行FLUSH HOSTS;
根据http://dev.mysql.com/doc/refman/5.0/en/flush.html
清空主机caching表。 如果某些主机更改了IP地址,或者如果收到错误消息“主机名”被阻止,则应刷新主机表。 当连接到MySQL服务器时给定主机连续发生超过max_connect_errors错误时,MySQL会认为出现了问题,并阻止主机进一步连接请求。 刷新主机表可启用主机的更多连接尝试。 请参见第C.5.2.6节“主机'host_name'被阻止”。 您可以使用–max_connect_errors = 999999999启动mysqld以避免出现此错误消息
我也会考虑降低stream量:
join_buffer_size
sort_buffer_size的值
read_buffer_size
read_rnd_buffer_size
并增加max_connections