怎样排查Oracle中ORA-28001密码已过期导致的连接中断?

作者:袖梨 2026-07-08
ORA-28001报错时需用DBA账号执行SELECT username, account_status, expiry_date, profile FROM dba_users WHERE username = 'YOUR_USER'确认是否真过期:account_status为EXPIRED/EXPIRED(GRACE)、expiry_date早于当前时间(2026-06-24)即证实过期,且必须核对profile实际绑定的PASSWORD_LIFE_TIME策略。

ORA-28001报错时连不上库,怎么快速确认是不是真过期?

别等应用报错才查——ora-28001出现时用户已经无法登录,必须用dba账号提前诊断。最直接的方式是查dba_users视图:
执行select username, account_status, expiry_date, profile from dba_users where username = 'your_user';
关键看三处:
account_statusexpiredexpired(grace) → 确实过期
expiry_date是过去时间(比如2026-02-28 00:00:00,而今天是2026-06-24)→ 过期成立
profile字段指向的配置文件,才是策略实际生效位置,不是用户自身存策略

改了PASSWORD_LIFE_TIME但还是登不进去,为什么?

因为PASSWORD_LIFE_TIME只约束未来行为,不回滚已发生的过期状态。
常见误操作包括:
• 把DEFAULT profile的PASSWORD_LIFE_TIME改成UNLIMITED,但目标用户绑定的是APP_PROFILE → 白改
• 查dba_profiles看到limit=90就以为生效,没确认该用户实际profile
• 忘记PASSWORD_GRACE_TIME设为0,导致过期后连改密机会都没有
验证绑定关系:先跑SELECT profile FROM dba_users WHERE username = 'YOUR_USER';,再查对应profile的限制:SELECT resource_name, limit FROM dba_profiles WHERE profile = 'YOUR_PROFILE' AND resource_name IN ('PASSWORD_LIFE_TIME', 'PASSWORD_GRACE_TIME');

DBA必须执行哪些SQL才能让过期用户恢复连接?

ALTER USER ... ACCOUNT UNLOCK或仅改profile完全无效。必须显式重置过期状态:
• 最常用:ALTER USER your_user IDENTIFIED BY new_password; → 密码+过期状态一并清除
• 想保留原密码但绕过当前阻塞:ALTER USER your_user PASSWORD EXPIRE; → 下次登录强制改密
• 如果account_status显示EXPIRED(GRACE)且被锁,需加ACCOUNT UNLOCKALTER USER your_user IDENTIFIED BY new_password ACCOUNT UNLOCK;
注意:IDENTIFIED BY old_password会触发ORA-28007(如果启用了密码历史),不能复用旧密码

密码改完,为什么应用还是连不上?

因为Oracle只管认证,不管下游配置是否同步。
必须人工更新所有依赖该密码的地方:
• 应用配置中心里的数据库连接串
• Kubernetes Secret 或 Docker env变量
• ETL工具、连接池(如 HikariCP)的password属性
• 定时任务脚本中的硬编码密码
尤其注意:管理控制台类系统(如数据中心注册页)往往缓存连接参数,改完密码后需反注册再重新注册,否则仍用旧凭据尝试连接

相关文章

精彩推荐