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
相关推荐
浪客灿心2 小时前
线程同步与互斥
linux
想唱rap2 小时前
线程池以及读写问题
服务器·数据库·c++·mysql·ubuntu
我科绝伦(Huanhuan Zhou)3 小时前
分享一个服务故障自愈系统
运维·人工智能·自动化
爱丽_3 小时前
B+ 树范围查询为什么快:页分裂/合并、索引设计与 SQL 写法优化
数据库·算法·哈希算法
失伟4 小时前
Stratovirt安装及使用
运维·虚拟化
better_liang4 小时前
每日Java面试场景题知识点之-MySQL索引
java·数据库·mysql·性能优化·索引
萌萌哒草头将军4 小时前
CloudDock(云仓):新一代开源NAS网络代理工具
服务器·网络协议·docker
AgCl234 小时前
MYSQL-4-DQL数据查询语言-3/14-15
数据库·mysql
别抢我的锅包肉4 小时前
【MySQL】第五节 - 事务实战详解:从基础到并发控制(附 Navicat 可运行实验脚本)
数据库·mysql