必须先创建DIRECTORY对象,否则expdp报ORA-39002错误;SCHEMAS与TABLES参数互斥,不可共存;默认导出结构和数据,禁用content=metadata_only;跨用户导入须配remap_schema。
expdp用SCHEMAS参数导出用户结构和数据,必须先建DIRECTORY对象
不创建directory对象就直接跑expdp命令,会报错ora-39002: invalid operation,根本进不了导出流程。这不是权限问题,是oracle硬性要求——所有dumpfile和logfile路径都必须通过数据库级的directory对象映射,不能写绝对路径。
操作要点:
- 在SQL*Plus或SQL Developer中以DBA身份执行:
CREATE OR REPLACE DIRECTORY DUMP_DIR AS '/u01/app/oracle/dump' - 物理目录得提前在操作系统里建好:
mkdir -p /u01/app/oracle/dump,且Oracle进程用户(如oracle)要有读写权限 - 给导出用户授目录权限:
GRANT READ, WRITE ON DIRECTORY DUMP_DIR TO myuser - 验证是否生效:
SELECT * FROM dba_directories WHERE directory_name = 'DUMP_DIR',查不到就白搭
SCHEMAS参数和TABLES参数不能共存,选错就报UDE-00011
想导出某个用户下全部对象,用SCHEMAS=myuser;想只导其中几张表,就得换TABLES=myuser.table1,myuser.table2。两者同时出现,expdp直接拒绝执行,报错UDE-00011: parameter SCHEMAS is incompatible with parameter TABLES。
常见误操作场景:
- 复制了别人导全库的命令,删掉
FULL=Y却忘了删SCHEMAS=...,又手抖加了TABLES=... - 用
parfile时,在同一文件里写了两行,一行schemas=...,一行tables=... - 想“保险起见”把两个参数都带上,以为Oracle会自动取交集——它不会,直接报错退出
导出结构+数据是默认行为,但要注意content=metadata_only的陷阱
expdp默认导出结构和数据,不需要额外指定参数。但很多人搜教程时看到content=metadata_only就顺手抄上,结果导出来的.dmp里只有建表语句、索引、约束,没一行数据——这恰恰是content=metadata_only的设计目的。
如果你要的是带数据的完整导出,确保命令里:
- 没出现
content=metadata_only - 也没出现
content=data_only(只导数据,没结构) - 更别写
rows=n(那是老exp工具的参数,expdp不认,会报UDE-00008: unrecognized parameter)
正确示例:expdp myuser/mypass@orcl directory=DUMP_DIR dumpfile=myuser_full.dmp logfile=myuser_full.log schemas=myuser
导入时remap_schema必须配对,否则对象全进错用户
导出用schemas=myuser,导入时若目标库没有同名用户,或你想把数据放进另一个用户(比如从dev_user迁到prod_user),就必须用remap_schema=myuser:prod_user。漏掉这个,impdp会尝试往myuser下建对象,而该用户在目标库可能根本不存在,直接报ORA-39142: incompatible version number或ORA-39083对象创建失败。
关键细节:
-
remap_schema只改对象属主,不改SQL里的硬编码用户名(比如触发器体内的INSERT INTO myuser.t1不会被替换) - 如果源用户有同义词、DBLINK等跨用户引用,
remap_schema不处理这些,得手动调整 - 目标用户必须已存在,且有对应表空间配额,否则表能建、数据插不进去
导出看似一步命令,实际卡点全在前置目录、参数互斥、内容模式和导入映射这四块。最容易被忽略的是:DIRECTORY对象的物理路径权限、SCHEMAS与TABLES的排他性、以及remap_schema在跨环境迁移时的强制必要性——少一个,不是报错就是数据落错地方。


















