Skip to content

Oracle Data Pump 导出

Data Pump 导出模式

导出模式分类

模式描述适用场景命令示例
FULL导出整个数据库数据库迁移、完整备份expdp system/password FULL=Y
SCHEMA导出指定的模式(用户)模式迁移、用户数据备份expdp system/password SCHEMAS=SCOTT,HR
TABLE导出指定的表表级迁移、表备份expdp system/password TABLES=SCOTT.EMP,SCOTT.DEPT
TABLESPACE导出指定表空间中的对象表空间迁移、表空间备份expdp system/password TABLESPACES=USERS,EXAMPLE
TRANSPORTABLE导出可传输表空间快速表空间迁移expdp system/password TRANSPORT_TABLESPACES=USERS
DATABASE导出整个数据库(类似FULL)完整数据库备份expdp system/password DATABASE=Y

各模式的优缺点

模式优点缺点注意事项
FULL完整导出所有数据和对象导出文件大,时间长需要DATAPUMP_EXP_FULL_DATABASE权限
SCHEMA针对性强,导出文件小无法导出系统级对象需要EXP_FULL_DATABASE权限
TABLE最小粒度控制无法导出相关的索引、约束等依赖对象需要对象的SELECT权限
TABLESPACE表空间级控制可能遗漏依赖对象需要EXP_FULL_DATABASE权限
TRANSPORTABLE导出速度快只导出元数据,数据文件需单独复制需要EXP_FULL_DATABASE权限

Data Pump 导出参数

基本参数

参数名称描述默认值示例
DIRECTORY导出文件的目录对象-DIRECTORY=DATA_PUMP_DIR
DUMPFILE导出文件的名称expdat.dmpDUMPFILE=exp_scott.dmp
LOGFILE日志文件的名称export.logLOGFILE=exp_scott.log
FULL是否导出整个数据库NFULL=Y
SCHEMAS要导出的模式列表-SCHEMAS=SCOTT,HR
TABLES要导出的表列表-TABLES=SCOTT.EMP,SCOTT.DEPT
TABLESPACES要导出的表空间列表-TABLESPACES=USERS,EXAMPLE
TRANSPORT_TABLESPACES要导出的可传输表空间-TRANSPORT_TABLESPACES=USERS
CONTENT导出内容(ALL/DATA_ONLY/METADATA_ONLY)ALLCONTENT=METADATA_ONLY
COMPRESSION压缩选项(ALL/DATA_ONLY/METADATA_ONLY/NONE)NONECOMPRESSION=ALL
ENCRYPTION加密选项(ALL/DATA_ONLY/METADATA_ONLY/NONE)NONEENCRYPTION=ALL
PARALLEL并行度1PARALLEL=4
JOB_NAME导出作业的名称SYS_EXPORT_*JOB_NAME=exp_scott_job
STATUS作业状态的显示频率(秒)0STATUS=30

高级参数

参数名称描述示例
INCLUDE包含指定的对象类型INCLUDE=TABLE,INDEX
EXCLUDE排除指定的对象类型EXCLUDE=INDEX,VIEW
QUERY导出表的查询条件QUERY=SCOTT.EMP:"WHERE DEPTNO=10"
SAMPLE表的采样百分比SAMPLE=SCOTT.EMP:50
ESTIMATE估算方法(BLOCKS/STATISTICS)ESTIMATE=STATISTICS
ESTIMATE_ONLY仅估算导出大小,不执行导出ESTIMATE_ONLY=Y
FLASHBACK_SCN导出特定SCN的数据FLASHBACK_SCN=1234567
FLASHBACK_TIME导出特定时间点的数据FLASHBACK_TIME="TO_TIMESTAMP('2023-01-01 12:00:00','YYYY-MM-DD HH24:MI:SS')"
FILESIZE每个转储文件的大小限制FILESIZE=1G
METRICS启用详细的性能指标METRICS=Y
REUSE_DUMPFILES覆盖已存在的转储文件REUSE_DUMPFILES=Y
TTS_FULL_CHECK对可传输表空间进行完整检查TTS_FULL_CHECK=Y

Data Pump 导出操作步骤

1. 准备工作

创建目录对象

sql
-- 创建目录对象(需要DBA权限)
CREATE DIRECTORY DATA_PUMP_DIR AS 'C:\oracle\dpump';

