MySQL 8.0.19+ 账号自动锁定需同时满足三条件:认证插件为 caching_sha2_password 或 mysql_native_password、FAILED_LOGIN_ATTEMPTS 与 PASSWORD_LOCK_TIME 成对出现在同条 CREATE/ALTER USER 语句中、validate_password 插件必须启用且状态为 ACTIVE;缺一即 account_locked 永为 'N',单独设置 FAILED_LOGIN_ATTEMPTS 会被静默忽略。

MySQL 8.0.19+ 才真正支持账号级自动锁定,但必须同时满足三个硬性条件:认证插件是 caching_sha2_password 或 mysql_native_password、FAILED_LOGIN_ATTEMPTS 和 PASSWORD_LOCK_TIME 成对出现在同一条语句中、validate_password 插件已启用。缺一不可,否则查 account_locked 永远是 'N'。
为什么单独执行 ALTER USER 'u'@'%' FAILED_LOGIN_ATTEMPTS 3 没反应
这条命令会被 MySQL 静默忽略——它不是独立开关,而是策略绑定参数的一部分。FAILED_LOGIN_ATTEMPTS 和 PASSWORD_LOCK_TIME 必须同时出现在同一条 CREATE USER 或 ALTER USER 语句中,顺序无关,但少一个就完全失效。
- 已有用户不能只加策略:必须连认证插件一起重置,例如:
ALTER USER 'u'@'%' IDENTIFIED WITH caching_sha2_password BY 'pwd' FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 1; - 如果当前插件是
auth_socket或sha256_password,哪怕语法写对,account_locked字段也始终为'N' - 不检查插件类型就改策略,等于白配
为什么 validate_password 插件是强制依赖
它不是可选增强项,而是失败计数机制的底层支撑。没它,输错密码根本不会累加计数,日志里也不会出现 Too many failed login attempts 记录。
MySQL 数据库管理技能,能够通过自然语言查询和管理数据库,支持 SELECT/INSERT/UPDATE/DELETE、表管理、备份恢复等操作。当用户提及 MySQL、数据库查询、建表或数据备份时使用此技能。
- 检查是否启用:
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'validate_password';,结果必须是ACTIVE - 启用方式二选一:配置文件加
plugin_load_add = validate_password.so后重启;或运行INSTALL PLUGIN validate_password SONAME 'validate_password.so'; - 注意:启用后会强制触发密码强度校验(如
validate_password.length),可能让旧脚本建用户失败
怎样确认账号真的被锁了,而不是单纯密码错
输错密码和账号被锁都报 ERROR 1045 (28000),仅看错误提示无法区分。
- 查系统表:
SELECT user, host, account_locked, failed_login_attempts FROM mysql.user WHERE user = 'u'; - 如果
account_locked = 'Y',说明已触发真锁定 - 如果
failed_login_attempts > 0但account_locked = 'N',说明还在累积失败次数,未达阈值 - 解锁只能由管理员执行:
ALTER USER 'u'@'%' ACCOUNT UNLOCK;
PASSWORD_LOCK_TIME 不支持分钟,别硬凑 30 分钟
PASSWORD_LOCK_TIME 只接受整数,单位是天:设 1 是锁 24 小时,0 是永久锁定(不会自动恢复)。想锁 30 分钟?MySQL 会直接报错 ERROR 3671 (HY000): Invalid value for PASSWORD_LOCK_TIME。
- 锁定解除条件不是“时间到了就自动开”,而是必须有一次成功登录才会重置计数、清除
account_locked = 'Y' - 真要实现分钟级控制,只能靠应用层自己维护失败计数,或用
connection_control插件加延迟(但它不锁账号,只卡响应) - 很多人卡在这一步:以为改个数字就能锁 X 分钟,结果连语句都执行不过










