mysql 8.0 中设置用户首次登录必须改密码,应使用 create user 或 alter user 的 password expire 选项,如 create user 'newuser'@'%' identified by 'temppass123!' password expire; 或 alter user 'existing_user'@'localhost' password expire;,执行后用户下次登录执行首个非set语句即报 error 1820,强制要求用 alter user ... identified by 重置密码,且新密码须满足 validate_password 策略。

MySQL 8.0 中如何设置用户首次登录必须改密码
MySQL 8.0 原生支持强制用户首次登录修改密码,核心是 CREATE USER 或 ALTER USER 的 PASSWORD EXPIRE 选项。只要密码状态为“已过期”,用户连接成功后执行任何语句都会报错,必须先用 SET PASSWORD 或 ALTER USER ... IDENTIFIED BY 重置密码才能继续。
创建用户时直接启用密码过期策略
这是最常用、也最稳妥的方式——在建号阶段就锁定首次登录行为。MySQL 不会自动“记住”这是“首次”,而是靠服务端校验密码是否处于 EXPIRED 状态来触发强制修改流程。
示例命令:
CREATE USER 'newuser'@'%' IDENTIFIED BY 'TempPass123!' PASSWORD EXPIRE;
关键点:
-
PASSWORD EXPIRE是立即生效的,不是延后触发;用户下次连接即进入“过期模式” - 密码强度需满足当前
validate_password插件策略(如长度、大小写、数字等),否则SET PASSWORD会失败并报ERROR 1819 (HY000) - 如果使用了
mysql_native_password认证插件(而非默认的caching_sha2_password),部分旧客户端可能无法正确处理过期响应,建议统一用 8.0 默认插件
已有用户如何补设首次改密要求
对已存在的用户,用 ALTER USER 同样可设为过期状态。注意:该操作不改变原密码,只标记状态为 EXPIRED。
执行命令:
ALTER USER 'existing_user'@'localhost' PASSWORD EXPIRE;
验证是否生效:
SELECT user, host, password_last_changed, password_expired FROM mysql.user WHERE user = 'existing_user';
返回中 password_expired 字段值为 Y 即表示已启用。此时该用户下次登录后执行 SELECT 1; 就会报错:
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
客户端连接后改密失败的常见原因
用户登录后执行 SET PASSWORD = 'NewPass456!' 报错,往往不是语法问题,而是环境或权限卡点:
- 未用
--connect-expired-password参数启动客户端(仅 MySQL 8.0.19+ 支持),会导致连接直接被拒绝,根本进不了“改密提示”流程 - 用户缺少
CREATE USER或ALTER USER权限(SET PASSWORD在 8.0.11+ 已弃用,推荐用ALTER USER ... IDENTIFIED BY) - 密码不符合当前
validate_password.length/validate_password.mixed_case_count等配置,错误信息里通常带具体不满足哪条规则 - 连接使用了
mysql -u user -p方式,但输入旧密码后没手动执行改密语句——MySQL 不会自动弹窗或交互式引导,必须显式执行 SQL
真正容易被忽略的是:即使设置了 PASSWORD EXPIRE,如果用户有 SUPER 权限(或启用了 skip-grant-tables),MySQL 会跳过密码过期检查。生产环境务必确认权限最小化。











