MySQL 8.0+中设置用户密码永不过期的唯一正确方式是执行ALTER USER ... PASSWORD EXPIRE NEVER;INTERVAL 0 DAY语法非法,会报ERROR 1064,且default_password_lifetime=0仅影响新用户,不改变已有用户策略。

MySQL 8.0+ 中设置用户密码永不过期,唯一安全有效的方式是执行 ALTER USER ... PASSWORD EXPIRE NEVER;设为 0 或 NULL 是全局变量 default_password_lifetime 的取值含义,不适用于单个用户。
为什么不能用 ALTER USER ... PASSWORD EXPIRE INTERVAL 0 DAY
这条语句语法错误,MySQL 会直接报 ERROR 1064 (42000)。MySQL 不接受 INTERVAL 0 DAY 这种写法——它只认正整数天数(如 90)、NEVER、DEFAULT 或无参数的 PASSWORD EXPIRE(即立即过期)。0 在这里不是合法的时间间隔值。
PASSWORD EXPIRE NEVER 是唯一正确写法
对已有用户禁用过期策略,必须显式使用 NEVER 关键字:
ALTER USER 'appuser'@'10.20.%' PASSWORD EXPIRE NEVER;ALTER USER 'backup'@'localhost' PASSWORD EXPIRE NEVER;- 注意:必须精确匹配
user@host,'root'@'localhost'和'root'@'%'是两个独立账户,需分别执行
别混淆全局变量和用户级设置
default_password_lifetime = 0 表示“新用户默认永不过期”,但它不影响已有用户——哪怕你刚把全局设成 0,已存在的账号仍按其 password_last_changed + 原策略计算是否超期。线上常见误操作就是只改了全局值,却忘了逐个跑 ALTER USER ... PASSWORD EXPIRE NEVER,结果测评或巡检时发现 root 账号仍在倒计时。
过期后还能连上,但不能干活
密码已过期的用户仍可建立连接,但几乎无法执行任何业务操作:
- 允许:
SET NAMES utf8mb4、SELECT 1、UNLOCK TABLES - 禁止:
SELECT * FROM orders、INSERT、UPDATE、存储过程调用等 - 唯一能救场的操作只有:
ALTER USER USER() IDENTIFIED BY 'newpass';(且客户端必须支持过期密码重置,老版本mysql命令行可能卡住)
所以“永不过期”不是可选项,而是关键账号上线前必须确认的硬性动作——尤其在等保三级场景下,漏掉一个运维账号就可能被判定为策略未全覆盖。


















