ORA-01918 错误主因是当前容器(CDB/PDB)中查无该用户,或用户名大小写不匹配、状态非OPEN、目标库缺失对应用户;需先确认容器、统一大小写查询、检查account_status,导入时应预建用户或使用REMAP_SCHEMA。
ora-01918 不是“账号丢了”,而是当前连接上下文里根本查不到那个用户名——拼写、大小写、容器(cdb/pdb)、状态,任何一个环节错位都会触发它。
确认当前连接的是哪个容器(CDB vs PDB)
Oracle 12c+ 多租户环境下,dba_users 视图只返回当前容器中的用户。连在 CDB$ROOT 却去查一个只存在于 ORCLPDB 的用户,必然报 ORA-01918。
- 执行
SHOW CON_NAME看当前容器名 - 如果返回
CDB$ROOT,而用户实际在 PDB 中,必须先切换:ALTER SESSION SET CONTAINER = ORCLPDB(把ORCLPDB换成你的 PDB 名) - 再执行
SHOW CON_NAME确认已切换成功 - 切容器后仍需用 DBA 权限登录(如
sqlplus / as sysdba),普通用户无法切换容器
查用户前先统一大小写并核对拼写
Oracle 默认将用户名转为大写存储,但应用配置里若用了小写或混合写法(如 scott 或 SCOTT),而查询时没用 UPPER(),就可能漏掉。
- 用
SELECT username FROM dba_users WHERE username = UPPER('your_user')查询,别直接写= 'your_user' - 检查应用连接字符串里的
username参数:是否多空格、下划线错位、中英文标点混用(比如用了中文冒号) - 特别注意 EF 等 ORM:默认会尝试访问
dboschema,而 Oracle 没这个用户,必须显式设置modelBuilder.HasDefaultSchema("YOUR_SCHEMA")
用户存在但 account_status 不是 OPEN
查到了用户,但状态是 LOCKED、EXPIRED 或 EXPIRED(GRACE),Oracle 仍会拒绝连接,并可能在某些路径下表现为“用户不存在”。
- 执行
SELECT username, account_status FROM dba_users WHERE username = UPPER('YOUR_USER') - 若状态异常,解锁并重置密码:
ALTER USER YOUR_USER ACCOUNT UNLOCK和ALTER USER YOUR_USER IDENTIFIED BY newpass - 注意:12c+ 中新创建的用户默认不带
CREATE SESSION权限,即使解锁也无法登录,需补授:GRANT CREATE SESSION TO YOUR_USER
导入数据时遇到 ORA-01918:目标库缺用户
用 impdp 导入 dmp 文件时,若文件里对象属于用户 A,但目标库没有用户 A,就会报这个错——不是脚本写错了,是环境没准备好。
- 最稳妥做法:先在目标库创建用户 A(含表空间配额、角色授权),再导入
- 快速绕过方式:用
REMAP_SCHEMA=A:B把 A 的对象映射到已有用户 B 下(B 必须存在且有对应权限) - 若还报表空间不存在,加
REMAP_TABLESPACE=old_ts:new_ts;查现有表空间用:SELECT tablespace_name FROM dba_tablespaces -
REMAP_SCHEMA不会自动建用户,也不会迁移用户权限,仅迁移对象
真正容易被忽略的是容器切换和大小写处理——很多人反复查 dba_users 都没结果,其实只是卡在 CDB$ROOT 里,或者输了个小写的用户名去匹配大写的记录。


















