Oracle Data Pump实战:expdp/impdp常用参数与导入导出命令整理_20260406

官方文档:Oracle 数据泵https://docs.oracle.com/en/database/oracle/oracle-database/19/sutil/oracle-data-pump.html#GUID-501A9908-BCC5-434C-8853-9A6096766B5A

数据泵 = Oracle 的导出导入工具。
expdp 负责导出,impdp 负责导入。

常用于迁移数据库、复制环境、恢复表或 schema

在 Oracle 运维里,数据库迁移、环境复制、对象恢复、测试库初始化,这几类工作基本都绕不开数据泵。

Oracle 从 10g 开始提供 Data Pump,也就是我们常说的:

  • expdp:Export Data Pump,用于导出对象和数据

  • impdp:Import Data Pump,用于导入对象和数据

可以把它理解成一组配套命令:

  • expdp 负责把数据库内容"打包带走"

  • impdp 负责把这些内容"解包落地"

相比老版本 exp/imp,数据泵由数据库服务器端执行,使用服务端进程创建 Job 来完成导出导入,性能更高、功能更完整,也更适合生产环境使用。


一、先把 DIRECTORY 讲明白

这个点特别关键,也是最容易踩坑的地方。

在命令里经常会看到:

复制代码
DIRECTORY=DMPDIR

这里的 DMPDIR 不是 Linux 上的目录路径本身 ,而是 Oracle 数据库里的 DIRECTORY 对象名

它背后会映射到服务器上的一个真实目录,比如 /data/expdp

也就是说,正式执行前,一般要先做两步。

1)服务器上创建真实目录

复制代码
df -h
mkdir -p /data/expdp
chown -R oracle:oinstall /data/expdp
chmod 755 /data/expdp
# 创建数据泵文件存放目录,并赋予 oracle 用户访问权限

2)数据库中创建 DIRECTORY 对象并授权

复制代码
su - oracle
export ORACLE_SID=本机实例名
sqlplus / as sysdba

CREATE OR REPLACE DIRECTORY DMPDIR AS '/data/expdp';
-- 创建目录对象 DMPDIR,对应服务器目录 /data/expdp

GRANT READ, WRITE ON DIRECTORY DMPDIR TO system;
GRANT READ, WRITE ON DIRECTORY DMPDIR TO scott;
-- 授权相关用户使用该目录对象

3)检查是否创建成功

复制代码
SELECT directory_name, directory_path
FROM dba_directories
WHERE directory_name = 'DMPDIR';
-- 查看 DIRECTORY 对象对应的实际路径

一句话记住:

DIRECTORY= 后面写的是 Oracle 目录对象名,不是操作系统路径。


二、生产环境常用参数速查

参数不用全记,生产里真正高频的就那么几类:DIRECTORYDUMPFILELOGFILESCHEMASTABLESFULLCONTENTPARALLELPARFILE,以及导入时的 REMAP_*TABLE_EXISTS_ACTION

其余像 ATTACHNETWORK_LINKVIEWS_AS_TABLES,不是天天用,但碰到特定场景会很好使。原文里这些参数和常用命令都列得比较全,我这里做了适合博客阅读的压缩整理。

1)expdp 常用参数

复制代码
expdp 语法:
expdp 用户名/密码 参数名=参数值
expdp KEYWORD=value or KEYWORD=(value1,value2,...,valueN)

最简单示例:
expdp scott/tiger DIRECTORY=DMPDIR DUMPFILE=scott.dmp

DIRECTORY=DMPDIR
指定 Oracle DIRECTORY 目录对象。dump 文件和日志文件都会写到这个对象对应的服务器路径下。

DUMPFILE=scott_%U.dmp
指定导出文件名。大数据量场景常配合 %U 使用,表示生成多个 dump 文件,
方便并行导出,也避免单文件过大。

LOGFILE=scott_exp.log
指定导出日志文件名。生产环境建议必带,导出是否成功、哪些对象被跳过、报错原因都先看它。

SCHEMAS=scott
按 schema 导出。生产环境最常见的场景之一,适合迁移某个业务用户的全部对象和数据。

TABLES=scott.emp
按表导出。适合单表恢复、局部迁移、测试抽数。

FULL=YES
全库导出。适合整库迁移、环境复制、灾备场景。
执行全库导出通常需要 DATAPUMP_EXP_FULL_DATABASE 角色。

CONTENT=ALL | DATA_ONLY | METADATA_ONLY
控制导出内容:
ALL            = 结构和数据都导
DATA_ONLY      = 只导数据
METADATA_ONLY  = 只导对象定义,不导数据

