Oracle 19c中将DEFAULT PROFILE的PASSWORD_LIFE_TIME设为UNLIMITED可解除密码180天过期限制,命令为ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED,该操作即时生效但不影响已过期用户,需单独重置其密码。
Oracle 19c 修改 DEFAULT PROFILE 密码有效期为无限期
oracle 19c 默认使用 default profile,其 password_life_time 通常设为 180 天——这意味着账号到期后无法登录,哪怕密码正确也会报 ora-28001: the password has expired。直接改这个 profile 是最常用也最有效的解法。
操作前确认当前 profile:
SELECT profile, resource_name, limit FROM dba_profiles WHERE profile = 'DEFAULT' AND resource_name = 'PASSWORD_LIFE_TIME';
执行修改(需 ALTER PROFILE 权限,通常 DBA 拥有):
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;- 该命令立即生效,**不影响已过期用户**;对已过期账号,仍需手动重置密码(
ALTER USER username IDENTIFIED BY ...)才能登录 - 如果用的是自定义 profile(比如
APP_PROFILE),把DEFAULT替换成对应名称即可 - 注意:
UNLIMITED不是字符串,不能加引号;写成'UNLIMITED'会报ORA-00922: missing or invalid option
为什么 ALTER PROFILE 后新用户还是 180 天?
新建用户默认继承 DEFAULT profile,但 profile 修改只影响后续认证行为,不回溯已创建用户的状态。真正决定新用户初始密码策略的,是 profile 当前设置——所以改完 DEFAULT 后,新创建的用户确实会获得无限期密码有效期。
常见误判点:
- 在改 profile 前就创建了测试用户,误以为“没生效”;实际应创建全新用户验证
- 连接时用了连接池或中间件(如 Tomcat JDBC),缓存了旧连接或旧认证上下文,导致现象延迟
- 数据库启用了
SEC_CASE_SENSITIVE_LOGON=TRUE(12c+ 默认),和密码有效期无关,但错误提示容易混淆
不想动 DEFAULT PROFILE?用自定义 profile 更安全
生产环境直接改 DEFAULT profile 有风险:万一误设其他参数(如 FAILED_LOGIN_ATTEMPTS),可能批量锁死用户。更稳妥的做法是建新 profile 并显式分配给用户。
示例流程:
CREATE PROFILE app_nopwexp LIMIT PASSWORD_LIFE_TIME UNLIMITED;ALTER USER scott PROFILE app_nopwexp;- 验证:
SELECT profile FROM dba_users WHERE username = 'SCOTT';应返回APP_NOPWEXP - 注意:profile 名称区分大小写,且不能超过 30 字符;
CREATE PROFILE需CREATE PROFILE系统权限
密码有效期相关参数别漏掉其他限制
PASSWORD_LIFE_TIME 只是密码生命周期的一环。如果只设它为 UNLIMITED,但 PASSWORD_REUSE_TIME 或 PASSWORD_REUSE_MAX 卡得死,用户依然可能被强制改密失败。
建议一并检查:
-
PASSWORD_GRACE_TIME:宽限期,默认 7 天,过期后还能登几次;设为0或UNLIMITED可关闭提醒 -
PASSWORD_REUSE_MAX和PASSWORD_REUSE_TIME:控制历史密码重用,设为UNLIMITED才真正放开密码复用 - 所有参数都通过
ALTER PROFILE ... LIMIT ...设置,单条命令只能改一个参数,不能逗号连写
真正麻烦的不是改哪一行命令,而是改完之后忘了通知应用方:有些 Java 应用会自己校验密码有效期(比如用 oracle.jdbc.driver.OracleDriver 连接时抛出 SQLException),这种校验跟数据库无关,profile 改了也没用。










