failed_login_attempts与password_lock_time是唯一能将account_locked设为'y'的方式,但仅对caching_sha2_password或mysql_native_password用户生效,且须在create/alter user中成对显式指定,锁定期满不自动解锁,需成功登录才重置。

FAILED_LOGIN_ATTEMPTS 和 PASSWORD_LOCK_TIME 是唯一能真正把账号状态设为 account_locked = 'Y' 的方式,但必须满足硬性条件,否则配置无效。
MySQL 8.0+ 真锁定:只对特定插件生效
只有使用 caching_sha2_password 或 mysql_native_password 认证插件的用户才支持真锁定;sha256_password 不支持该机制。
创建或修改用户时,必须显式指定策略,不能靠全局变量或 ALTER USER 单独补加:
-
CREATE USER 'u'@'%' IDENTIFIED BY 'p' FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 1;(输错 3 次锁 1 小时) -
ALTER USER 'u'@'%' IDENTIFIED WITH caching_sha2_password BY 'p' FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 0;(PASSWORD_LOCK_TIME 0表示永久锁定) - 锁定期满不会自动解锁——必须有一次成功登录才能重置失败计数并清除
account_locked = 'Y' - 失败计数按
user@host组合独立维护,'u'@'192.168.1.10'和'u'@'192.168.1.11'互不影响
connection_control 插件:不是锁定,是加延迟
它不改 account_locked 字段,也不拦截连接,只是让第 N 次失败后的响应变慢。常见误配导致“设了没反应”:
- 必须同时加载两个插件:
connection_control.so(或.dll)和connection_control_failed_login_attempts.so,缺一不可 -
connection_control_failed_connections_threshold = 3只表示“从第 4 次失败开始启用延迟逻辑”,但若connection_control_min_connection_delay = 0(默认值),延迟就是 0 毫秒 → 完全无感 - 单位是毫秒,不是秒:
60000是 1 分钟,60是 60 毫秒,客户端几乎察觉不到 - 所有失败都报
ERROR 1045 (28000),无法靠错误码区分密码错还是被卡住;确认是否生效得查:SHOW STATUS LIKE 'Connection_control_delayed_connections';返回非零值才算真起作用
别踩 max_connect_errors 这个坑
这个变量作用对象是客户端 IP 地址,不是用户账号。它触发的是“禁止该 IP 连接”,而不是“锁定某用户”。设成 5 后,同一 IP 下所有用户(包括 root)都会被拒绝,且错误提示是 Host 'xxx' is blocked,跟账号锁定无关。
它早在 MySQL 5.7 前就存在,与 account_locked 字段完全无关,也**不会**更新 mysql.user.account_locked 的值。
怎么验证锁定是否生效?
不要只看错误信息,要查真实状态:
- 查账号锁定状态:
SELECT user, host, account_locked FROM mysql.user WHERE user = 'u';—— 只有account_locked = 'Y'才算真锁定 - 查失败计数:
SELECT user, host, failed_login_attempts FROM mysql.user WHERE user = 'u';—— 注意该字段仅在真锁定策略下被维护,max_connect_errors不动它 - 查插件是否加载:
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME IN ('connection_control', 'connection_control_failed_login_attempts');—— 必须两行都为ACTIVE
最容易被忽略的是:真锁定依赖认证插件类型 + 显式建户/改户语法 + 成功登录才能解锁。三者缺一,account_locked = 'Y' 就永远不会出现。











