8

我经常遇到以下错误:

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

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

但 !什么是“许多连续中断的连接请求”,为什么会这样?

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

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 命令。

4

2 回答 2

1

此响应设计为一种安全措施,是达到 mysql 的max_connection_errors值的结果。 这是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

无论如何,这很可能很难追查。

  1. 记录每个 mysql 连接尝试的堆栈跟踪,以查找导致此问题的代码。
  2. 检查 mysql.err 日志文件

虽然 PDO 不需要显式关闭 mysql 连接,但对于这种情况,有一些做法可以防止此类 ServerAdmin 搜索。

  • 始终明确关闭 mysql 连接。
    • 构建一个简单的类来处理所有连接。打开,返回数组,关闭。
    • 唯一需要保持连接打开的是游标。
  • 始终在一个且只有一个文件中定义连接参数,该文件包含在需要的任何地方。
  • 除非你知道你需要它并且你知道服务器可以处理它,否则永远不要增加max_execution_time 。如果您需要它,请仅显式增加需要它的脚本的值。php.net/manual/en/function.set-time-limit.php
    • 如果增加max_execution_time,则增加max_connections

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

于 2012-08-10T06:39:36.440 回答
0

这意味着 mysqld 收到了许多来自给定主机的连接请求,这些请求在中间被中断。查看文档中的此链接以获取更多信息。

于 2012-08-03T13:50:03.507 回答