mysql 8.0+ 账号锁定必须启用validate_password插件、用户使用caching_sha2_password认证、failed_login_attempts与password_lock_time成对显式设置,三者缺一不可;否则失败计数不累加,account_locked恒为n。

validate_password插件必须先装,否则锁定策略完全不触发
MySQL 8.0+ 的 FAILED_LOGIN_ATTEMPTS 和 PASSWORD_LOCK_TIME 依赖 validate_password 插件提供底层失败计数钩子。没装它,哪怕参数写全、插件也对,登录失败也不会累加计数,account_locked 字段永远是 N。
检查是否已启用:SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'validate_password';
状态不是 ACTIVE 就得手动装:
- 运行时安装:
INSTALL PLUGIN validate_password SONAME 'validate_password.so'; - 持久化配置:在
my.cnf的[mysqld]段加plugin_load_add = validate_password.so,然后重启
⚠️ 注意:validate_password 启用后会强制执行密码强度策略(比如 validate_password.length),已有脚本建用户可能因密码太弱而失败,需同步调整。
用户认证插件必须是 caching_sha2_password 或 sha256_password
MySQL 8.0.19+ 的账户锁定只对使用 caching_sha2_password 或 sha256_password 的用户生效。用 mysql_native_password 的用户,无论怎么设参数,account_locked 都不会变 Y。
查当前插件:SELECT User, Host, plugin FROM mysql.user WHERE User = 'your_user';
已有用户要改插件并配策略,必须一起写:ALTER USER 'u'@'%' IDENTIFIED WITH caching_sha2_password BY 'pwd' FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 0.04167;
(PASSWORD_LOCK_TIME 0.04167 ≈ 锁 1 小时)
常见错误:只执行 ALTER USER ... FAILED_LOGIN_ATTEMPTS 3,没换插件——MySQL 静默忽略,毫无反应。
FAILED_LOGIN_ATTEMPTS 和 PASSWORD_LOCK_TIME 必须成对出现
这两个参数是绑定的:缺一不可,顺序无关,但少一个就完全失效。MySQL 不接受单独设置其中一项。
创建新用户时写法示例:CREATE USER 'api'@'%' IDENTIFIED BY 'P@ssw0rd!' FAILED_LOGIN_ATTEMPTS 5 PASSWORD_LOCK_TIME 24;
(输错 5 次,锁 24 小时)
已有用户修改:ALTER USER 'api'@'%' FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 1;
关键点:
-
PASSWORD_LOCK_TIME单位是小时,不是秒;设为0表示永久锁定,只能靠ALTER USER ... ACCOUNT UNLOCK解 - 设为
UNBOUNDED效果同0,但语法更明确 - 没有全局开关,每个用户都得单独配;
SET PERSIST failed_login_attempts = 3这类语句无效,变量根本不存在
ACCOUNT UNLOCK 解锁时容易漏掉 password_expired 和 plugin 兼容性
用户被锁后,仅执行 ALTER USER 'u'@'%' ACCOUNT UNLOCK 只能解除锁定状态。如果 password_expired = 'Y' 或客户端不支持 caching_sha2_password,照样登不上。
进库后第一件事:SELECT User, Host, account_locked, password_expired, plugin FROM mysql.user WHERE User = 'u';
若 password_expired 是 Y,必须重置密码:ALTER USER 'u'@'%' IDENTIFIED BY 'new_pwd' PASSWORD EXPIRE NEVER;
若插件是 caching_sha2_password 但老客户端连不上,可临时切回:ALTER USER 'u'@'%' IDENTIFIED WITH mysql_native_password BY 'new_pwd';
真正麻烦的是:这些状态常共存,但错误提示只报一个(比如只说 account is locked),容易误判问题根源。











