ora-39002错误需先由dba创建数据库级directory对象并授权读写权限,再确认路径存在、oracle进程可访问且有足够磁盘空间;跨版本迁移须显式指定version参数匹配目标库compatible值。
ora-39002:directory对象不存在怎么办
导出前必须存在数据库级的 directory 对象,不是操作系统路径直接可用。dba 创建后,你还得有读写权限,否则 expdp 会报 ora-39002 + ora-39070。
- 让 DBA 执行:
CREATE DIRECTORY dpump_dir AS '/u01/dump';(路径需真实存在且 Oracle 进程可访问) - 再执行:
GRANT READ, WRITE ON DIRECTORY dpump_dir TO your_user; - 你自己查是否生效:
SELECT * FROM all_directories WHERE directory_name = 'DUMP_DIR';(注意大小写,Oracle 默认大写) - 别用中文或特殊字符命名
DIRECTORY,容易在 shell 命令里漏转义
expdp 报错 “KUP-04021: error creating file” 或 “ORA-27040: file create error”
这是操作系统层问题:Oracle 进程没权限在指定目录下建文件,或者磁盘满了、SELinux 拦着、挂载点是只读的。
- 确认 Oracle 用户(如
oracle)能touch /u01/dump/test.file,不能就改目录权限:chown oracle:oinstall /u01/dump && chmod 755 /u01/dump - 别把 dump 目录设在
/home/oracle下——很多系统限制非 root 用户无法创建硬链接,而 Data Pump 默认用硬链接加速元数据操作 - 如果用 ASM,
DIRECTORY必须指向 ASM 别名(如+DATA/dump),不能写裸设备路径 -
expdp不检查磁盘空间,但运行时失败才报错,建议导出前先df -h /u01
impdp 时提示 “ORA-39142: incompatible version”
版本不兼容不是指 Oracle 大版本,而是 Data Pump 导出时的 VERSION 参数和当前库的最低兼容版本冲突。比如 19c 库导出没加 VERSION=12.2,拿到 12c 库上直接 impdp 就会跪。
- 跨版本迁移务必显式加
VERSION=,值取目标库的COMPATIBLE参数值(查:SELECT value FROM v$parameter WHERE name = 'compatible';) - 导出端版本不能低于导入端的
COMPATIBLE,但可以高——高版本导出时加低版本VERSION是安全的 -
expdp ... VERSION=12.1生成的 dump 文件,12.1 及以上库都能读;但反过来不行 - 别依赖默认
VERSION,不同 Oracle 小版本默认值可能不同,尤其 19c 后部分补丁包改过行为
为什么 expdp 走了 network_link 却提示 “ORA-39001: invalid argument value”
NETWORK_LINK 不是随便连个 DBLINK 就行,它要求远端库也开了 Data Pump 服务,并且 DBLINK 用户具备 EXP_FULL_DATABASE 或至少 SELECT_CATALOG_ROLE + 对象级权限。
- 先在本地库确认 DBLINK 可用:
SELECT * FROM dual@remote_db; - 远端库必须启用调度器作业服务:
EXEC DBMS_SCHEDULER.ENABLE('SYS.PREDEFINED_JOB');(11g+ 默认开,但有些加固环境关了) -
expdp命令里写NETWORK_LINK=remote_db,不能带@或括号 - network_link 模式下,
DIRECTORY是本地库的,不是远端的——dump 文件写在你本地指定的目录里
实际跑通的关键不在参数多全,而在 DIRECTORY 是否被 Oracle 进程真正“看见”,以及跨版本/跨库时那个 VERSION 和 COMPATIBLE 的对应关系是否手动对齐。这两处一错,其他都白搭。










