首页 游戏 软件 资讯 排行榜 专题
首页
数据库
mysql如何配置密码过期策略强制定期修改_使用PASSWORD EXPIRE子句设置有效期

mysql如何配置密码过期策略强制定期修改_使用PASSWORD EXPIRE子句设置有效期

热心网友
81
转载
2026-04-16

MySQL 8.0+密码过期策略详解:必须使用ALTER USER设置,SET PASSWORD为何无效?其核心是更新mysql.user表的元数据字段

mysql如何配置密码过期策略强制定期修改_使用PASSWORD EXPIRE子句设置有效期

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

ALTER USER PASSWORD EXPIRE 正确语法解析,SET PASSWORD 为何无效?

理解MySQL 8.0及以上版本的密码过期策略,关键在于区分其本质:它是一个独立于密码哈希值的账户元数据标记。当你仅使用 SET PASSWORD 命令时,操作仅会更新用户的密码哈希值,而完全不会触及 mysql.user 系统表中的关键字段,如 password_expiredpassword_lifetime。这导致密码虽然被修改,但过期策略并未被激活或更新,用户账户的密码管理状态保持不变。

因此,正确配置密码过期策略的唯一方法是使用 ALTER USER 命令,并配合 PASSWORD EXPIRE 子句。以下是几种核心应用场景的语法示例:

  • ALTER USER 'dev'@'10.%.%' PASSWORD EXPIRE; —— 此命令立即使指定用户的密码状态变为过期。用户下次成功认证后,在执行第一条非 SET 类型的SQL语句时,将立即收到 ERROR 1820 (HY000) 错误,提示必须重置密码。
  • ALTER USER 'dev'@'10.%.%' PASSWORD EXPIRE INTERVAL 45 DAY; —— 为用户设置一个45天的密码有效期,从设置时刻开始倒计时,到期后自动触发过期。
  • ALTER USER 'dev'@'10.%.%' PASSWORD EXPIRE NEVER; —— 此命令并非设置“永不过期”,而是直接移除该用户账户上的密码过期策略,使其不受全局或默认过期规则约束。

需要特别注意一个常见的兼容性陷阱:在自动化脚本或旧版迁移中,可能会误用如 SET PASSWORD FOR 'u'@'h' = PASSWORD('x') 的语法。请务必注意,PASSWORD() 函数在MySQL 8.0中已被彻底移除,且此类 SET PASSWORD 语句完全不会更新任何与密码过期相关的元数据字段。

default_password_lifetime 全局变量详解:仅影响新建用户默认值

许多数据库管理员对全局系统变量 default_password_lifetime 的作用范围存在误解。该变量的职责非常清晰且有限:它仅为那些通过 CREATE USER 语句新建、且未在创建时显式指定 PASSWORD EXPIRE 选项的用户账户,提供一个默认的密码生命周期。对于数据库中已存在的任何用户,此全局变量的更改均不产生直接影响。例如,即使你将全局默认值调整为30天,用户 alice 的密码过期时间仍将维持其上一次通过 ALTER USER 单独设定的值,不会自动同步更新。

在实际运维中,可以参考以下操作指南:

  • 查询当前的全局默认过期设置:SELECT @@global.default_password_lifetime;
  • 如需永久性更改全局默认值(配置将持久化至 mysqld-auto.cnf):SET PERSIST default_password_lifetime = 90;
  • 若希望所有新创建账号默认60天后过期,同时保留为关键账号(如DBA账户)手动设置豁免的灵活性,则不应将全局值设为 0(即永不过期)。
  • 对于批量更新所有现有用户的密码过期策略,MySQL并未提供内置的一键命令,需要通过编写脚本循环执行 ALTER USER ... PASSWORD EXPIRE INTERVAL 60 DAY 语句来实现。

密码过期触发机制揭秘:并非登录时拦截,而是在执行SQL时检查

