Oracle 导入导出 dmp 数据文件实战

一、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) 示例
  1. 查询 Oracle 预先创建的Oracle目录对象
bash 复制代码
select * from dba_directories;
  1. 创建指定的 Oracle 目录对象(关联物理路径)
bash 复制代码
create directory testdir as 'D:\OracleDMP';
  1. 手动创建物理目录 D:\OracleDMP
  2. 将这个目录指给用户(TEST_FORMAL)
bash 复制代码
SQL> grant read,write on directory testdir to TEST_FORMAL;
  1. 执行导出命令
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 字符集简介及修改操作实战

相关推荐
lichenyang4532 小时前
使用react进行用户管理系统
数据库
木子.李3473 小时前
数据结构-算法学习C++(入门)
数据库·c++·学习·算法
Layux3 小时前
flowable候选人及候选人组(Candidate Users 、Candidate Groups)的应用包含拾取、归还、交接
java·数据库
@Turbo@4 小时前
【QT】在QT6中读取文件的方法
开发语言·数据库·qt
ArabySide4 小时前
【EF Core】 EF Core 批量操作的进化之路——从传统变更跟踪到无跟踪更新
数据库·.net·efcore
线条16 小时前
Hive SQL 中 BY 系列关键字全解析:从排序、分发到分组的核心用法
数据库·hive·sql
字节源流6 小时前
【MYSQL】索引篇(一)
数据库·mysql
n33(NK)6 小时前
MySQL中count(1)和count(*)的区别及细节
数据库·mysql
heart000_17 小时前
MySQL高级查询技巧:分组、聚合、子查询与分页【MySQL系列】
数据库·mysql
凭君语未可9 小时前
MySQL中COUNT(*)、COUNT(1)和COUNT(字段名)的深度剖析与实战应用
数据库·mysql