mysql中用户登录失败次数限制与锁定策略
#技术教程 发布时间: 2026-01-13
MySQL 8.0.19+需启用validate_password插件并配置failed_login_attempts与password_lock_time参数,且用户须使用mysql_native_password或caching_sha2_password认证;创建用户时需显式声明FAILED_LOGIN_ATTEMPTS和PASSWORD_LOCK_TIME,解锁用ALTER USER ... ACCOUNT UNLOCK。
MySQL 8.0+ 的 failed_login_attempts 和 password_lock_time 怎么配
MySQL 8.0.19 起原生支持登录失败锁定,但必须启用 validate_password 插件(即使不校验密码强度),且只对使用 mysql_native_password 或 caching_sha2_password 认证插件的用户生效。
配置需分两步:
- 全局开启插件:
INSTALL PLUGIN validate_password SONAME 'validate_password.so';
- 设置策略参数(在
my.cnf中或运行时 SET):SET PERSIST failed_login_attempts = 3;
(单位:秒;设为 0 表示永久锁定,需手动解锁)
SET PERSIST password_lock_time = 86400; - 注意:
SET PERSIST写入mysqld-auto.cnf,重启仍生效;用SET GLOBAL则仅当前会话有效
创建带锁定策略的用户时,CREATE USER 的 FAILED_LOGIN_ATTEMPTS 语法怎么写
策略不能全局统一应用到所有用户,必须显式在 CREATE USER 或 ALTER USER 里声明。未声明的用户沿用全局默认值(若未设则为 0,即不限制)。
示例(创建一个最多输错 5 次、锁 1 小时的用户):
CREATE USER 'app_user'@'%' IDENTIFIED BY 'p@ssw0rd'
FAILED_LOGIN_ATTEMPTS 5 PASSWORD_LOCK_TIME 3600;
关键点:
-
FAILED_LOGIN_ATTEMPTS和PASSWORD_LOCK_TIME必须同时出现,不能只写一个 - 若设
PASSWORD_LOCK_TIME UNBOUNDED,表示锁定后永不自动解锁,只能由管理员执行ALTER USER ... ACCOUNT UNLOCK - 该策略仅作用于该用户,与其他用户的锁定状态完全隔离
用户被锁定了,怎么查和解
锁定状态不记录在 mysql.user 表中,而是存在内存中(performance_schema 的 account_status 表),且只在启用相关监控时才可见。
更可靠的方式是查 INFORMATION_SCHEMA.USER_ATTRIBUTES(MySQL 8.0.22+):
SELECT User, Host, ATTRIBUTE->>'$.password_lock_time' AS lock_time,
ATTRIBUTE->>'$.failed_login_attempts' AS max_tries
FROM INFORMATION_SCHEMA.USER_ATTRIBUTES
WHERE User = 'app_user';
解锁操作很简单:
ALTER USER 'app_user'@'%' ACCOUNT UNLOCK;
常见误区:
-
DROP+
USERCREATE USER不会重置锁定计数,因为账户元数据未清空(尤其mysql.user行还存在) - 错误日志里出现
User 'xxx'@'yyy' has been locked due to X failed login attempts才是真正触发锁定,不是每次输错都记日志 - 连接池复用连接时,可能因旧连接失效导致误判为“连续失败”,实际锁定是按用户+主机维度统计的
为什么设置了但没生效?几个典型失效场景
最常踩的坑不是配置错,而是环境不满足前提条件:
- MySQL 版本低于 8.0.19 —— 此功能不存在,
SET PERSIST failed_login_attempts会报错Unknown system variable - 用户认证插件不是
mysql_native_password或caching_sha2_password(比如用了auth_socket或自定义插件),锁定逻辑直接跳过 - 客户端连接时用了
--protocol=TCP但服务端绑定了skip-networking,导致认证流程绕过账户系统 - 使用了代理(如 ProxySQL、MaxScale),实际认证发生在代理层,MySQL 本身根本收不到登录请求
验证是否生效最直接的方法:用错误密码反复连接,观察第 N+1 次是否返回 ERROR 3956 (HY000): Account is locked —— 这个错误码才是锁定生效的确凿证据。
上一篇 : mysql中的事务隔离级别:READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ与SERIALIZABLE
下一篇 : css margin 与 padding 计算复杂怎么办_box-sizing border-box 使用
-
SEO外包最佳选择国内专业的白帽SEO机构,熟知搜索算法,各行业企业站优化策略!
SEO公司
-
可定制SEO优化套餐基于整站优化与品牌搜索展现,定制个性化营销推广方案!
SEO套餐
-
SEO入门教程多年积累SEO实战案例,从新手到专家,从入门到精通,海量的SEO学习资料!
SEO教程
-
SEO项目资源高质量SEO项目资源,稀缺性外链,优质文案代写,老域名提权,云主机相关配置折扣!
SEO资源
-
SEO快速建站快速搭建符合搜索引擎友好的企业网站,协助备案,域名选择,服务器配置等相关服务!
SEO建站
-
快速搜索引擎优化建议没有任何SEO机构,可以承诺搜索引擎排名的具体位置,如果有,那么请您多注意!专业的SEO机构,一般情况下只能确保目标关键词进入到首页或者前几页,如果您有相关问题,欢迎咨询!
USER