数据泵 = 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 目录对象名,不是操作系统路径。
二、生产环境常用参数速查
参数不用全记,生产里真正高频的就那么几类:DIRECTORY、DUMPFILE、LOGFILE、SCHEMAS、TABLES、FULL、CONTENT、PARALLEL、PARFILE,以及导入时的 REMAP_* 和 TABLE_EXISTS_ACTION。
其余像 ATTACH、NETWORK_LINK、VIEWS_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_SCHEMA或REMAP_TABLESPACE -
目标表已存在时,
TABLE_EXISTS_ACTION应该怎么选
很多导入失败,不是命令写错,而是环境没对齐。
**注意:**先创建好表空间并没有错,"提前建好"是为了让目标库有承接条件。导入过程会报 TABLESPACE already exists,是因为导入文件里本身也带了"创建表空间"的元数据,impdp 会按 dmp 内容再尝试创建一次,发现目标库已有,就报已存在并跳过。
6)导入后记得收尾
当导入完成后,目标端执行无效对象重编译后,与源端进行比较:
sqlplus / as sysdba
@?/rdbms/admin/utlrp.sql