MySQL密码过期的触发机制存在一个容易令人困惑的细节:许多人误以为设置 PASSWORD EXPIRE 后,用户在建立连接时就会被拒绝或收到强制改密提示。实际上,MySQL的运作逻辑如下:

  • 用户使用尚未更改的旧密码成功通过身份认证,连接正常建立。
  • 连接建立后,只要用户不执行任何非 SET 类型的SQL语句(例如 SELECTINSERTSHOW TABLES 等),密码过期的状态检查就不会被触发。
  • 当用户尝试执行第一条非 SET 语句时,服务器会立即返回 ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement. 错误。
  • 在此期间,纯粹的 SET 语句,如 SET NAMES utf8mb4SET autocommit = 1 等,仍可正常执行。

这一机制带来的影响是:在长连接保持空闲、应用连接池复用现有连接、或客户端自动发送 SET 语句进行健康检查的场景下,密码已过期的事实可能会被“隐藏”相当长的时间。真正强制用户修改密码的时机,被延迟到了用户首次尝试执行实际业务操作的那一刻。

MySQL 5.7 版本兼容性说明:不支持原生密码过期语法

必须明确指出,MySQL 5.7 版本并不原生支持 ALTER USER ... PASSWORD EXPIRE 语法。若在5.7环境中直接执行该命令,将收到明确的语法错误。许多网络教程直接引用8.0的语法,在5.7版本中是完全无效的。

那么,在MySQL 5.7环境下,如果希望实现类似的定期密码轮换安全效果,可行的替代方案主要有两种:

  • 在应用层或外部运维平台部署定期任务脚本,通过调用如 mysql -e "ALTER USER 'u'@'h' IDENTIFIED BY 'newpass'" 的命令来强制修改密码,并详细记录操作日志。这本质上是一种基于时间计划驱动的人工密码轮换机制。
  • 利用MySQL内置的事件调度器(mysql_event)结合自定义存储过程,定期查询 mysql.user 表中的 password_last_changed 字段,对超过指定期限的账户执行告警通知,或在极端安全策略下,通过执行 REVOKE ALL PRIVILEGES ON *.* FROM 'u'@'h' 来临时锁定账户权限(但需注意,此操作不阻止账户登录,仅限制其执行操作)。

请避免走入误区:调整 validate_password_lengthvalidate_password_policy 等插件参数是无效的,这些参数仅用于校验密码的复杂度和强度,与“密码到期强制修改”这一时间维度的策略完全无关。

最后补充几个关键要点:MySQL 8.0.19+ 版本引入的 PASSWORD EXPIRE NEVER 选项,是一个用户级别的豁免开关,并非全局开关;它仅对指定用户生效,全局默认策略对其他用户依然有效。此外,如果系统表未正确升级(例如从MySQL 5.7升级到8.0后未运行 mysql_upgrade 工具),会导致 mysql.user 表结构不完整,缺少必要的字段,进而使得所有密码管理操作失败。错误日志中通常会提示 Column count of mysql.user is wrong —— 这个问题比单纯的语法错误更为隐蔽,且影响范围更广。

来源:https://www.php.cn/faq/2336057.html
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

MySQL 崩溃恢复神器:innodb_force_recovery 参数详解,DBA 必备!
业界动态
MySQL 崩溃恢复神器:innodb_force_recovery 参数详解,DBA 必备!

当数据库无法启动:深入解析 innodb_force_recovery 的“急救”艺术 在 MySQL 的日常运维中,最让人“心跳加速”的场景之一,莫过于数据库突然无法启动,错误日志里赫然写着: InnoDB: Database was not shut down normally! InnoDB:

热心网友
04.16
mysql如何处理死锁检测带来的性能开销_在高并发场景下关闭死锁检测
数据库
mysql如何处理死锁检测带来的性能开销_在高并发场景下关闭死锁检测

MySQL无法关闭死锁检测,因其是InnoDB保障事务隔离正确性的强制机制;应通过减少等待图规模、统一加锁顺序、热点分片、批量操作等手段降低检测频率与开销。 死锁检测本身无法关闭,MySQL 没有 innodb_deadlock_detect 之类的开关 许多开发者在面对高并发更新热点行导致的性能波

热心网友
04.16
mysql如何撤销所有数据库访问权限_利用REVOKE ALL实现彻底清除
数据库
mysql如何撤销所有数据库访问权限_利用REVOKE ALL实现彻底清除