-- 授予用户访问目录的权限
GRANT READ, WRITE ON DIRECTORY DATA_PUMP_DIR TO SCOTT;

-- 查看可用的目录对象
SELECT * FROM DBA_DIRECTORIES;

检查权限

sql
-- 检查用户是否有导出权限
SELECT * FROM SESSION_PRIVS WHERE PRIVILEGE LIKE '%EXP%';

-- 授予必要的权限(如果需要)
GRANT EXP_FULL_DATABASE TO SCOTT;
GRANT DATAPUMP_EXP_FULL_DATABASE TO SCOTT;

估算导出大小

bash
# 估算导出大小
expdp system/password SCHEMAS=SCOTT ESTIMATE_ONLY=Y LOGFILE=estimate.log

2. 执行导出操作

基本导出示例

bash
# 完整数据库导出
expdp system/password FULL=Y DIRECTORY=DATA_PUMP_DIR DUMPFILE=full.dmp LOGFILE=full.log PARALLEL=4 COMPRESSION=ALL

# 模式导出
expdp system/password SCHEMAS=SCOTT,HR DIRECTORY=DATA_PUMP_DIR DUMPFILE=schemas.dmp LOGFILE=schemas.log

# 表导出
expdp system/password TABLES=SCOTT.EMP,SCOTT.DEPT DIRECTORY=DATA_PUMP_DIR DUMPFILE=tables.dmp LOGFILE=tables.log

# 表空间导出
expdp system/password TABLESPACES=USERS,EXAMPLE DIRECTORY=DATA_PUMP_DIR DUMPFILE=tablespaces.dmp LOGFILE=tablespaces.log

使用参数文件

bash
# 创建参数文件 exp.par
cat > exp.par << EOF
USERID=system/password
SCHEMAS=SCOTT
DIRECTORY=DATA_PUMP_DIR
DUMPFILE=scott.dmp
LOGFILE=scott.log
PARALLEL=2
COMPRESSION=DATA_ONLY
INCLUDE=TABLE,INDEX
EXCLUDE=VIEW
EOF

# 使用参数文件执行导出
expdp PARFILE=exp.par

交互式导出

bash
# 启动交互式导出
expdp system/password SCHEMAS=SCOTT DIRECTORY=DATA_PUMP_DIR DUMPFILE=scott.dmp LOGFILE=scott.log

# 交互式命令示例:
# 查看作业状态:STATUS
# 暂停作业:STOP_JOB=IMMEDIATE
# 继续作业:START_JOB
# 停止作业:STOP_JOB=IMMEDIATE
# 退出:EXIT_CLIENT

3. 导出后处理

检查导出结果

bash
# 查看导出日志文件
cat scott.log

# 检查导出文件是否存在
ls -l /oracle/dpump/scott.dmp

验证导出文件

bash
# 使用 impdp 验证导出文件
impdp system/password DIRECTORY=DATA_PUMP_DIR DUMPFILE=scott.dmp SQLFILE=validate.sql

# 查看生成的 SQL 文件,确认导出的对象
cat validate.sql

导出文件的管理

  • 备份:将导出文件备份到安全的位置
  • 压缩:对导出文件进行进一步压缩(如果未使用Data Pump的压缩功能)
  • 加密:对敏感的导出文件进行加密
  • 归档:根据保留策略归档旧的导出文件
  • 清理:定期清理不需要的导出文件,释放存储空间

Data Pump 导出的性能优化

性能影响因素

  • 并行度设置:适当的并行度可以显著提高导出速度
  • 硬件资源:CPU、内存、I/O 性能都会影响导出速度
  • 数据库负载:导出操作会占用数据库资源,影响其他操作
  • 导出模式:不同导出模式的性能差异
  • 数据量大小:数据量越大,导出时间越长
  • 网络带宽:使用网络导出时,网络带宽是关键因素

性能优化策略

1. 并行度优化

  • 设置合适的并行度:一般建议并行度设置为 CPU 核心数的 1-2 倍
  • 使用多个转储文件:为每个并行进程分配一个转储文件
  • 避免并行度过高:并行度过高会导致资源竞争,反而降低性能
bash
# 并行导出示例
expdp system/password SCHEMAS=SCOTT DIRECTORY=DATA_PUMP_DIR DUMPFILE=scott_%U.dmp LOGFILE=scott.log PARALLEL=4

