必须先创建DIRECTORY对象并授权:CREATE OR REPLACE DIRECTORY dpump_dir AS '/u01/app/oracle/dpdump'; GRANT READ,WRITE ON DIRECTORY dpump_dir TO scott; 且Oracle进程需有目录读写权限。
怎么创建 Data Pump 目录对象(DIRECTORY)
oracle data pump 不是直接读写文件系统路径,而是通过数据库内建的 directory 对象做中间映射——没这一步,expdp 或 impdp 会直接报错 ora-39002: invalid operation 或更具体的 ora-39070: unable to open the log file。
必须由具备 CREATE ANY DIRECTORY 权限的用户(通常是 SYSTEM 或 SYS)执行:
CREATE OR REPLACE DIRECTORY dpump_dir AS '/u01/app/oracle/dpdump';
注意三点:
-
/u01/app/oracle/dpdump是数据库服务器本地路径,不是客户端机器路径 - Oracle 进程(通常是
oracle用户)必须对该目录有读写权限:chown oracle:oinstall /u01/app/oracle/dpdump && chmod 755 /u01/app/oracle/dpdump - 创建后需授权给实际执行导出/导入的用户,比如:
GRANT READ, WRITE ON DIRECTORY dpump_dir TO scott;
为什么不能用 $ORACLE_HOME/rdbms/log 这类默认路径
很多人图省事想复用 Oracle 自带目录,但 expdp 默认拒绝使用非显式授权的 DIRECTORY,哪怕路径存在、权限正确也不行——这是安全机制,不是 bug。
典型错误现象:ORA-39001: invalid argument value + ORA-39000: bad dump file specification,往往就是因为你传了物理路径(如 DUMPFILE=/u01/backup/scott.dmp),而没配合 DIRECTORY 参数。
正确做法只有两个:
- 用
DIRECTORY对象名代替路径前缀:DUMPFILE=dpump_dir:scott.dmp - 或在参数文件里写成
directory=dpump_dir+dumpfile=scott.dmp,两者必须配套
导出时提示 ORA-39171: Job is experiencing a resumable wait
这不是权限或路径问题,而是 Data Pump 在等空间释放——常见于目标 DIRECTORY 所在文件系统满、或数据库表空间不足。但日志里不会直说“磁盘满了”,只会卡在 resumable wait。
检查顺序建议:
- 登录服务器跑
df -h /u01/app/oracle/dpdump,确认剩余空间 > 预估 dump 文件大小 × 1.5(压缩率不确定) - 查数据库:
SELECT tablespace_name, used_percent FROM dba_tablespace_usage_metrics;,重点关注SYSAUX和用户默认表空间 - 如果用了
COMPRESSION=ALL,注意它会显著增加 CPU 和临时段消耗,小内存实例容易触发等待
导入时遇到 ORA-39083 + ORA-01917:用户不存在或角色未授权
这是元数据导入阶段最常被忽略的依赖问题。impdp 默认尝试重建原库中的用户、角色、权限,但如果目标库没有提前创建对应用户,或没给 IMP_FULL_DATABASE 角色,就会批量失败。
稳妥做法分两步走:
- 先导出时加
EXCLUDE=USER,ROLE,SYSTEM_GRANT(如果只是迁移应用数据) - 或导入前手动建好用户并赋权:
CREATE USER scott IDENTIFIED BY tiger; GRANT CONNECT, RESOURCE TO scott; - 若必须带用户导入,执行
impdp ... SCHEMAS=scott CONTENT=METADATA_ONLY EXCLUDE=STATISTICS先过一遍结构,再补数据
特别注意:19c 默认启用 PDB,如果导出的是 CDB 级别对象,而你在 PDB 里运行 impdp,会直接报 ORA-39142: incompatible version number ——得确认 expdp 的 VERSION 参数和当前兼容性匹配,或者改用 NETWORK_LINK 方式跨容器导入。

