MySQL权限撤销:你以为的“全部”可能只是“部分” 在MySQL数据库权限管理实践中,REVOKE ALL 这条命令常被误认为是“一键清除”的万能钥匙。然而,许多数据库管理员在执行后会发现,目标用户仍能登录甚至执行部分操作。这背后,揭示了MySQL权限体系中几个关键且易被忽视的运作机制。 REVO

热心网友
04.16
mysql如何格式化输出日期_使用date format函数自定义格式
数据库
mysql如何格式化输出日期_使用date format函数自定义格式

MySQL 的 DATE_FORMAT() 函数怎么写才不报错 初次使用 MySQL 的 DATE_FORMAT() 函数时,开发者常会遇到 FUNCTION DATE_FORMAT does not exist 的错误提示。这通常并非函数缺失,而是参数类型不匹配所致。该函数仅接受 DATE、DAT

热心网友
04.16
mysql如何设置全局查询超时限制_预防长事务锁定资源
数据库
mysql如何设置全局查询超时限制_预防长事务锁定资源

MySQL查询超时设置详解:max_execution_time与wait_timeout的区别与应用场景 MySQL全局查询超时参数解析:wait_timeout与max_execution_time的区别 MySQL中两个名称相似的超时参数wait_timeout和max_execution_t

热心网友
04.16

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

智能查询 提供多种便民查询工具,助力用户高效获取生活、学习和健康信息
AI
智能查询 提供多种便民查询工具,助力用户高效获取生活、学习和健康信息

智能查询产品介绍 说到能帮我们省时省力的在线工具,有一个平台确实值得一提。它就像一个功能齐全的“数字瑞士军刀”,把各种实用查询和计算服务都整合在了一起。这个网站覆盖的领域相当广泛,几乎能触达日常生活的方方面面: 教育学习:从查汉字、找成语到在线翻译,它能实实在在地帮用户解决语言学习中的疑难杂症。 生

热心网友
04.16
传奇转会!rain告别FaZe加盟100 Thieves,十年首换队开启指挥转型
游戏资讯
传奇转会!rain告别FaZe加盟100 Thieves,十年首换队开启指挥转型

官宣:rain加盟100 Thieves 尘埃落定。在为FaZe Clan效力了近十年之后,传奇选手“雨神”rain终于找到了他的新归宿——100 Thieves。这不仅仅是简单的选手转会,更是一个时代的微妙转折。 消息已得到官方确认,rain正式签约100 Thieves,成为这支俱乐部宣布回归C

热心网友
04.16
档案管理员年度工作总结
办公文书
档案管理员年度工作总结

以下是本站为您精心整理的档案管理员年度工作总结范文,内容详实,可供参考。更多档案管理工作总结范文,请持续关注本站档案年度工作总结专栏。 档案管理员年度工作总结范文【一】 时光飞逝,自加入XXXX公司以来,已度过四个多月充实的工作时光。这份档案管理工作对我个人而言,不仅是职业生涯的重要开端,更是一段极

热心网友
04.16
‌Spirit爆冷出局!sh1ro迷茫发声:不知道哪出了问题,chopper承认状态不佳
游戏资讯
‌Spirit爆冷出局!sh1ro迷茫发声:不知道哪出了问题,chopper承认状态不佳

Spirit赛后动态 sh1ro:不知道哪出了问题 IEM成都站小组赛的赛果,多少有些出人意料。在确认止步之后,Spirit战队的几名队员陆续在社交平台上更新了状态,字里行间能品出不少东西。 核心选手sh1ro的发言很短,却透着浓浓的困惑:“输了。我不知道哪出了问题,也没什么好说的了,回头见。”这种

热心网友
04.16
三星GALAXY S4 Zoom (C101)用odin刷机解锁?线刷宝一键刷机解决
手机教程
三星GALAXY S4 Zoom (C101)用odin刷机解锁?线刷宝一键刷机解决

线刷宝集成三星GALAXY S4 Zoom (C101)刷机资源与教程 对于需要为三星GALAXY S4 Zoom (C101)进行刷机、救砖或升级固件的用户来说,线刷宝平台提供了一个集中的资源库。这里不仅提供该机型的官方ROM包、固件包,也集成了对应的Odin五件套或一体包,堪称一个功能全面的下载

热心网友
04.16