Oracle数据泵(Data Pump)简明使用指南
📦 数据泵是什么?
Oracle数据泵(Data Pump) 是 Oracle 10g 及以后版本提供的高速数据迁移工具,用于替代传统的 exp/imp 工具。它支持并行处理、断点续传、网络传输等高级功能。
🎯 核心特点
| 特点 | 说明 |
|---|---|
| 高速 | 支持并行导出/导入,比传统 exp/imp 快很多 |
| 灵活 | 支持表、用户、表空间、全库等不同级别 |
| 可控 | 可监控、暂停、重启、调整并行度 |
| 网络模式 | 支持数据库间直接传输(无需中间文件) |
| 过滤功能 | 可排除/包含特定对象类型或数据 |
🔧 基本使用步骤
1. 创建目录对象(必需)
-- 1. 创建操作系统目录(在服务器上)
mkdir -p /u01/dpump_dir
-- 2. 创建Oracle目录对象
CREATE OR REPLACE DIRECTORY dpump_dir AS '/u01/dpump_dir';
-- 3. 授予用户权限
GRANT READ, WRITE ON DIRECTORY dpump_dir TO scott;
2. 数据泵导出(expdp)
常用导出模式:
# 1. 按用户导出
expdp scott/tiger DIRECTORY=dpump_dir DUMPFILE=scott_%U.dmp
LOGFILE=scott_exp.log SCHEMAS=scott PARALLEL=4
# 2. 按表导出
expdp scott/tiger DIRECTORY=dpump_dir DUMPFILE=tables.dmp
TABLES=emp,dept
# 3. 全库导出(需要DBA权限)
expdp system/password DIRECTORY=dpump_dir DUMPFILE=full_%U.dmp
FULL=Y LOGFILE=full_exp.log
# 4. 按表空间导出
expdp system/password DIRECTORY=dpump_dir DUMPFILE=tbs.dmp
TRANSPORT_TABLESPACES=users
实用参数:
# 压缩(减少文件大小)
COMPRESSION=ALL
# 仅导出元结构(不含数据)
CONTENT=METADATA_ONLY
# 仅导出数据(表必须已存在)
CONTENT=DATA_ONLY
# 排除特定对象
EXCLUDE=INDEX:"LIKE 'EMP%'"
# 包含特定对象
INCLUDE=TABLE:"IN ('EMP', 'DEPT')"
# 导出时不记录日志
FLASHBACK_TIME="TO_TIMESTAMP('2023-11-21 10:00:00','YYYY-MM-DD HH24:MI:SS')"
# 估算导出大小(不实际导出)
ESTIMATE_ONLY=Y
3. 数据泵导入(impdp)
常用导入模式:
# 1. 按用户导入
impdp system/password DIRECTORY=dpump_dir DUMPFILE=scott_%U.dmp
LOGFILE=scott_imp.log SCHEMAS=scott
# 2. 从scott用户导入到新用户new_scott
impdp system/password DIRECTORY=dpump_dir DUMPFILE=scott.dmp
REMAP_SCHEMA=scott:new_scott
# 3. 从A表空间导入到B表空间
impdp system/password DIRECTORY=dpump_dir DUMPFILE=scott.dmp
REMAP_TABLESPACE=users:users_new
# 4. 全库导入
impdp system/password DIRECTORY=dpump_dir DUMPFILE=full.dmp
FULL=Y LOGFILE=full_imp.log
# 5. 仅导入表结构(不导数据)
impdp system/password DIRECTORY=dpump_dir DUMPFILE=scott.dmp
SQLFILE=create_tables.sql -- 生成DDL语句
实用参数:
# 改变表空间
REMAP_TABLESPACE=old_tbs:new_tbs
# 改变数据文件位置
REMAP_DATAFILE='/old/path/system01.dbf':'/new/path/system01.dbf'
# 导入时跳过已存在对象
TABLE_EXISTS_ACTION=SKIP # 或 REPLACE、APPEND、TRUNCATE
# 仅导入元结构
CONTENT=METADATA_ONLY
# 导入时排除特定对象
EXCLUDE=CONSTRAINT,REF_CONSTRAINT
# 并行导入(提升速度)
PARALLEL=4
🚀 高级功能
1. 网络模式(无需生成DMP文件)
# 直接从源库传输到目标库
impdp system/password@target_db DIRECTORY=dpump_dir
NETWORK_LINK=source_db_link SCHEMAS=scott
需要先创建数据库链接:
CREATE DATABASE LINK source_db_link
CONNECT TO scott IDENTIFIED BY tiger
USING 'source_db_tns';
2. 作业控制
# 查看数据泵作业
SELECT * FROM DBA_DATAPUMP_JOBS;
# 交互式命令(在导出/导入时按Ctrl+C进入)
expdp> STATUS # 查看状态
expdp> STOP_JOB=IMMEDIATE # 立即停止作业
expdp> START_JOB # 重启作业
expdp> PARALLEL=8 # 动态调整并行度
expdp> KILL_JOB # 终止作业
3. 过滤和转换
# 只导出特定条件的表数据
expdp scott/tiger DIRECTORY=dpump_dir DUMPFILE=emp_data.dmp
TABLES=emp QUERY=emp:"WHERE deptno=10"
# 导入时重命名表
impdp scott/tiger DIRECTORY=dpump_dir DUMPFILE=emp.dmp
REMAP_TABLE=emp:employees_new
# 导入时过滤数据
impdp scott/tiger DIRECTORY=dpump_dir DUMPFILE=emp.dmp
TABLES=emp QUERY=emp:"WHERE sal > 3000"
📋 常用场景示例
场景1:迁移用户数据
# 1. 导出用户数据
expdp system/password DIRECTORY=dpump_dir DUMPFILE=hr_%U.dmp
SCHEMAS=hr LOGFILE=hr_exp.log PARALLEL=4
COMPRESSION=ALL
# 2. 在目标库创建用户
CREATE USER hr IDENTIFIED BY hr DEFAULT TABLESPACE users;
# 3. 导入用户数据
impdp system/password DIRECTORY=dpump_dir DUMPFILE=hr_%U.dmp
SCHEMAS=hr LOGFILE=hr_imp.log REMAP_TABLESPACE=users:users_new
场景2:克隆生产库到测试库
# 1. 导出生产库
expdp system/prod_password DIRECTORY=dpump_dir
DUMPFILE=prod_clone_%U.dmp FULL=Y PARALLEL=8
COMPRESSION=ALL EXCLUDE=STATISTICS
# 2. 在测试库创建必要目录
CREATE OR REPLACE DIRECTORY dpump_dir AS '/u01/dpump_dir';
# 3. 导入到测试库,并修改表空间
impdp system/test_password DIRECTORY=dpump_dir
DUMPFILE=prod_clone_%U.dmp FULL=Y
REMAP_TABLESPACE=prod_data:test_data,prod_index:test_index
场景3:定期备份表结构
# 每周日备份表结构
expdp system/password DIRECTORY=dpump_dir
DUMPFILE=schema_backup_%d.dmp -- %d为星期几
CONTENT=METADATA_ONLY SCHEMAS=app_user
LOGFILE=schema_backup.log
⚠️ 注意事项
1. 版本兼容性
- 高版本导出的数据不能直接导入低版本
- 使用
VERSION参数指定兼容版本:expdp ... VERSION=11.2 # 导出为11.2兼容格式
2. 空间需求
- 导出文件通常为源数据大小的 1/3 到 1/2(使用压缩时)
- 确保目录有足够空间:
df -h /u01/dpump_dir
3. 字符集问题
-- 确保源库和目标库字符集一致
SELECT * FROM NLS_DATABASE_PARAMETERS
WHERE PARAMETER LIKE '%CHARACTERSET';
4. 权限需求
- 导出:需要
EXP_FULL_DATABASE角色 - 导入:需要
IMP_FULL_DATABASE角色
🔍 监控和调试
-- 查看数据泵作业状态
SELECT * FROM DBA_DATAPUMP_JOBS;
SELECT * FROM DBA_DATAPUMP_SESSIONS;
-- 查看详细日志
SELECT * FROM TABLE(
DBMS_DATAPUMP.GET_STATUS(
'SYS_IMPORT_FULL_01', -- 作业名
NULL, NULL, 'ALL')
);
-- 查看导出/导入进度
SELECT sid, serial#, opname, sofar, totalwork,
ROUND(sofar/totalwork*100,2) "% Complete"
FROM v$session_longops
WHERE opname LIKE 'Data Pump%'
AND totalwork != 0;
💎 快速参考命令
| 操作 | 命令示例 |
|---|---|
| 导出用户 | expdp scott/tiger SCHEMAS=scott DUMPFILE=scott.dmp |
| 导入用户 | impdp system/password SCHEMAS=scott DUMPFILE=scott.dmp |
| 导出表 | expdp scott/tiger TABLES=emp,dept DUMPFILE=tables.dmp |
| 全库导出 | expdp system/password FULL=Y DUMPFILE=full.dmp |
| 网络导入 | impdp system/password NETWORK_LINK=dblink SCHEMAS=scott |
| 改变用户 | impdp ... REMAP_SCHEMA=scott:new_scott |
| 改变表空间 | impdp ... REMAP_TABLESPACE=users:new_users |
| 并行处理 | PARALLEL=4 DUMPFILE=exp_%U.dmp |
常用文件命名通配符:
%U:自动生成01-99的序列号(用于并行)%d:星期几(1-7)%D:月份中的第几天%T:年月日 (YYYYMMDD)%h:小时(HH24)
📊 性能优化建议
- 使用并行处理:
PARALLEL=CPU核数×2 - 开启压缩:
COMPRESSION=ALL(CPU换空间) - 多文件并行I/O:
DUMPFILE=exp_%U.dmp FILESIZE=2G - 调整缓冲区:
BUFFER=10240000(10MB) - 关闭日志:
NOLOGFILE=Y(仅用于测试) - 网络模式优先:避免文件I/O瓶颈
简单记住:数据泵 = expdp(导出) + impdp(导入)+ 目录对象 + 并行处理。它比传统exp/imp快得多,功能也更强大!