2. I/O 优化

  • 使用快速存储:将转储文件存储在 SSD 或高速存储上
  • 分散 I/O:将多个转储文件分散到不同的物理磁盘
  • 关闭同步写入:使用 FLASHBACK_TIME 可能会增加 I/O,根据情况调整
  • 使用 DIRECT PATH:Data Pump 默认使用 DIRECT PATH,比 conventional path 快

3. 内存优化

  • 增加 PGA 大小:适当增加 PGA_AGGREGATE_TARGET 参数
  • 调整 SGA 大小:确保有足够的共享池空间
  • 限制导出作业的内存使用:避免导出作业占用过多内存影响其他操作

4. 其他优化技巧

  • 使用压缩:减少导出文件大小,提高 I/O 效率
  • 使用增量导出:只导出变化的数据(需要使用 Oracle 数据泵的增量导出功能)
  • 避开高峰期:在系统负载低的时候执行导出操作
  • 使用查询过滤:通过 QUERY 参数过滤不需要的数据
  • 禁用日志:对于大型导出,考虑禁用或减少日志记录

性能监控

监控导出作业

bash
# 查看正在运行的导出作业
expdp system/password ATTACH=SYS_EXPORT_SCHEMA_01

# 在作业中查看状态
STATUS

# 查看详细的性能指标
METRICS

查看导出日志中的性能信息

bash
# 查看导出日志中的性能统计信息
grep -A 20 "Job" scott.log

使用 V$ 视图监控

sql
-- 查看 Data Pump 作业
SELECT * FROM DBA_DATAPUMP_JOBS;

-- 查看 Data Pump 会话
SELECT * FROM V$SESSION WHERE PROGRAM LIKE '%DM%';

-- 查看等待事件
SELECT * FROM V$SESSION_WAIT WHERE SID IN (SELECT SID FROM V$SESSION WHERE PROGRAM LIKE '%DM%');

Data Pump 导出的常见问题与解决方案

1. 权限问题

症状

  • ORA-39002: 操作无效
  • ORA-39070: 无法打开日志文件
  • ORA-39087: 目录名 DATA_PUMP_DIR 无效

解决方案

  • 确保用户有适当的导出权限
  • 确保目录对象存在且用户有读写权限
  • 检查目录路径是否正确
sql
-- 检查目录权限
SELECT * FROM DBA_TAB_PRIVS WHERE GRANTEE='SCOTT' AND TABLE_NAME='DATA_PUMP_DIR';

-- 授予目录权限
GRANT READ, WRITE ON DIRECTORY DATA_PUMP_DIR TO SCOTT;

2. 空间问题

症状

  • ORA-39095: 转储文件空间不足
  • ORA-39014: 无法创建文件
  • 磁盘空间不足错误

解决方案

  • 确保目标磁盘有足够的空间
  • 使用 FILESIZE 参数限制单个文件大小
  • 使用多个转储文件
  • 清理不需要的文件释放空间
bash
# 使用多个转储文件并限制大小
expdp system/password SCHEMAS=SCOTT DIRECTORY=DATA_PUMP_DIR DUMPFILE=scott_%U.dmp FILESIZE=1G LOGFILE=scott.log

3. 性能问题

症状

  • 导出速度慢
  • 系统负载高
  • 导出作业挂起

解决方案

  • 调整并行度
  • 优化 I/O 配置
  • 避开系统高峰期
  • 检查是否有锁或阻塞
sql
-- 检查是否有阻塞
SELECT * FROM V$SESSION_BLOCKERS;

-- 检查长时间运行的会话
SELECT * FROM V$SESSION_LONGOPS WHERE OPNAME LIKE '%Export%';

4. 导出失败

症状

  • ORA-39126: 在 KUPW$WORKER.PUT_DDLS 过程中意外终止加载
  • ORA-39065: 从字符串转换为 UCS2 时出错
  • 导出作业异常终止

解决方案

  • 检查导出日志中的详细错误信息
  • 确保数据库处于正常状态
  • 尝试使用不同的导出模式或参数
  • 对于大对象,考虑使用不同的导出方法

5. 网络导出问题

症状

  • ORA-39001: 参数值无效
  • ORA-39000: 转储文件说明错误
  • 网络连接超时

解决方案

  • 确保网络连接稳定
  • 检查 TNS 配置是否正确
  • 调整网络相关参数
  • 考虑使用本地导出后再传输文件