EXCLUDE=INDEX
排除某类对象。生产里很常见的是排除索引,先把表和数据导出来,后面再统一处理索引。

INCLUDE=PROCEDURE
只导出某类对象。适合只迁存储过程、视图、函数等对象。

PARALLEL=4
指定并行度。默认值为 1。适合大数据量导出,但一般不要大于 dump 文件数量,
也要结合 CPU、IO 和存储性能评估。

FILESIZE=10G
限制每个 dump 文件的最大大小。适合大库导出时拆分文件,方便传输和归档。

COMPRESSION=ALL | DATA_ONLY | METADATA_ONLY | NONE
控制压缩方式。常用于减小 dump 文件体积,但会增加一定 CPU 开销。

PARFILE=expdp.par
指定参数文件。命令参数较多时非常推荐,能让命令更清晰,也方便复用和留档。

QUERY='where deptno=10'
按条件导出数据。适合抽取部分测试数据,或者按条件导出指定记录。

CLUSTER=NO
RAC 环境常用。若导出目录不是共享存储,通常建议显式设置为 NO,
否则任务可能跑到其他节点,报 ORA-31693 等错误。

ATTACH=SYS_EXPORT_SCHEMA_01
连接到已经运行中的数据泵作业,进入交互模式。
适合查看、控制、停止、继续一个正在执行的导出任务。

NETWORK_LINK=source_database_link
通过数据库链路直接从源库导出。适合跨库迁移,但对链路、权限、网络稳定性有要求。

VIEWS_AS_TABLES=view_name
将视图按表的方式导出。不是最高频参数,但某些报表或接口视图抽取场景会用到。

2)impdp 常用参数

复制代码
impdp 语法:
expdp 用户名/密码 参数名=参数值
impdp KEYWORD=value or KEYWORD=(value1,value2,...,valueN)

最简单示例:
impdp scott/tiger DIRECTORY=DMPDIR DUMPFILE=scott.dmp

DIRECTORY=DMPDIR
指定 Oracle DIRECTORY 目录对象。impdp 会从该对象对应的服务器目录中读取 dump 文件,
同时把导入日志写到该目录下。

DUMPFILE=scott_%U.dmp
指定导入使用的 dump 文件名。若导出时用了 %U 多文件方式,这里通常也按同样方式写。

LOGFILE=scott_imp.log
指定导入日志文件名。导入报错、对象是否创建成功、哪些对象被跳过,基本都在日志里看。

SCHEMAS=scott
按 schema 导入。生产环境最常见的用法之一,适合导入一个业务用户的全部对象和数据。

TABLES=scott.emp
按表导入。适合单表恢复、问题表回灌、局部迁移。

FULL=YES
全库导入。适合整库迁移或整环境恢复。
执行全库导入通常需要 DATAPUMP_IMP_FULL_DATABASE 角色。

CONTENT=ALL | DATA_ONLY | METADATA_ONLY
控制导入内容:
ALL            = 结构和数据都导
DATA_ONLY      = 只导数据
METADATA_ONLY  = 只导对象定义

EXCLUDE=INDEX
导入时排除某类对象。常见做法是先导表和数据,索引后建,减少导入阶段压力。

INCLUDE=PROCEDURE
导入时只处理指定对象类型。适合只恢复存储过程、视图、函数等。

PARALLEL=4
指定并行度。默认值为 1。适合大数据量导入,但一般不应大于 dump 文件数量,
也要结合目标库资源情况评估。

PARFILE=impdp.par
指定参数文件。导入参数一多时很推荐,尤其是带 remap、exclude、table_exists_action 时更清晰。

REMAP_SCHEMA=scott:scott_test
导入时将源 schema 映射为新的目标 schema。
这个在生产导测试、生产导预发时非常常见。

REMAP_TABLE=emp:emp_bak
导入时重命名表。适合临时恢复到新表名,避免和现有表冲突。

REMAP_TABLESPACE=users:app_tbs
导入时将原表空间映射到新的表空间。适合源库和目标库表空间名称不一致的情况。

TABLE_EXISTS_ACTION=SKIP | APPEND | TRUNCATE | REPLACE
目标表已存在时的处理方式:
SKIP      = 表存在就跳过
APPEND    = 追加数据
TRUNCATE  = 先清空表再导入
REPLACE   = 删除重建再导入

QUERY='where deptno=10'
按条件导入。使用频率没有导出侧那么高,但特定场景也会用到。

