MySQL 8.0 设置 root 用户密码永不过期,最直接的方法是使用 ALTER USER 语句指定 PASSWORD EXPIRE NEVER。该操作适用于需要长期稳定连接且符合内部安全合规的场景,但需注意永久不过期可能不符合某些高等级安全审计要求。
先说结论:通过 ALTER USER 命令单独设置或修改全局变量 default_password_lifetime 为 0 均可实现密码永不过期。
- 适合:生产环境需要避免因密码过期导致服务中断的场景
- 先确认:检查当前用户密码过期策略状态及全局默认配置
- 再验证:使用
SHOW CREATE USER确认策略已生效
命令速用版
登录 MySQL 后执行以下 SQL 命令,将 localhost 登录的 root 用户密码设置为永不过期:
ALTER USER 'root'@'localhost' PASSWORD EXPIRE NEVER;若希望全局默认新创建用户密码永不过期,可设置全局变量:
SET GLOBAL default_password_lifetime=0;为什么会这样
MySQL 8.0 引入了密码过期策略机制,默认行为由系统变量 default_password_lifetime 控制。该变量默认值通常为 0(代表永不过期),但部分安全加固后的安装脚本或云数据库实例可能将其设置为特定天数。用户级别的 ALTER USER 设置优先级高于全局默认值。
分步处理
1. 登录数据库:使用具备足够权限的账号登录 MySQL 8.0 实例。
2. 检查当前状态:执行 SELECT user, host, password_lifetime FROM mysql.user WHERE user='root'; 查看当前策略。
3. 修改用户策略:执行 ALTER USER 'root'@'localhost' PASSWORD EXPIRE NEVER; 命令。
4. 修改全局配置(可选):若需持久化全局策略,需在配置文件 my.cnf 中添加 default_password_lifetime=0 并重启服务,或使用 SET GLOBAL 命令(重启后失效)。
怎么验证是否生效
执行 SHOW CREATE USER 'root'@'localhost'; 命令,查看输出结果中是否包含 PASSWORD EXPIRE NEVER 字段。若显示该字段,说明设置成功。也可查询 mysql.user 表,确认 password_lifetime 字段值为 0。
常见坑
1. 主机名匹配问题:MySQL 用户由用户名和主机名共同标识,root@localhost 与 root@% 是不同用户,需分别设置。
2. 安全合规风险:部分行业审计要求密码必须定期更换,设置永不过期可能导致合规检查不通过。
3. 配置持久化:SET GLOBAL 设置的变量在数据库重启后会恢复默认值,需写入配置文件才能永久生效。
常见问题
设置后需要重启数据库吗?
不需要。ALTER USER 命令立即生效,无需重启数据库服务。
全局设置会影响已存在的用户吗?
不会。全局变量 default_password_lifetime 仅影响修改后新创建的用户,已存在用户需单独执行 ALTER USER 修改。
如何恢复默认过期策略?
使用 ALTER USER 'root'@'localhost' PASSWORD EXPIRE DEFAULT; 命令即可恢复为全局默认策略。
参考来源
MySQL 8.0 Reference Manual - Password Expiration Policy: https://dev.mysql.com/doc/refman/8.0/en/password-expiration-policy.html
MySQL 8.0 Reference Manual - ALTER USER Statement: https://dev.mysql.com/doc/refman/8.0/en/alter-user.html