Data Pump 导出的最佳实践

1. 常规最佳实践

  • 使用参数文件:使用参数文件可以更方便地管理导出参数
  • 设置合理的并行度:根据硬件资源设置适当的并行度
  • 使用压缩:对大型导出使用压缩功能
  • 使用加密:对敏感数据使用加密功能
  • 定期导出:建立定期导出的策略,确保数据安全
  • 验证导出文件:每次导出后验证导出文件的完整性
  • 监控导出作业:监控导出作业的执行情况,及时发现问题

2. 不同场景的最佳实践

数据库迁移

  • 使用 FULL 模式导出整个数据库
  • 启用并行和压缩
  • 验证导出文件的完整性
  • 测试导入过程

定期备份

  • 根据数据重要性设置不同的备份频率
  • 使用 SCHEMA 模式导出关键用户数据
  • 压缩导出文件以节省空间
  • 备份到安全的位置

数据仓库加载

  • 使用 TABLE 模式导出需要的数据
  • 使用 QUERY 参数过滤数据
  • 启用并行导出提高速度
  • 考虑使用直接路径加载

跨版本迁移

  • 检查版本兼容性
  • 使用 METADATA_ONLY 模式导出元数据
  • 测试导出和导入过程
  • 考虑使用可传输表空间

3. 安全最佳实践

  • 限制权限:只授予必要的导出权限
  • 保护导出文件:对导出文件进行加密或访问控制
  • 安全传输:使用安全的方式传输导出文件
  • 审计导出:审计导出操作,记录谁导出了什么数据
  • 定期清理:定期清理不需要的导出文件

常见问题(FAQ)

Q1: Data Pump 导出与传统 exp 工具的区别是什么?

A1: Data Pump 导出与传统 exp 工具的主要区别:

  • 性能:Data Pump 比 exp 快得多,支持并行执行
  • 功能:Data Pump 提供更多的功能,如压缩、加密、网络导出等
  • 架构:Data Pump 使用服务器端架构,而 exp 使用客户端架构
  • 灵活性:Data Pump 提供更细粒度的控制和更多的参数选项
  • 文件格式:Data Pump 使用不同的文件格式,不能与 exp/imp 互操作
  • 版本:Data Pump 从 Oracle 10g 开始提供,exp 在 Oracle 12c 中被弃用

Q2: 如何提高 Data Pump 导出的速度?

A2: 提高 Data Pump 导出速度的方法:

  • 增加并行度:设置 PARALLEL 参数为 CPU 核心数的 1-2 倍
  • 使用多个转储文件:为每个并行进程分配一个转储文件(使用 %U 通配符)
  • 启用压缩:使用 COMPRESSION 参数减少 I/O
  • 优化 I/O:使用高速存储,分散 I/O 到多个磁盘
  • 增加 PGA 大小:适当增加 PGA_AGGREGATE_TARGET 参数
  • 避开高峰期:在系统负载低的时候执行导出
  • 使用 DIRECT PATH:确保使用 DIRECT PATH 模式(默认)

Q3: 如何处理大型导出作业?

A3: 处理大型导出作业的方法:

  • 分段导出:将大型导出分为多个较小的导出作业
  • 使用并行:设置适当的并行度,充分利用系统资源
  • 监控进度:定期监控导出进度,确保作业正常执行
  • 设置文件大小限制:使用 FILESIZE 参数限制单个文件大小
  • 准备足够空间:确保目标磁盘有足够的空间
  • 错误处理:准备好处理可能出现的错误
  • 测试导入:在导入前测试导出文件的可导入性

Q4: 如何导出特定时间点的数据?

A4: 导出特定时间点数据的方法:

  • 使用 FLASHBACK_TIME 参数

    bash
    expdp system/password SCHEMAS=SCOTT DIRECTORY=DATA_PUMP_DIR DUMPFILE=scott.dmp LOGFILE=scott.log FLASHBACK_TIME="TO_TIMESTAMP('2023-01-01 12:00:00','YYYY-MM-DD HH24:MI:SS')"
  • 使用 FLASHBACK_SCN 参数

    bash
    expdp system/password SCHEMAS=SCOTT DIRECTORY=DATA_PUMP_DIR DUMPFILE=scott.dmp LOGFILE=scott.log FLASHBACK_SCN=1234567

Q5: 如何导出远程数据库的数据?

