外观
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.dmp | DUMPFILE=exp_scott.dmp |
| LOGFILE | 日志文件的名称 | export.log | LOGFILE=exp_scott.log |
| FULL | 是否导出整个数据库 | N | FULL=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) | ALL | CONTENT=METADATA_ONLY |
| COMPRESSION | 压缩选项(ALL/DATA_ONLY/METADATA_ONLY/NONE) | NONE | COMPRESSION=ALL |
| ENCRYPTION | 加密选项(ALL/DATA_ONLY/METADATA_ONLY/NONE) | NONE | ENCRYPTION=ALL |
| PARALLEL | 并行度 | 1 | PARALLEL=4 |
| JOB_NAME | 导出作业的名称 | SYS_EXPORT_* | JOB_NAME=exp_scott_job |
| STATUS | 作业状态的显示频率(秒) | 0 | STATUS=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.log2. 执行导出操作
基本导出示例
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_CLIENT3. 导出后处理
检查导出结果
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=42. 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.log3. 性能问题
症状
- 导出速度慢
- 系统负载高
- 导出作业挂起
解决方案
- 调整并行度
- 优化 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 参数:
bashexpdp 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 参数:
bashexpdp system/password SCHEMAS=SCOTT DIRECTORY=DATA_PUMP_DIR DUMPFILE=scott.dmp LOGFILE=scott.log FLASHBACK_SCN=1234567
Q5: 如何导出远程数据库的数据?
A5: 导出远程数据库数据的方法:
使用网络链接:
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本地导出后传输:
- 在远程服务器上执行本地导出
- 使用 SCP 或其他工具传输导出文件
Q6: 如何处理导出过程中的错误?
A6: 处理导出过程中错误的方法:
- 查看详细错误信息:检查导出日志中的详细错误信息
- 分析错误原因:根据错误信息分析原因
- 采取相应措施:
- 权限问题:授予必要的权限
- 空间问题:释放空间或使用 FILESIZE 参数
- 数据问题:检查有问题的数据对象
- 尝试不同的参数:调整导出参数,如使用不同的并行度
- 重启导出作业:对于可恢复的错误,可以重启导出作业
Q7: Data Pump 导出可以暂停和重启吗?
A7: 是的,Data Pump 导出支持暂停和重启:
暂停导出作业:
bashexpdp system/password ATTACH=SYS_EXPORT_SCHEMA_01 STOP_JOB=IMMEDIATE重启导出作业:
bashexpdp 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,INDEXQ9: 如何过滤导出的数据?
A9: 过滤导出数据的方法:
使用 QUERY 参数:
bashexpdp 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: 确保导出文件安全性的方法:
使用加密:
bashexpdp system/password SCHEMAS=SCOTT DIRECTORY=DATA_PUMP_DIR DUMPFILE=encrypted.dmp LOGFILE=encrypted.log ENCRYPTION=ALL ENCRYPTION_PASSWORD=MyPassword访问控制:
- 设置导出目录的适当权限
- 限制对导出文件的访问
传输安全:
- 使用 SFTP 或其他安全方式传输导出文件
- 避免在不安全的网络上传输敏感数据
存储安全:
- 将导出文件存储在安全的位置
- 定期备份导出文件
- 定期清理不需要的导出文件
审计:
- 启用导出操作的审计
- 记录谁执行了导出操作,导出了什么数据
