一、DMP文件基础知识
1. DMP文件定义
DMP(Data Pump Dump File)
是Oracle数据库专用的二进制格式文件,由expdp/impdp
或旧版exp/imp
工具生成。它包含数据库对象的元数据(表结构、索引等)和实际数据,是数据备份、迁移和恢复的核心载体。
2. DMP文件结构
- 文件头:记录Oracle版本、字符集、导出时间等元信息。
- 数据段:存储表数据,按数据块组织,支持并行读写。
- 索引段:加速数据检索的索引信息,包含校验和等完整性标记。
- 数据字典:定义表、视图、存储过程等对象的元数据。
3. 核心功能
- 全量备份:导出整个数据库或指定用户的所有对象。
- 增量同步:仅导出变更数据,减少传输量(需结合日志)。
- 跨平台迁移:支持不同Oracle版本、操作系统间的数据传输。
4. 生成工具
- 传统工具:exp(导出)和imp(导入),适用于Oracle 10g及以下版本。
- 数据泵工具:expdp和impdp,提供并行处理、压缩等高级特性(Oracle 10g+推荐)
二、DMP文件导出实战
1. 数据泵导出(expdp)
(1)语法
bash
expdp system/password@ORCL directory=DATA_PUMP_DIR
dumpfile=20250520_full.dmp logfile=export.log
schemas=HR,SCOTT
parallel=4
compression=all
encryption=password:oracle123
关键参数:
- directory:预先创建的Oracle目录对象(需关联物理路径)。
- schemas:指定导出用户,多用户用逗号分隔。
- parallel:并行线程数,提升大库导出速度。
- compression:减少文件体积(可选all/data/metadata)。
- encryption:加密保护敏感数据(支持密码或密钥)。
- log: 日志路径
(2) 示例
- 查询 Oracle 预先创建的Oracle目录对象
bash
select * from dba_directories;
- 创建指定的 Oracle 目录对象(关联物理路径)
bash
create directory testdir as 'D:\OracleDMP';
- 手动创建物理目录 D:\OracleDMP
- 将这个目录指给用户(TEST_FORMAL)
bash
SQL> grant read,write on directory testdir to TEST_FORMAL;
- 执行导出命令
bash
--导出指定表 USER_TEMP,USER_TEMP2
expdp TEST_FORMAL/MyPassword@ORCL directory=testdir dumpfile=test.dmp logfile=exp.log tables=USER_TEMP,USER_TEMP2
-- 导出整库
expdp TEST_FORMAL/MyPassword@ORCL directory=testdir dumpfile=test.dmp logfile=exp.log
2. 传统导出(exp)
语法
bash
exp system/password@ORCL file=/backup/legacy.dmp
owner=HR
buffer=102400
rows=y
consistent=y
log= /backup/exp.log
示例:
bash
--导出指定表 USER_TEMP,USER_TEMP2
exp TEST_FORMAL/MyPassword@ORCL file=D:\OracleDMP\test.dmp tables=(USER_TEMP,USER_TEMP2) log=D:\OracleDMP\exp.log
--导出整库
exp TEST_FORMAL/MyPassword@ORCL file=D:\OracleDMP\test.dmp log=D:\OracleDMP\exp.log
适用场景:低版本数据库或简单备份需求。
三、DMP文件导入实战
1. 数据泵导入(impdp)
bash
impdp system/password@NEWDB directory=DATA_PUMP_DIR
dumpfile=20250520_full.dmp
remap_schema=HR:NEW_HR
remap_tablespace=USERS:NEW_USERS
transform=segment_attributes:n
exclude=statistics
关键参数:
- directory:
预先创建的Oracle目录对象
(需关联物理路径)。 - remap_schema:用户重映射(原用户→目标用户)。
- remap_tablespace:调整表空间分配49。
- transform:忽略存储参数冲突(如storage子句)。
- exclude/include:过滤对象类型(如排除统计信息)。
2. 传统导入(imp)
bash
imp system/password@NEWDB file=/backup/legacy.dmp
fromuser=HR touser=NEW_HR
ignore=y
commit=y
注意事项:需手动创建目标用户和表空间。
1.核心参数说明
参数 | 作用说明 | 示例 |
---|---|---|
USERID |
指定数据库连接凭证(格式:用户名/密码@服务名 ) |
USERID=system/oracle@ORCL |
FILE |
指定要导入的DMP文件路径 | FILE=/data/full.dmp |
FULL |
全库导入(需IMP_FULL_DATABASE 权限) |
FULL=Y |
FROMUSER/TOUSER |
用户重定向(将原用户数据导入目标用户) | FROMUSER=HR TOUSER=NEW_HR |
TABLES |
指定导入的表(支持多表或分区表) | TABLES=(EMP,DEPT) 或 TABLES=(T1:P1,T1:P2) |
ROWS |
是否导入数据行(默认Y 导入数据,N 仅导入结构) |
ROWS=N (仅导入DDL) |
IGNORE |
忽略对象创建错误(如重复表/索引,默认N 报错) |
IGNORE=Y (跳过冲突继续执行) |
COMMIT |
提交频率(默认N 批量提交,Y 逐行提交) |
COMMIT=Y (适用于大事务回滚控制) |
LOG |
指定日志文件路径 | LOG=/logs/imp.log |
INDEXFILE |
将DDL语句写入指定文件(用于调试) | INDEXFILE=ddl.sql |
2. 高级参数扩展
参数 | 适用场景 |
---|---|
DESTROY=Y | 覆盖已有表空间文件(慎用) |
GRANTS=N | 跳过权限导入(如仅需数据) |
RECORDLENGTH=65535 | 调整I/O缓冲区大小(优化大数据量导入性能) |
PARFILE | 从参数文件读取配置(简化复杂命令) |
3.传统导入(IMP)的三种模式
1. 完全导入模式(FULL=Y)
定义:导入整个DMP文件中的所有对象(用户、表、索引等)。
命令示例:
bash
imp system/oracle@ORCL FILE=full.dmp FULL=Y IGNORE=Y LOG=imp_full.log
适用场景:数据库整体迁移或灾难恢复。
注意事项:
需提前创建目标库的表空间和用户
目标库字符集
必须与DMP文件一致(通过NLS_LANG
环境变量控制)
2. 用户模式导入(FROMUSER/TOUSER)
定义:将指定用户的数据导入到另一用户(支持跨用户映射)。
命令示例:
bash
imp system/oracle@ORCL FILE=hr.dmp FROMUSER=HR TOUSER=NEW_HR LOG=imp_hr.log
适用场景:用户数据迁移或测试环境克隆。
注意事项:
目标用户需提前创建
并分配权限
若表空间不同需配合REMAP_TABLESPACE(仅数据泵支持,传统IMP需手动处理)
3. 表模式导入(TABLES=)
定义:选择性导入特定表或分区。
命令示例:
bash
imp scott/tiger@ORCL FILE=emp.dmp TABLES=(EMP,DEPT) IGNORE=Y LOG=imp_tables.log
适用场景:局部数据恢复或表结构同步。
注意事项:
支持通配符%(如TABLES=(EMP%)导入EMP开头的表)
分区表需指定分区名(如TABLES=(SALES:Q1_2025))5
四、高级优化策略
1. 性能调优
并行处理:parallel=8(建议不超过CPU核心数)。
网络压缩:network_link=... compression=data(远程同步)。
分段导出:按表分区或日期范围分批操作。
2. 增量同步
策略选择:
- 全量同步:首次迁移或数据一致性要求高时使用。
- 增量同步:定期追加变更数据(需配合日志)。
代码示例:
bash
expdp system/password@ORCL directory=dpump_dir
dumpfile=incr_%U.dmp
schemas=HR
content=data_only
query="WHERE update_time>SYSDATE-1"
五、问题总结
1. 通过 exp 命令导出,使用 impdp 命令无法导入;
Oracle 中 因为版本问题或命令问题处理时,我们要 查看原始 导出日志文件,当使用的是 exp 模式导出的数据,应当用 imp 模式导入;
导出日志文件一般格式如下 ,例如 a.log:
bash
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Tes
Export done in UTF8 character set and UTF8 NCHAR character set
server uses AL32UTF8 character set (possible charset conversion)
About to export specified tables via Conventional Path ...
Current user changed to SYSTEM
. . exporting table USER_EXPORT 19138328 rows exported
EXP-00091: Exporting questionable statistics.
EXP-00091: Exporting questionable statistics.
EXP-00091: Exporting questionable statistics.
EXP-00091: Exporting questionable statistics.
Export terminated successfully with warnings.
从日志文件我们可以分析出,
- 原始数据导出的 Oracle 版本为
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
- 原始数据导出的 Oracle
character 为 AL32UTF8
- 原始数据导出的 Oracle 命令为
EXP
- 原始数据导出的表(exporting table )为
USER_EXPORT
- 原始数据导出的用户(Current user)为
SYSTEM
2. 源数据导出环境为 AL32UTF8 ,目标环境为 ZHS16GBK ,导致命令无法执行或数据乱码;
导入数据时,必须保证两个平台的 字符集一致,若不一致,会导致出现导入失败问题,解决方法为
设置 Oracle 环境变量的方式解决,具体可以参考博文 Oracle 字符集简介及修改操作实战