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_attemptspassword_lock_time 怎么配

MySQL 8.0.19 起原生支持登录失败锁定,但必须启用 validate_password 插件(即使不校验密码强度),且只对使用 mysql_native_passwordcaching_sha2_password 认证插件的用户生效。

配置需分两步:

  • 全局开启插件:
    INSTALL PLUGIN validate_password SONAME 'validate_password.so';
  • 设置策略参数(在 my.cnf 中或运行时 SET):
    SET PERSIST failed_login_attempts = 3;
    SET PERSIST password_lock_time = 86400;
    (单位:秒;设为 0 表示永久锁定,需手动解锁)
  • 注意:SET PERSIST 写入 mysqld-auto.cnf,重启仍生效;用 SET GLOBAL 则仅当前会话有效

创建带锁定策略的用户时,CREATE USERFAILED_LOGIN_ATTEMPTS 语法怎么写

策略不能全局统一应用到所有用户,必须显式在 CREATE USERALTER USER 里声明。未声明的用户沿用全局默认值(若未设则为 0,即不限制)。

示例(创建一个最多输错 5 次、锁 1 小时的用户):

CREATE USER 'app_user'@'%' IDENTIFIED BY 'p@ssw0rd'
FAILED_LOGIN_ATTEMPTS 5 PASSWORD_LOCK_TIME 3600;

关键点:

  • FAILED_LOGIN_ATTEMPTSPASSWORD_LOCK_TIME 必须同时出现,不能只写一个
  • 若设 PASSWORD_LOCK_TIME UNBOUNDED,表示锁定后永不自动解锁,只能由管理员执行 ALTER USER ... ACCOUNT UNLOCK
  • 该策略仅作用于该用户,与其他用户的锁定状态完全隔离

用户被锁定了,怎么查和解

锁定状态不记录在 mysql.user 表中,而是存在内存中(performance_schemaaccount_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_passwordcaching_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中的字符串与字符编码(推荐)  北京的网站制作公司有哪些,哪个视频网站最好?