impdp 是 Oracle Data Pump 技术的一部分,用于从由 expdp (Data Pump Export) 创建的转储文件集中恢复数据,与传统的 imp (Import) 工具相比,impdp 具有更高的性能、更强的并行能力和更丰富的功能。

核心概念:impdp vs expdp vs imp
在深入 impdp 之前,先理解它与相关工具的区别至关重要。
| 特性 | expdp / impdp (Data Pump) |
exp / imp (Traditional) |
|---|---|---|
| 技术架构 | 服务端进程,通过 API 与数据库交互,客户端只发送命令。 | 客户端工具,直接连接数据库进行读写。 |
| 性能 | 高,可利用多个并行服务器进程,直接在数据文件间读写,不经过客户端。 | 低,数据流必须经过客户端,网络瓶颈明显。 |
| 文件格式 | 专有二进制格式,文件以 .dmp 通常包含元数据(.dpd 文件)。 |
文本格式,文件为可读的文本,包含 DDL 和数据。 |
| 功能 | 丰富,支持数据过滤、传输表空间、网络导入、重新映射等高级功能。 | 基础,功能相对有限。 |
| 权限要求 | 需要 DATAPUMP_IMP_FULL_DATABASE 角色(导入整个数据库时)或对象的所有者权限。 |
需要 EXP_FULL_DATABASE / IMP_FULL_DATABASE 角色。 |
| 可恢复性 | 支持 SKIP_UNUSABLE_INDEXES 等高级错误处理。 |
错误处理机制简单,容易中断。 |
核心结论: 在所有现代 Oracle 环境中,强烈推荐使用 expdp 和 impdp,除非有非常特殊的兼容性要求。
impdp 命令基本语法
impdp 命令在操作系统命令行(如 Linux 的终端或 Windows 的 CMD)中执行,其基本语法如下:
impdp username/password[@connect_identifier] DUMPFILE=dumpfile1.dmp[,dumpfile2.dmp,...] [OPTIONS]
username/password[@connect_identifier]: 连接到数据库的凭证,可以是sys/yourpass as sysdba这样的系统用户。DUMPFILE=...: 必需参数,指定要导入的转储文件列表,多个文件用逗号分隔。OPTIONS: 各种可选参数,用于控制导入行为。
核心参数详解
下面将 impdp 的参数分为几大类进行详细说明。

