用户登录失败且密码确认无误时,应先查其绑定的profile是否存在:SELECT username, profile FROM dba_users WHERE username='SCOTT';再查该profile是否在dba_profiles中存在,若不存在则需ALTER USER SCOTT PROFILE DEFAULT恢复登录。

查用户绑定的 profile 是否真实存在
用户登录失败,报 ORA-01918: user 'SCOTT' does not exist 或更隐蔽的 ORA-01017: invalid username/password,但确认密码无误时,要先验证 profile 是否还存在。Oracle 用户创建时若指定了不存在的 profile(比如拼写错误或已被 DROP PROFILE ... CASCADE),该用户仍能创建成功,但后续登录会因 profile 缺失而失败——不是报 profile 不存在,而是静默拒绝认证。
用 SYS 登录后执行:
SELECT username, profile FROM dba_users WHERE username = 'SCOTT';
再查该 profile 是否在数据库中:
SELECT profile FROM dba_profiles WHERE profile = 'MISSING_PROFILE';
如果第二条查不到结果,说明 profile 确实丢失。
- profile 名默认大写,
SELECT时必须严格匹配大小写 - 若用户是用双引号创建的(如
CREATE USER "scott" ... PROFILE "MyProfile"),查询和修复都必须带引号 - 注意:
dba_users.profile字段值为空字符串('')也代表使用DEFAULT,不是缺失
用 ALTER USER 切换到存在的 profile
只要目标 profile 存在(哪怕只是 DEFAULT),就能立刻恢复登录能力。不需要重设密码、不依赖事务、不需重启实例。
执行语句:
ALTER USER SCOTT PROFILE DEFAULT;
如果 DEFAULT 也被删了(极少见),可先重建:
CREATE PROFILE DEFAULT LIMIT FAILED_LOGIN_ATTEMPTS UNLIMITED;
常见错误场景:
-
ALTER USER scott PROFILE default;→ 失败,因为 profile 名不区分大小写但必须全大写(除非建时加引号) - 执行后仍登不上 → 检查是否还有其他叠加问题:
account_status是LOCKED或EXPIRED,需同步处理 - 应用连接池缓存了旧连接配置,改完 profile 后需重启应用或清空连接池
为什么 profile 会“消失”?生产环境高频诱因
profile 不是随用户自动创建的资源,它的生命周期独立于用户。以下操作会直接导致 profile 缺失:
-
DROP PROFILE my_profile CASCADE;→ 关联的所有用户 profile 字段不变,但实际引用失效 - 用 Data Pump 导入用户时未导出 profile 定义(
INCLUDE=PROFILE未设置),目标库缺少对应 profile - DBA 手动清理测试环境,误删了生产用户共用的 profile(如
APP_USER_PROFILE)
预防建议:
- 所有自定义 profile 命名加前缀(如
PROD_APP_PROFILE),避免与系统 profile(如ORA_STIG_PROFILE)混淆 - 执行
DROP PROFILE前,先查哪些用户在用:SELECT username FROM dba_users WHERE profile = 'MY_PROFILE'; - 自动化部署脚本中,profile 创建必须放在用户创建之前,且显式检查
dba_profiles中是否存在
profile 缺失时,密码策略还生效吗?
不生效。Oracle 在用户登录认证阶段,会先加载其 profile 中的密码参数(如 PASSWORD_LIFE_TIME、FAILED_LOGIN_ATTEMPTS)。若 profile 不存在,这些参数全部退化为系统默认行为:密码永不过期、登录失败不限次——但这不是“宽松”,而是“认证流程中断”,最终表现为登录被拒。
关键点:
-
RESOURCE_LIMIT参数对密码类限制无效,所以 profile 缺失不会触发 “资源限制未启用” 类提示 -
SEC_CASE_SENSITIVE_LOGON这类全局参数也不起作用,真正起效的是 profile 绑定的PASSWORD_VERIFY_FUNCTION - 最稳妥的兜底方式:始终确保每个用户至少绑定
DEFAULT,不要依赖“没指定就用 default”的模糊认知——显式指定更可靠


















