2009-11-03 113 views
4

我有一个奇怪的问题,使用Zend_Db的PDO适配器来管理我的数据库连接。突然之间,我一直在我的MySQL服务器上达到连接限制。与这个错误每个HTTP请求Zend Framework应用程序没有正确关闭mysql连接

无论出于何种原因,每三四个小时左右,我最终得到这个错误,和Apache胡扯出来:

PHP Fatal error: Uncaught exception 'Zend_Db_Adapter_Exception' with message 'SQLSTATE[00000] [1129] Host 'my.internal.mysql.server.DNS.here' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'' in

奇怪的是,我没有改变了任何代码和流量实际上是从他们过去的情况来看,所以我知道我的应用不应该产生更多的并发连接。最奇怪的是,我在近一周内没有更改任何主要应用程序文件的代码,并且所有内容都从那时起开始顺利运行。

重新启动mysql服务或使用mysqladmin flush-hosts刷新连接确实有用,我确信增加my.cnf中的最大并发连接数也有助于缓解这些问题,但似乎存在这是应用程序自身创建太多连接的核心问题。

有关如何深入了解并关联引起挂起连接的代码段的想法?在外部,网页应用程序的所有不同页面都可以正常加载并且速度很快。

+0

我做了一个艰难的时间决定是否张贴此对ServerFault或这里,但我决定,因为它看起来像一个应用程序问题 – 2009-11-03 01:38:05

回答

4

我认为你的一个脚本运行超长查询或卡住?

最好的解决方案是创建一个记录工具并使用它来知道问题出在哪里。

Zend_Log类应该可以帮助你编写日志记录工具,显然你最好使用文件编写器而不是数据库。由于您的问题与数据库相关,因此您应该创建或修改数据库类以发出一些日志。

我不知道您的项目的体积,但它可能有一些性能副作用

同时玩的MySQL的long query功能可能会给你一些提示。

希望你会找到你的问题在哪里。

1

不知道这是任何对你有用,但此链接给你,你所遇到的问题的(临时)很好的描述,以及一个--max_connect_errors设置,您可以覆盖:

http://developer.spikesource.com/wiki/index.php/Question:mysqladmin_host_blocked_because_of_many_connection_errors

用户也回应,并建议尝试在命令行中执行以下操作:

> mysqladmin -u <user> -p<password> processlist 

这会给你根据现有的MySQL connectio列表ns以了解您当前正在运行的并发连接数。再说一遍,这些都不是解决方案,但希望它们能让你更进一步解决掉线问题。

2

您是否尝试手动关闭连接?这似乎是一个具体问题。

$db->closeConnection(); 

编号: http://framework.zend.com/manual/en/zend.db.adapter.html#zend.db.adapter.closing

15.1.8。关闭连接

+0

我不应该这样做,从这里开始 - 这些连接后应自行关闭他们跑了。 – 2009-11-05 20:48:06

+1

它应该。但他们呢? – Ismael 2009-11-06 00:13:01

+1

嗯,不,显然他们不是 - 但重点是要确定原因,不要在上面写上绷带。 – 2009-11-09 21:54:47

1

我们的Zend应用程序也打开了不少连接。他们倾向于喷发,但我们从未弄清楚发生了什么。我们通过将max_connections设置为高(我们需要其他原因),并将wait_timeout设置为两个小时来解决问题。我们本可以以更低的超时时间离开,但是一旦我们停止看到失败,就不会冒险真正的应用程序。

+0

我最终将max_connections设置为200,但即使如此,它仍然在发生。你最终设置了最大连接数? – 2009-11-11 17:30:18

+0

它目前在950. – eswald 2009-11-11 21:23:28

1

首先我会问:你有没有新的核心转储? (检查Apache的错误日志)。

第二:从我严酷的经历,有太多的数据库连接通常意味着你有太多的apache进程没有正常的生存。通常这是由一些长时间运行的进程,内存锁等引起的。尝试使用strace某些apache进程,并查看它们是否挂起了某些内容或者执行无限循环。

除非你有流量显著上升,你不应该过于许多连接问题的影响

1

不要认为这是关系到正确关闭连接。 http://dev.mysql.com/doc/refman/5.0/en/blocked-host.html说,它相当于一个网络层的问题。

  • 如果DB位于另一台机器上检查(电缆,交换机,防火墙)
  • 之间的网络连接的问题如果DB是同一台机器上尝试使用插座,而不是TCP连接。
+0

你可能会做某事。这是两个不同的Amazon EC2实例,我通过内部DNS连接。我不确定哪些网络问题会存在,如果有的话。 – 2009-11-13 01:29:56

相关问题