max_connect_errors默认值为100,连续中断连接(非密码错误)达阈值即封锁IP;需修改my.cnf中[mysqld]段并重启MySQL生效,localhost socket连接不受影响。

phpEnv 下 MySQL 的 max_connect_errors 默认是 100,连续失败连接(比如密码错、网络中断)超这个数,对应 IP 就被锁住——不是账号被禁,是整个主机被拒绝连接,mysqladmin flush-hosts 只能临时解,得改参数才治本。
确认当前值和是否已被触发锁定
先连进 phpEnv 自带的 MySQL(通常用 mysql -uroot -p),执行:
SHOW VARIABLES LIKE '%max_connect_errors%';
如果返回 Value 是 100,且你正遇到 “Host 'x.x.x.x' is blocked”,说明就是它在起作用。注意:这个限制只对 TCP 连接生效,localhost(socket 连接)不走这套逻辑。
- 错误现象典型是 PHP 报
PHP Warning: mysqli_connect(): (HY000/1129): Host '192.168.1.100' is blocked because of many connection errors - 不是所有“连接失败”都触发计数——只有客户端发起连接但中途断开(如 PHP 脚本崩溃、Nginx 中断请求、防火墙拦截 SYN 包)才算“aborted connection”
- 密码错误本身不计入
max_connect_errors,那是max_user_connections或权限系统管的事
永久修改 max_connect_errors(推荐)
phpEnv 的 MySQL 配置文件路径通常是 /phpenv/etc/my.cnf 或 /phpenv/mysql/etc/my.cnf(具体看安装时选的路径)。必须编辑该文件,在 [mysqld] 段内添加:
立即学习“PHP免费学习笔记(深入)”;
[mysqld] max_connect_errors = 500
保存后,用 phpEnv 提供的重启命令生效(不是直接 kill 进程):
/phpenv/bin/mysql restart
- 别加空格或等号前后有空格,否则 MySQL 启动会失败,日志里报
unknown variable - 改完不重启 = 白改;phpEnv 不支持热重载配置,必须完整重启 mysqld 进程
- 值设太高(比如 10000)没意义——真有高频异常连接,该查网络或应用层重试逻辑,而不是掩盖问题
临时绕过锁定并验证修改
如果已经锁了,先手动解锁再验证新配置是否加载成功:
mysql -uroot -p -e "FLUSH HOSTS;"
然后立刻检查是否生效:
mysql -uroot -p -e "SHOW VARIABLES LIKE 'max_connect_errors';"
- 输出的
Value必须和配置文件里写的完全一致,否则说明配置没加载(常见于段落写错成[client]或路径不对) - 不要依赖 phpMyAdmin 或宝塔式面板——phpEnv 没这些,全靠命令行和文件
- 改完后观察 10 分钟,用脚本模拟两次失败连接再成功一次:
mysql -h127.0.0.1 -uroot -pxxx 2>/dev/null || echo fail,确认不再被锁
真正容易被忽略的是:这个参数和 connect_timeout、wait_timeout 是联动的。如果网络延迟高或 PHP 层重试策略激进,即使调到 500,也可能几分钟内就打满。与其盲目调高,不如在 PHP 侧加连接前 ping(mysqli_ping())或统一用连接池代理(如 ProxySQL)做熔断降级。



