连接与认证参数
| 参数 | 描述 | 示例 |
|---|---|---|
USERID |
指定用户名、密码和连接字符串,这是最常用的连接方式。 | impdp scott/tiger@orcl ... |
SQLFILE |
只生成 DDL 语句,不导入数据,结果会输出到指定文件,这对于在导入前审查或修改脚本非常有用。 | impdp ... SQLFILE=pre_import.sql |
CONTENT |
指定导入内容。 | impdp ... CONTENT=DATA_ONLY (只导入数据) impdp ... CONTENT=METADATA_ONLY (只导入元数据/DDL) impdp ... CONTENT=ALL (默认,全部导入) |
源文件与目标对象参数
| 参数 | 描述 | 示例 |
|---|---|---|
DUMPFILE |
指定要导入的转储文件名。 | impdp ... DUMPFILE=expdat.dmp impdp ... DUMPFILE=dir1:exp1.dmp,dir2:exp2.dmp |
REMAP_DATAFILE |
非常实用,将转储文件中的数据文件路径重定向到新的路径,这在跨平台或移动数据库文件时必不可少。 | impdp ... REMAP_DATAFILE='/u01/oradata/old.dbf':'/new/path/new.dbf' |
REMAP_SCHEMA |
非常实用,将一个模式下的所有对象导入到另一个模式中。 | impdp ... REMAP_SCHEMA=SCOTT:ADAM (将 SCOTT 的所有对象导入到 ADAM 用户下) |
REMAP_TABLESPACE |
将表空间重命名,导入时,原来属于 USERS 表空间的表将被创建到 NEW_TS 表空间。 |
impdp ... REMAP_TABLESPACE=USERS:NEW_USERS |
TABLE_EXISTS_ACTION |
当导入的表已存在时的处理策略。 | impdp ... TABLE_EXISTS_ACTION=APPEND (追加数据) impdp ... TABLE_EXISTS_ACTION=TRUNCATE (清空表后导入) impdp ... TABLE_EXISTS_ACTION=REPLACE (删除并重建表) impdp ... TABLE_EXISTS_ACTION=SKIP (跳过该表) |
过滤与选择参数
| 参数 | 描述 | 示例 |
|---|---|---|
SCHEMAS |
按模式(用户名)导入,可以指定多个模式,用逗号分隔。 | impdp ... SCHEMAS=HR,SCOTT |
TABLES |
按表名导入,可以指定多个表,用逗号分隔。 | impdp ... TABLES=HR.EMPLOYEES,HR.DEPARTMENTS |
TABLESPACES |
按表空间导入。 | impdp ... TABLESPACES=USERS,EXAMPLE |
QUERY |
强大的数据过滤,使用 WHERE 子句来过滤要导入的行。注意:QUERY 必须用双引号括起来,并且表名需要用双引号或引号括起来。 |
impdp ... TABLES=EMPLOYEES QUERY=\"WHERE department_id = 10 AND salary > 5000\" |
性能与并行参数
| 参数 | 描述 | 示例 |
|---|---|---|
PARALLEL |
提升导入速度的关键,指定并行度,即 Data Pump 使用的并行工作进程数,通常设置为可用 CPU 数量或 I/O 能力的函数。 | impdp ... PARALLEL=4 |
JOB_NAME |
为导入作业指定一个自定义名称,默认名称为 SYS_IMPORT_<mode>_<timestamp>。 |
impdp ... JOB_NAME=IMPORT_HR_SCHEMA |
FLASHBACK_SCN / FLASHBACK_TIME |
将数据导入到指定的 SCN 或时间点,这要求源数据库在导出后没有提交过能改变目标数据的 DML 操作。 | impdp ... FLASHBACK_TIME=\"TO_TIMESTAMP('2025-10-27 10:00:00', 'YYYY-MM-DD HH24:MI:SS')\" |
高级与元数据参数
| 参数 | 描述 | 示例 |
|---|---|---|
FULL |
导出整个数据库(需要 DATAPUMP_IMP_FULL_DATABASE 权限)。 |
impdp ... FULL=YES |
TRANSPORT_TABLESPACES |
传输表空间,导入与表空间相关的数据文件和元数据,实现快速表空间迁移,需要配合 expdp 的 TRANSPORT_FULL_CHECK=YES 和 DATAFILES 参数使用。 |
impdp ... TRANSPORT_TABLESPACES=USERS |
EXCLUDE / INCLUDE |
排除或包含特定对象类型。 | impdp ... SCHEMAS=HR EXCLUDE=STATISTICS (导入 HR 模式,但不导入统计信息) impdp ... INCLUDE=TABLE,GRANT (只导入表和授权) |
LOGFILE |
指定日志文件名,默认为 impdp_<job_name>.log。 |
impdp ... LOGFILE=import.log |
NOLOGFILE |
不生成日志文件,不推荐,除非是临时测试。 | impdp ... NOLOGFILE |
使用场景与示例
场景1:导入单个用户的所有对象
# 将用户 SCOTT 的所有数据导入到数据库中 impdp scott/tiger@orcl DUMPFILE=scott_exp.dmp DIRECTORY=DATA_PUMP_DIR SCHEMAS=SCOTT
场景2:导入特定表并追加数据
# 将 HR 用户的 EMPLOYEES 和 DEPARTMENTS 表追加到现有表中 impdp hr/hrpwd@orcl DUMPFILE=hr_tables.dmp DIRECTORY=DATA_PUMP_DIR \ TABLES=HR.EMPLOYEES,HR.DEPARTMENTS TABLE_EXISTS_ACTION=APPEND
场景3:跨模式导入
# 将 SCOTT 模式下的所有对象导入到 ADAM 模式 impdp system/manager@orcl DUMPFILE=scott_exp.dmp DIRECTORY=DATA_PUMP_DIR \ REMAP_SCHEMA=SCOTT:ADAM
场景4:只生成 DDL 脚本,不导入数据
# 为 ADAM 模式下的所有对象生成 DDL 脚本,以便审查或修改 impdp system/manager@orcl DUMPFILE=scott_exp.dmp DIRECTORY=DATA_PUMP_DIR \ SCHEMAS=SCOTT REMAP_SCHEMA=SCOTT:ADAM SQLFILE=adam_ddl.sql
场景5:使用数据过滤
# 只导入部门 ID 为 10 且薪资大于 5000 的员工数据 impdp hr/hrpwd@orcl DUMPFILE=hr_exp.dmp DIRECTORY=DATA_PUMP_DIR \ TABLES=HR.EMPLOYEES QUERY=\"WHERE department_id = 10 AND salary > 5000\"
场景6:并行导入提升速度
# 使用 4 个并行进程导入整个 SCHEMA impdp system/manager@orcl DUMPFILE=big_schema.dmp DIRECTORY=DATA_PUMP_DIR \ SCHEMAS=BIG_SCHEMA PARALLEL=4
执行步骤与最佳实践
-
准备工作
- 创建目录对象:
impdp需要一个数据库的 DIRECTORY 对象来定位转储文件,该目录必须在数据库服务器上存在,并且导入用户需要有该目录的READ权限。-- 以 SYS 或 SYSTEM 用户执行 CREATE DIRECTORY DATA_PUMP_DIR AS '/path/to/dump/files'; GRANT READ, WRITE ON DIRECTORY DATA_PUMP_DIR TO scott;
- 检查空间:确保目标数据库有足够的表空间空间。
- 检查权限:确保用户有足够的权限(
IMP_FULL_DATABASE或对象本身权限)。
- 创建目录对象:
-
执行导入
- 在操作系统命令行中,按照上述语法执行
impdp命令。
- 在操作系统命令行中,按照上述语法执行
-
监控与排错
- 查看日志:导入过程中和完成后,务必检查
LOGFILE,日志会详细记录导入的每个步骤、性能统计和任何错误信息。 - 使用
STATUS:在另一个终端,可以使用impdp的ATTACH功能查看作业状态。impdp system/manager@orcl ATTACH=IMPORT_HR_SCHEMA
- 常见错误:
ORA-39002: invalid operation:通常是参数名拼写错误或值不合法。ORA-39070: Unable to open the log file.:目录对象权限不足或路径错误。ORA-00942: table or view does not exist:SCHEMAS或TABLES参数指定的对象不存在。ORA-00001: unique constraint violated:TABLE_EXISTS_ACTION设置不当,或者数据与现有主键/唯一键冲突。
- 查看日志:导入过程中和完成后,务必检查
impdp 是一个功能强大且灵活的工具,掌握它的关键在于:

- 理解核心参数:特别是
REMAP_*、TABLE_EXISTS_ACTION、QUERY和PARALLEL。 - 明确导入目标:你是要导入整个用户、特定表,还是仅仅为了生成脚本?
- 善用日志:日志是排查问题的第一手资料。
- 注意权限:确保用户有操作 DIRECTORY 和目标对象的权限。
通过合理组合这些参数,你可以应对绝大多数数据导入场景,并高效、安全地完成数据迁移任务。
