ora-28002是密码到期前7天的预警提示,不影响登录,本质是profile中password_life_time策略触发的安全提醒;需先查用户profile及对应策略值,再结合alter user重置已预警用户密码与alter profile调整长期策略。
ora-28002 报错本质是 profile 策略触发的预警,不是连接失败
ora-28002 不会阻止你登录,它只是 oracle 在密码到期前 7 天发出的“温柔提醒”——error: ora-28002: the password will expire within 7 days 后面紧跟着 connected to...,说明连接已成功。很多人误以为这是故障,其实它是安全机制在起作用:只要用户所属 profile 中 password_life_time 设了期限(默认 180),且当前密码使用天数接近该阈值,就会触发该提示。
- 真正影响使用的不是这个警告,而是后续的
ORA-28001(密码已过期)或ORA-28007(过期后尝试改回旧密码) -
PASSWORD_GRACE_TIME(默认7)才是决定“过期后还能用几天”的关键,它和 ORA-28002 的“7 天”数值一致,但两者角色不同:前者控制宽限期,后者是倒计时提示起点 - 即使把
PASSWORD_LIFE_TIME改成UNLIMITED,已进入预警状态的用户仍需手动改一次密码,否则下次登录还会看到 ORA-28002
查清用户用的是哪个 profile 和当前策略值
不能盲目改,先确认问题范围。多数用户用的是 DEFAULT profile,但生产环境可能有自定义 profile(比如 APP_PROFILE),改错 profile 毫无效果。
- 查用户绑定的 profile:
SELECT username, profile FROM dba_users WHERE username = 'YOUR_USER'; - 查该 profile 的密码有效期:
SELECT limit FROM dba_profiles WHERE profile = 'DEFAULT' AND resource_name = 'PASSWORD_LIFE_TIME';—— 返回180就是标准 Oracle 默认值 - 顺手看看宽限期:
SELECT limit FROM dba_profiles WHERE profile = 'DEFAULT' AND resource_name = 'PASSWORD_GRACE_TIME';—— 若为0,则密码一过期就锁死;若为UNLIMITED,宽限期无限,但 ORA-28002 提示仍会在到期前 7 天出现
两种处理路径:治标(单用户重置) or 治本(调 profile 策略)
DBA 权限下可选其一,但二者常需配合使用。单独改 profile 不解决已预警用户的提示;单独改密码不防新用户未来再遇同样问题。
- 快速治标(推荐给临时救急):
ALTER USER your_user IDENTIFIED BY your_password;—— 密码可与原密码相同,执行后该用户下次登录不再报 ORA-28002 - 治本调整(适合长期运维):
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;—— 修改立即生效,无需重启数据库;但注意:这仅对尚未触发预警的用户生效 - 如需兼顾安全合规(比如审计要求定期换密),可设为具体天数,例如:
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME 90; - 特别注意 dblink 场景:如果应用报 ORA-28002 且含数据库链接,要检查 dblink 所用远程用户的密码是否也快过期,单独重置那个用户
容易被忽略的关键点:改完 profile 必须重置已预警用户密码
这是最常踩的坑。很多 DBA 执行了 ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED; 就以为万事大吉,结果用户下次登录还是看到 ORA-28002。因为 Oracle 把“是否已进入预警周期”这个状态记在用户元数据里,profile 修改不刷新该状态。
- 必须对每个已收到提示的用户补一句:
ALTER USER username IDENTIFIED BY current_password; - 没有快捷批量命令,得逐个操作;可通过脚本生成语句:
SELECT 'ALTER USER ' || username || ' IDENTIFIED BY ' || password || ';' FROM dba_users WHERE account_status LIKE '%EXPIRED(GRACE)%' OR expiry_date - SYSDATE (注意:<code>password字段在 11g+ 已不可见,实际需人工确认或统一设新密码) - 如果用户用的是外部认证(OS/AD),或密码由应用硬编码,重置后务必同步更新应用配置,否则连不上










