MySQL中“多次连续中断的连接请求”是什么?

时间:2012-08-03 07:23:15

标签: php mysql

我经常遇到以下错误:

PHP致命错误:带有消息'SQLSTATE [HY000]的未捕获异常'PDOException'[1129]由于许多连接错误,主机'MY SERVER'被阻止;使用'mysqladmin flush-hosts'

解锁

使用常规(如crontab) mysqladmin flush-hosts 命令或增加max_connect_errors系统变量(如here编写)很容易解决问题。

但是!什么是“许多连续中断的连接请求”,为什么会发生这种情况?

我宁愿阻止上游问题,而不是纠正阻塞。

MySQL版本:5.5.12。我正在使用Zend Framework 1.11.10和Doctrine 2.1.6。

我的PHP代码中没有mysql_close()和mysqli_close()。

max_connect_errors有默认值10,我不想增加它,我想知道为什么我有错误。我使用一个cron,每隔5分钟执行一次mysqladmin flush-hosts命令。

2 个答案:

答案 0 :(得分:1)

此响应是设计为安全措施,是达到mysql的 max_connection_errors 值的结果。 Here's a link Oracle提供了大部分可能原因和解决方案的详细信息。

最终,这意味着MySql停止响应连接尝试有很多连续的连接失败。

  

我使用一个cron,每5分钟做一次mysqladmin flush-hosts   命令。

当你如此迅速地达到这个极限时,只有少数可能是罪魁祸首:

  1. 服务器未正确配置为使用PDO。
  2. 运行代码包括非常频繁地创建新连接。
    • 导致快速达到 max_connections 值,导致所有后续连接尝试失败...从而快速达到 max_connection_errors 限制。
  3. 代码遇到无限循环或级联失败。
    • 明显的可能性,但必须提到。
    • (即:pageA调用pageB和pageC,pageC调用PageA)
  4. PDO运行正常,但有些脚本需要很长时间才能运行,或者永远不会结束。
    • 最简单的方法是关闭 max_execution_time
  5. 无论如何,这很难追查。

    1. 记录每个mysql连接尝试的堆栈跟踪,以找到导致此问题的代码。
    2. 检查mysql.err日志文件
    3. 虽然PDO不需要显式关闭mysql连接,但是对于这样的情况,有一些实践可以阻止这样的ServerAdmin搜索。

      • 始终显式关闭mysql连接。
        • 构建simple Class以处理所有连接。打开,返回数组,关闭。
        • 您需要保持连接打开的唯一时间是游标。
      • 始终在一个且只有一个文件中定义连接参数。
      • 永远不要增加 max_execution_time ,除非您知道需要它,并且您知道服务器可以处理它。您需要 IF ,只为需要它的脚本显式增加值。 php.net/manual/en/function.set-time-limit.php
        • 如果您增加 max_execution_time ,请增加 max_connections

      dev.mysql.com/doc/refman/5.0/en/cursors.html

答案 1 :(得分:0)

这意味着mysqld已收到来自给定主机的许多连接请求,这些请求在中间被中断。有关详情,请查看文档中的link