Oracle 19c密码过期策略必须通过PROFILE实现,DEFAULT PROFILE默认启用180天过期;需先查用户绑定的PROFILE,再查其参数;推荐新建PROFILE而非修改DEFAULT;UNLIMITED禁用过期,DEFAULT继承默认值;已有用户expiry_date不自动更新,需改密才重算。
oracle 19c 中用户密码过期策略必须通过 profile 实现,无法对单个用户直接设置;默认的 default profile 已启用密码过期(password_life_time = 180 天),不显式修改就会生效。
查看当前用户的 PROFILE 和密码策略
先确认目标用户实际绑定的是哪个 PROFILE,再查该 PROFILE 的具体参数——很多人改了 DEFAULT PROFILE 却忘了查用户是否被显式指定了其他 PROFILE。
执行以下语句:
SELECT username, profile FROM dba_users WHERE username = 'YOUR_USER';
再查 PROFILE 设置:
SELECT resource_name, limit FROM dba_profiles WHERE profile = 'YOUR_PROFILE_NAME' AND resource_type = 'PASSWORD';
常见关键参数包括:PASSWORD_LIFE_TIME、PASSWORD_REUSE_TIME、PASSWORD_REUSE_MAX、FAILED_LOGIN_ATTEMPTS、PASSWORD_LOCK_TIME。
创建或修改 PROFILE 来控制密码过期
不建议直接修改 DEFAULT PROFILE(影响所有未显式指定 PROFILE 的用户);推荐新建专用 PROFILE,再分配给用户。
例如,创建一个永不过期的密码策略:
CREATE PROFILE app_user_pwd NO LIMIT; ALTER PROFILE app_user_pwd LIMIT PASSWORD_LIFE_TIME UNLIMITED;
若需 90 天过期 + 登录失败 5 次锁定 1 小时:
-
PASSWORD_LIFE_TIME设为90 -
FAILED_LOGIN_ATTEMPTS设为5 -
PASSWORD_LOCK_TIME设为1/24(单位是天,即 1 小时)
注意:UNLIMITED 和 DEFAULT 不同——DEFAULT 表示继承 PROFILE 定义时的默认值(通常是 180),而 UNLIMITED 才真正禁用过期。
将 PROFILE 分配给用户并验证效果
用 ALTER USER 绑定 PROFILE,且该操作会立即生效(无需重启实例或重连):
ALTER USER scott PROFILE app_user_pwd;
验证是否生效:
- 查
dba_users确认profile字段已更新 - 查
dba_users的expiry_date字段:若为NULL或远期时间,说明新策略已应用(注意:只有密码被修改或首次创建用户时,expiry_date才按PASSWORD_LIFE_TIME推算;已有用户不会自动重算,除非改密)
关键细节:已有用户的 expiry_date 不会因 PROFILE 修改而自动刷新。如需强制重置过期时间,需执行 ALTER USER ... IDENTIFIED BY <em>same_password</em> REPLACE <em>old_password</em>; 或直接改密。
常见陷阱和兼容性提醒
Oracle 19c 默认启用密码复杂度校验(VERIFY_FUNCTION),但该函数在 19c 中已被标记为废弃,新部署建议用 ORA12C_STRONG_VERIFY_FUNCTION;若 PROFILE 中仍引用旧函数,创建时会报错 ORA-28030: server failed to initialize。
另外:PASSWORD_GRACE_TIME 控制宽限期(过期后还能登录多少天),设为 0 表示过期即锁死,但部分 JDBC 驱动在宽限期会静默失败,建议设为 7 并配合监控告警。
真正容易被忽略的是:PROFILE 修改后,expiry_date 不自动更新——线上用户突然无法登录,八成是因为这个延迟效应没被意识到。

















