我经常遇到以下错误:
PHP fatal error :消息为“SQLSTATE[HY000] [1129] 主机“我的服务器”因许多连接错误而被阻止的未捕获异常“PDOException”;使用“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 命令。
最佳答案
此响应是作为安全措施设计的,是达到 mysql 的 max_connection_errors 值的结果。 Here's a link Oracle 提供了其中大部分可能的原因和解决方案的详细信息。
最终这意味着有太多连续的连接失败,以至于 MySql 停止响应连接尝试。
I use a cron, every 5 minutes which does a mysqladmin flush-hosts command.
由于您很快就达到了这个限制,所以只有几个可能的罪魁祸首:
- 服务器未正确配置为使用 PDO。
- 运行代码包括非常频繁地创建新连接。
- 导致快速达到 max_connections 值,导致所有后续连接尝试失败...从而快速达到 max_connection_errors 限制。
- 代码陷入无限循环或级联故障。
- 明显的可能性,但必须提及。
- (即:pageA调用pageB和pageC,pageC调用PageA)
- PDO 运行良好,但有些脚本需要很长时间才能运行,或者永远不会结束。
- 最简单的方法是调低 max_execution_time。
很可能无论如何,这都很难追踪。
- 记录每个 mysql 连接尝试的堆栈跟踪,以找出导致此问题的代码。
- 检查 mysql.err 日志文件
虽然 PDO 不需要显式关闭 mysql 连接,但对于这种情况,有一些做法可以防止此类 ServerAdmin 搜索。
- 始终明确关闭 mysql 连接。
- 构建一个 simple Class处理所有连接。打开,返回数组,关闭。
- 唯一需要保持连接打开的时间是游标。
- 始终在一个文件中定义连接参数,并且只在一个文件中包含所有需要的地方。
- 永远不要增加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
关于php - MySQL 中的 "many successive interrupted connection requests"是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11791128/