mysql中用户登录失败次数限制与锁定策略
发布时间 - 2026-01-13 00:00:00 点击率:次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 USER+CREATE 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
# word
# app
# ai
# proxy
# yy
# 为什么
# Error
# auto
# 解锁
# 几个
# 才是
# 最多
# 设为
# 用了
# 很简单
# 不存在
# 自定义
# 只在
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
微信推文制作网站有哪些,怎么做微信推文,急?
Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】
详解Android图表 MPAndroidChart折线图
Laravel如何处理和验证JSON类型的数据库字段
HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】
Laravel如何自定义分页视图?(Pagination示例)
EditPlus中的正则表达式 实战(2)
Linux后台任务运行方法_nohup与&使用技巧【技巧】
高端建站如何打造兼具美学与转化的品牌官网?
Python正则表达式进阶教程_复杂匹配与分组替换解析
如何在阿里云购买域名并搭建网站?
如何快速查询域名建站关键信息?
文字头像制作网站推荐软件,醒图能自动配文字吗?
Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层
Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件
晋江文学城电脑版官网 晋江文学城网页版直接进入
jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】
如何在香港服务器上快速搭建免备案网站?
php静态变量怎么调试_php静态变量作用域调试技巧【解答】
如何在云主机上快速搭建多站点网站?
Laravel安装步骤详细教程_Laravel环境搭建指南
制作企业网站建设方案,怎样建设一个公司网站?
Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件
Laravel模型事件有哪些_Laravel Model Event生命周期详解
微信小程序 HTTPS报错整理常见问题及解决方案
php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】
香港服务器建站指南:外贸独立站搭建与跨境电商配置流程
Laravel Seeder填充数据教程_Laravel模型工厂Factory使用
Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言
Laravel如何实现多对多模型关联?(Eloquent教程)
html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】
香港服务器部署网站为何提示未备案?
Laravel如何生成URL和重定向?(路由助手函数)
Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤
Laravel如何集成Inertia.js与Vue/React?(安装配置)
logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?
Python图片处理进阶教程_Pillow滤镜与图像增强
php在windows下怎么调试_phpwindows环境调试操作说明【操作】
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?
如何正确选择百度移动适配建站域名?
怎样使用JSON进行数据交换_它有什么限制
html5如何实现懒加载图片_ intersectionobserver api用法【教程】
Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册
linux top下的 minerd 木马清除方法
通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】
Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】
LinuxCD持续部署教程_自动发布与回滚机制
Claude怎样写约束型提示词_Claude约束提示词写法【教程】
再谈Python中的字符串与字符编码(推荐)
北京的网站制作公司有哪些,哪个视频网站最好?


led_login_attempts' AS max_tries