CLUSTER=NO
RAC 环境常用。若 DIRECTORY 对应目录不是共享存储,通常建议显式设置为 NO,
避免任务被调度到无权限节点导致报错。

ATTACH=SYS_IMPORT_SCHEMA_01
连接到已运行的导入作业,进入交互模式。
适合查看状态、控制、停止或继续任务。

NETWORK_LINK=source_database_link
通过数据库链路从源库直接导入,不依赖中间 dump 文件。
适合跨库迁移,但对链路和权限要求较高。

VIEWS_AS_TABLES=view_name
将视图按表方式导入。不是高频,但在某些视图抽取迁移场景会用到。

SQLFILE=import.sql
将 dmp 文件中的 DDL 输出到文件,不真正导入数据库。
适合先审查建表语句、索引语句等。

TRANSFORM=SEGMENT_ATTRIBUTES:N
导入时忽略对象段属性,让对象按目标库默认表空间属性创建。
在表空间调整场景里比较实用。

三、生产环境最常用的导出 / 导入命令对照

这一节不搞参数大阅兵,只保留生产里最常见、最能打的几组命令。原文里单表、多表、schema、全库、并行、元数据、排除索引、重命名等命令都给了示例,我这里把最常用的主力场景整理成对。

1)按 schema 导出 / 导入

这是最常见的场景。一个业务系统对应一个 schema,要迁移、复制、恢复,通常就是这么干。

复制代码
expdp system/oracle DIRECTORY=DMPDIR DUMPFILE=scott_%U.dmp LOGFILE=scott_exp.log SCHEMAS=scott PARALLEL=4
# 导出整个 scott schema,使用并行和多文件输出

impdp system/oracle DIRECTORY=DMPDIR DUMPFILE=scott_%U.dmp LOGFILE=scott_imp.log SCHEMAS=scott PARALLEL=4
# 将 scott schema 导入目标库

2)全库导出 / 导入

需要注意的点:

  • 确保目标端字符集与源端保持一致,否则可能导致乱码。
  • 确保存放数据文件的磁盘空间足够。
  • 确保源端数据文件路径在目标端存在或者目标端配置OMF参数(手工创建表空间也可以)。
  • 目标端存在数据的话,需要加上table_exists_action参数。
  • 如果导入过程中出现 ORA-31684 错误,代表目标库已存在,可以忽略这个错误。

整库迁移、完整环境复制时常用。操作范围大,执行前一定要确认磁盘空间、权限和目标环境。

复制代码
expdp system/oracle DIRECTORY=DMPDIR DUMPFILE=full_%U.dmp LOGFILE=full_exp.log FULL=YES PARALLEL=4
# 全库导出

impdp system/oracle DIRECTORY=DMPDIR DUMPFILE=full_%U.dmp LOGFILE=full_imp.log FULL=YES PARALLEL=4
# 全库导入

3)单表导出 / 导入

适合单表恢复、问题表迁移、临时抽取测试数据。小而精,排障时特别常见。

复制代码
expdp system/oracle DIRECTORY=DMPDIR DUMPFILE=emp.dmp LOGFILE=emp_exp.log TABLES=scott.emp
# 导出 scott.emp 表

impdp system/oracle DIRECTORY=DMPDIR DUMPFILE=emp.dmp LOGFILE=emp_imp.log TABLES=scott.emp
# 导入 scott.emp 表

4)导入到新 schema

比如把生产的 scott 导到测试库里的 scott_test,避免直接覆盖原用户。

复制代码
impdp system/oracle DIRECTORY=DMPDIR DUMPFILE=scott_%U.dmp LOGFILE=remap_schema.log SCHEMAS=scott REMAP_SCHEMA=scott:scott_test
# 将 scott 的对象导入到 scott_test 用户下

5)导入到新表空间

当源库和目标库表空间名称不一致时,这个参数非常实用。

复制代码
impdp system/oracle DIRECTORY=DMPDIR DUMPFILE=scott_%U.dmp LOGFILE=remap_tbs.log SCHEMAS=scott REMAP_TABLESPACE=users:app_tbs
# 将原来 users 表空间中的对象导入到 app_tbs 表空间

6)排除索引导出 / 导入

这个在生产里很实用。特别是大表很多、索引很多时,先排除索引,把数据尽快落库,后面再单独建索引,往往更稳。

复制代码
expdp system/oracle DIRECTORY=DMPDIR DUMPFILE=noindex_%U.dmp LOGFILE=noindex_exp.log SCHEMAS=scott EXCLUDE=INDEX PARALLEL=4
# 导出 schema,但排除索引