A5: 导出远程数据库数据的方法:

  1. 使用网络链接

    bash
    # 创建数据库链接
    CREATE DATABASE LINK remote_db CONNECT TO system IDENTIFIED BY password USING 'remote_tns';
    
    # 使用网络链接导出
    expdp system/password NETWORK_LINK=remote_db SCHEMAS=SCOTT DIRECTORY=DATA_PUMP_DIR DUMPFILE=remote.dmp LOGFILE=remote.log
  2. 本地导出后传输

    • 在远程服务器上执行本地导出
    • 使用 SCP 或其他工具传输导出文件

Q6: 如何处理导出过程中的错误?

A6: 处理导出过程中错误的方法:

  • 查看详细错误信息:检查导出日志中的详细错误信息
  • 分析错误原因:根据错误信息分析原因
  • 采取相应措施
    • 权限问题:授予必要的权限
    • 空间问题:释放空间或使用 FILESIZE 参数
    • 数据问题:检查有问题的数据对象
  • 尝试不同的参数:调整导出参数,如使用不同的并行度
  • 重启导出作业:对于可恢复的错误,可以重启导出作业

Q7: Data Pump 导出可以暂停和重启吗?

A7: 是的,Data Pump 导出支持暂停和重启:

  • 暂停导出作业

    bash
    expdp system/password ATTACH=SYS_EXPORT_SCHEMA_01
    STOP_JOB=IMMEDIATE
  • 重启导出作业

    bash
    expdp system/password ATTACH=SYS_EXPORT_SCHEMA_01
    START_JOB
  • 注意事项

    • 暂停的作业会保留在数据库中
    • 重启后会从暂停的地方继续执行
    • 长时间暂停可能会占用系统资源

Q8: 如何导出只包含元数据而不包含数据?

A8: 导出只包含元数据的方法:

bash
# 导出元数据
expdp system/password SCHEMAS=SCOTT DIRECTORY=DATA_PUMP_DIR DUMPFILE=metadata.dmp LOGFILE=metadata.log CONTENT=METADATA_ONLY

# 导出特定类型的元数据
expdp system/password SCHEMAS=SCOTT DIRECTORY=DATA_PUMP_DIR DUMPFILE=metadata.dmp LOGFILE=metadata.log CONTENT=METADATA_ONLY INCLUDE=TABLE,INDEX

Q9: 如何过滤导出的数据?

A9: 过滤导出数据的方法:

  • 使用 QUERY 参数

    bash
    expdp system/password TABLES=SCOTT.EMP DIRECTORY=DATA_PUMP_DIR DUMPFILE=emp.dmp LOGFILE=emp.log QUERY=SCOTT.EMP:"WHERE DEPTNO=10"
  • 使用 INCLUDE/EXCLUDE 参数

    bash
    # 只导出表和索引
    expdp system/password SCHEMAS=SCOTT DIRECTORY=DATA_PUMP_DIR DUMPFILE=filtered.dmp LOGFILE=filtered.log INCLUDE=TABLE,INDEX
    
    # 导出除视图外的所有对象
    expdp system/password SCHEMAS=SCOTT DIRECTORY=DATA_PUMP_DIR DUMPFILE=filtered.dmp LOGFILE=filtered.log EXCLUDE=VIEW
  • 使用 SAMPLE 参数

    bash
    # 导出表的 50% 数据
    expdp system/password TABLES=SCOTT.EMP DIRECTORY=DATA_PUMP_DIR DUMPFILE=sample.dmp LOGFILE=sample.log SAMPLE=50

Q10: 如何确保导出文件的安全性?

A10: 确保导出文件安全性的方法:

  • 使用加密

    bash
    expdp system/password SCHEMAS=SCOTT DIRECTORY=DATA_PUMP_DIR DUMPFILE=encrypted.dmp LOGFILE=encrypted.log ENCRYPTION=ALL ENCRYPTION_PASSWORD=MyPassword
  • 访问控制

    • 设置导出目录的适当权限
    • 限制对导出文件的访问
  • 传输安全

    • 使用 SFTP 或其他安全方式传输导出文件
    • 避免在不安全的网络上传输敏感数据
  • 存储安全

    • 将导出文件存储在安全的位置
    • 定期备份导出文件
    • 定期清理不需要的导出文件
  • 审计

    • 启用导出操作的审计
    • 记录谁执行了导出操作,导出了什么数据