oracle服务账号密码过期本质是default概要文件中password_life_time限制(默认180天)所致,需先查用户绑定的profile,再用sysdba执行alter profile ... limit password_life_time unlimited修改,并对已过期账号执行alter user ... identified by "原密码"重置状态。

Oracle服务账号密码定期过期,本质是 DEFAULT 概要文件中 PASSWORD_LIFE_TIME 限制在起作用,默认值通常是 180 天。不改它,任何绑定 DEFAULT 的账号都会到期——这不是 bug,是 Oracle 的默认安全策略。
查清楚当前账号用的是哪个 profile
服务账号(比如 app_user、etl_svc)是否真受 DEFAULT 管控,得先确认。很多团队误以为改了 DEFAULT 就万事大吉,结果发现目标账号绑的是自定义 profile。
- 用
SYS或SYSTEM登录后执行:SELECT username, profile FROM dba_users WHERE username = '你的服务账号名'; - 如果返回的
profile是DEFAULT,后续改 DEFAULT 即可;如果是其他名字(如APP_PROFILE),就得对应去改那个 profile - 注意大小写:Oracle 默认用户名和 profile 名是大写的,查询时别写小写漏匹配
修改 profile 的 PASSWORD_LIFE_TIME 为 UNLIMITED
这是最直接有效的解法,但必须用 DBA 权限执行,且不能在普通用户连接下操作。
- 推荐本地登录方式(免密码、不依赖网络配置):
sqlplus / as sysdba - 执行语句:
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED; - 如果还想屏蔽“密码将在 X 天后过期”的提醒弹窗,顺手加上:
PASSWORD_GRACE_TIME UNLIMITED - 执行后看到
Profile altered.才算成功;若报错ORA-01917: user or role 'DEFAULT' does not exist,说明你连错了实例或权限不足
已过期的服务账号必须重置密码状态
改完 profile 只影响新密码或未来新建用户,对已经触发过期倒计时的账号无效——它不会自动“续命”。这时候连 sqlplus app_user/xxx@db 都会卡在密码过期提示里。
- 仍需
sysdba登录,然后执行:ALTER USER app_user IDENTIFIED BY "原密码"; - 注意:双引号不是可选的,如果原密码含特殊字符或数字开头,不加引号会报
ORA-00922: missing or invalid option - 这条语句不会真正改密码,只是刷新该账号的密码生命周期计时器,相当于“重置过期状态”
- 如果账号已被锁(
ACCOUNT_STATUS为EXPIRED(GRACE)或LOCKED),先解锁:ALTER USER app_user ACCOUNT UNLOCK;
生产环境更稳妥的做法:单独建 profile
直接动 DEFAULT profile 在审计严格或多人共管的环境中容易出问题——它会影响所有没显式指定 profile 的用户,包括未来新建的测试账号、临时账号等。
- 创建专用 profile:
CREATE PROFILE svc_noexpire LIMIT PASSWORD_LIFE_TIME UNLIMITED; - 绑定到服务账号:
ALTER USER app_user PROFILE svc_noexpire; - 好处是策略隔离:DEFAULT 保持原样供审计检查,服务账号独立受控,出问题也只影响单点
- 缺点是多一步操作,且需确保应用重启后连接池能正确识别新 profile 生效(一般无需重启数据库)
真正容易被忽略的是:改完 profile 后不处理已过期账号的状态,或者用错登录方式(比如远程连 sys/xxx@ip:port/sid 却没配好 tnsnames.ora),导致以为命令没生效。实际多数失败都卡在这两步上,而不是 SQL 写错了。











