expdp/impdp是Oracle 11g用户级数据迁移最可靠方式,需先创建并授权DIRECTORY、预置用户与表空间、指定version兼容目标库版本,否则易报ORA-39070、ORA-31684等错误。
expdp 和 impdp 是 oracle 11g 迁移用户级数据最可靠的方式,前提是目标库已准备好对应用户、表空间和权限结构;直接用传统 exp/imp 容易在大对象、分区表或跨版本时失败。
创建并验证目录对象(DIRECTORY)是第一步,也是最容易卡住的地方
数据泵不接受本地路径,所有 .dmp 和 .log 文件必须写入数据库服务器上的物理目录,并通过 DIRECTORY 对象映射。跳过这步或权限没给对,expdp 会直接报 ORA-39070: 无法打开日志文件 或 ORA-39002: 操作无效。
- 先在操作系统层面建好目录(如 Linux):
mkdir -p /u01/app/oracle/dpump,再确保oracle用户有读写权限:chown oracle:oinstall /u01/app/oracle/dpump - 用
SYS或SYSTEM登录数据库执行:CREATE DIRECTORY dp_dir AS '/u01/app/oracle/dpump'; - 给导出用户授权:
GRANT READ, WRITE ON DIRECTORY dp_dir TO wf; - 验证是否可用:
SELECT * FROM dba_directories WHERE directory_name = 'DP_DIR';,确认ORACLE_DIRECTORY_PATH列显示的是真实路径
导出时加 VERSION 参数才能兼容低版本目标库
如果目标库是 Oracle 10g 或更早版本,不加 VERSION,impdp 会在导入时报 ORA-39142: 不支持的版本号 —— 因为 11g 默认生成的 dump 文件包含高版本元数据,低版本解析不了。
- 导出命令中必须显式指定目标库版本,例如迁到 10.2.0.5:
expdp wf/xxx schemas=WF directory=DP_DIR dumpfile=wf_20260428.dmp logfile=wf_exp.log version=10.2.0.5 -
version值不能瞎写,得和目标库V$VERSION输出一致,比如查目标库:SELECT * FROM v$version; - 如果目标库也是 11g,可省略
version;但只要存在跨版本可能,就建议始终带上
导入前必须手动创建用户和表空间,否则 impdp 会失败
impdp 默认不会自动建用户或分配表空间,它只负责还原对象。若目标库没有 WF 用户,或该用户默认表空间不存在,会报 ORA-31684: 对象类型 USER:"WF" 已存在(如果用户已存在但表空间不对)或更常见的 ORA-01918: 用户 'WF' 不存在。
- 先在目标库执行:
CREATE TABLESPACE wf_ts DATAFILE '/u01/oradata/wf_ts01.dbf' SIZE 500M AUTOEXTEND ON; - 再建用户:
CREATE USER wf IDENTIFIED BY "xxx" DEFAULT TABLESPACE wf_ts TEMPORARY TABLESPACE temp; - 授必要权限:
GRANT CONNECT, RESOURCE, UNLIMITED TABLESPACE TO wf;(若需导入 DBA 级对象,还得加EXP_FULL_DATABASE) - 导入命令示例:
impdp system/xxx schemas=WF directory=DP_DIR dumpfile=wf_20260428.dmp logfile=wf_imp.log remap_schema=WF:WF remap_tablespace=USERS:wf_ts
LOB、分区表、长字段这些对象容易被忽略,但影响导入成败
导出时看似成功,导入却卡在某张表,大概率是 LOB 字段或分区定义没对齐。特别是源库用了 LONG 类型列,expdp 会跳过它且不报错,导致目标库数据不全。
- 检查源库是否有
LONG:SELECT owner, table_name, column_name FROM dba_tab_columns WHERE data_type = 'LONG' AND owner IN ('WF'); - 查 LOB 占用空间:
SELECT owner, segment_name, SUM(bytes)/1024/1024 M FROM dba_segments WHERE segment_type LIKE '%LOB%' AND owner IN ('WF') GROUP BY owner, segment_name; - 导出时若要确保完整,可加参数:
expdp ... exclude=STATISTICS,CONSTRAINT,REF_CONSTRAINT(避免约束冲突),但不要 exclude=LOB 或 PARTITION - 导入后务必核对行数:
SELECT COUNT(*) FROM wf.table_xxx@source;vsSELECT COUNT(*) FROM wf.table_xxx@target;
实际迁移中最耗时的不是命令本身,而是目录权限校验、版本匹配确认、用户与表空间预置这三步——它们不出错,后续才谈得上效率。漏掉任意一个,impdp 就会停在“正在启动作业”不动,或者报一堆模糊的 ORA 错误。


















