Oracle 19c执行PDB数据泵导出报ORA-39087目录名无效问题求助
Oracle 19c PDB数据泵导出目录无效报错解决方案
报错根因
你执行create directory操作时默认连接的是根容器CDB$ROOT,Oracle中的目录对象属于容器级别专属对象,在CDB根容器创建的目录默认不会同步到下属PDB中。你执行expdp时直接连接PDB1,自然无法识别CDB层面创建的DATAPUMP目录。
排查步骤
- 先确认创建目录时所在的容器:登录sqlplus执行
show con_name,如果返回值为CDB$ROOT,即可验证根因。 - 切换到PDB1查询目录是否存在:
alter session set container=PDB1; select directory_name, directory_path from dba_directories where directory_name='DATAPUMP';
如果查询无返回结果,即可确认PDB1中不存在该目录对象。
- 验证操作系统目录权限:确认
/u02/dp_exp_dir的属主为oracle:oinstall、权限为775,这一步你已提前配置,可排除该类问题。
解决方法
以下两种方案任选其一即可:
方案1:在PDB1内部创建目录(推荐,PDB资源隔离性更好)
sqlplus / as sysdba -- 切换到PDB1容器 alter session set container=PDB1; -- 若PDB未启动则先启动 alter pluggable database PDB1 open; -- 在PDB内部创建目录 create directory datapump as '/u02/dp_exp_dir'; -- 给system用户授予目录读写权限 GRANT READ, WRITE ON DIRECTORY datapump TO system;
配置完成后重新执行原有expdp导出命令即可。
方案2:创建CDB级别公共目录
sqlplus / as sysdba -- 确认当前在CDB$ROOT容器,创建公共目录需加##前缀 create directory ##datapump as '/u02/dp_exp_dir'; -- 给所有容器的system用户授予目录权限 grant read, write on directory ##datapump to system container=all;
导出时修改目录参数即可:
expdp system/SysPassword1@PDB1 full=Y directory=##datapump dumpfile=DB10G.dmp logfile=expdpDB10G.log
内容的提问来源于stack exchange,提问作者G16
相关产品推荐
相关产品推荐