impdp system/oracle DIRECTORY=DMPDIR DUMPFILE=noindex_%U.dmp LOGFILE=noindex_imp.log SCHEMAS=scott PARALLEL=4
# 先把表和数据导入目标库,索引后续再处理

导入后记得收尾

当导入完成后,目标端执行无效对象重编译后,与源端进行比较:

复制代码
sqlplus / as sysdba

@?/rdbms/admin/utlrp.sql

四、示例

生产实战操作记录:Data Pump(expdp/impdp)数据迁移实战笔记https://blog.csdn.net/weixin_45806267/article/details/153959495?spm=1001.2014.3001.5501下面这组流程,基本就是日常最常见的 schema 迁移套路。

1)服务器端准备目录

复制代码
mkdir -p /data/expdp
chown -R oracle:oinstall /data/expdp
chmod 755 /data/expdp
# 准备 dump 文件和日志文件存放目录

2)数据库中创建目录对象并授权

复制代码
CREATE OR REPLACE DIRECTORY DMPDIR AS '/data/expdp';
GRANT READ, WRITE ON DIRECTORY DMPDIR TO system;
GRANT READ, WRITE ON DIRECTORY DMPDIR TO scott;
-- 创建 DIRECTORY 对象并授权

3)导出 schema

复制代码
expdp system/oracle DIRECTORY=DMPDIR DUMPFILE=scott_%U.dmp LOGFILE=scott_exp.log SCHEMAS=scott PARALLEL=4
# 导出 scott schema

4)导入 schema

复制代码
impdp system/oracle DIRECTORY=DMPDIR DUMPFILE=scott_%U.dmp LOGFILE=scott_imp.log SCHEMAS=scott PARALLEL=4
# 导入 scott schema

五、建议

1)日志尽量都带上

LOGFILE 不是摆设,是排错入口。数据泵真出问题的时候,日志比嘴硬靠谱。

2)参数多时优先用 parfile

命令太长容易写错,用参数文件更稳,也更方便复用和留档。

3)并行别开太猛

PARALLEL 能提速,但不是玄学加成。开太大,数据库和存储也会一起冒汗。

4)RAC 环境重点关注 CLUSTER

如果目录不是共享存储,通常要重点考虑 CLUSTER=NO,不然任务可能跑到不该跑的节点上。

5)导入前先检查目标环境

导入前最少要准备好:目录、DIRECTORY、表空间、用户、配额、权限。

至少确认这几件事:

  • 目标用户是否存在

  • 目标表空间是否存在

  • DIRECTORY 是否存在

  • 执行用户是否有 DIRECTORY 权限

  • 是否需要 REMAP_SCHEMAREMAP_TABLESPACE

  • 目标表已存在时,TABLE_EXISTS_ACTION 应该怎么选

很多导入失败,不是命令写错,而是环境没对齐。

**注意:**先创建好表空间并没有错,"提前建好"是为了让目标库有承接条件。导入过程会报 TABLESPACE already exists,是因为导入文件里本身也带了"创建表空间"的元数据,impdp 会按 dmp 内容再尝试创建一次,发现目标库已有,就报已存在并跳过。

6)导入后记得收尾

当导入完成后,目标端执行无效对象重编译后,与源端进行比较:

复制代码
sqlplus / as sysdba

@?/rdbms/admin/utlrp.sql
相关推荐
11路没有终点1 分钟前
Docker 化测试环境:一致性交付
运维·docker·容器
kyrie_sakura1 分钟前
MySQL数据库学习笔记3--关联(联合)查询
数据库·学习·mysql
风景的人生6 分钟前
Linux虚拟机网络故障排查与解决方案
运维·网络·ssh
..Dauntless..22 分钟前
【Linux】权限问题——拥有者、所属组和其他用户的协调
linux·运维·服务器
陈皮波比茶27 分钟前
计算机二级MySQL笔记
java·数据库
行业研究员30 分钟前
腾讯云数据库 PostgreSQL 让相关子查询跑上多核
数据库·postgresql·腾讯云
zzzll111131 分钟前
LangChain 1.3 新特性详解与实战指南
java·数据库·langchain
石小千33 分钟前
MySQL 8.4设置密码策略
数据库·mysql
平行云34 分钟前
实时云渲染信创架构解析:从GPU池化到全栈适配的技术演进
linux·unity·docker·ue5·webgl·数字孪生·实时云渲染