Oracle数据库导出与导入操作全指南

一、导出与导入的核心意义

Oracle数据库的导出(Export)与导入(Import)是通过逻辑备份实现数据迁移、恢复或归档的关键操作,主要应用于以下场景:

  1. 数据迁移:跨数据库版本、跨平台迁移数据。
  2. 数据归档:定期备份历史数据并清理生产库。
  3. 故障恢复:快速恢复误删表或数据。
  4. 测试环境构建:复制生产数据到测试环境。

二、Oracle导出与导入工具概述

1. 传统工具:exp/imp

  • 特点
    • 适用于Oracle 10g之前的版本。
    • 导出文件为二进制格式(.dmp)。
    • 语法简单但功能有限,逐渐被数据泵替代。

2. 数据泵工具:expdp/impdp

  • 特点
    • Oracle 10g及以上版本推荐工具。
    • 支持并行操作、压缩、加密等高级功能。
    • 基于服务端运行,性能更高。

3. 物理备份工具:RMAN

  • 特点
    • 物理备份数据库文件(数据文件、控制文件)。
    • 支持全量/增量备份,需与逻辑备份结合使用。

三、数据泵(expdp/impdp)操作详解

1. 数据泵导出(expdp)

1.1 基本语法
expdp <用户名>/<密码> DIRECTORY=<目录对象名> DUMPFILE=<导出文件名> SCHEMAS=<模式名>  
1.2 常用参数
参数 说明
DIRECTORY 指定导出文件的存储目录(需预先创建)
DUMPFILE 导出文件名(如mydb.dmp
SCHEMAS 导出指定用户模式(如SCHEMAS=hr,scott
TABLES 导出指定表(如TABLES=hr.employees
FULL 全库导出(FULL=YES
PARALLEL 并行度(如PARALLEL=4
COMPRESSION 压缩导出文件(COMPRESSION=ALL
1.3 示例
  • 导出单个用户模式
    expdp hr/hr DIRECTORY=dpump_dir DUMPFILE=hr_schema.dmp SCHEMAS=hr  
    
  • 导出指定表
    expdp hr/hr DIRECTORY=dpump_dir DUMPFILE=hr_employees.dmp TABLES=employees  
    

2. 数据泵导入(impdp)

2.1 基本语法
impdp <用户名>/<密码> DIRECTORY=<目录对象名> DUMPFILE=<导出文件名> REMAP_SCHEMA=<原用户:目标用户>  
2.2 常用参数
参数 说明
REMAP_SCHEMA 用户映射(如REMAP_SCHEMA=hr:hr_new
REMAP_TABLESPACE 表空间映射(如REMAP_TABLESPACE=users:users_new
TABLE_EXISTS_ACTION 表存在时的操作(SKIP/APPEND/REPLACE/TRUNCATE
EXCLUDE 排除对象(如EXCLUDE=TABLE:"IN ('TEMP')"
2.3 示例
  • 导入用户模式并映射到新用户
    impdp system/oracle DIRECTORY=dpump_dir DUMPFILE=hr_schema.dmp REMAP_SCHEMA=hr:hr_new  
    
  • 导入指定表并追加数据
    impdp hr/hr DIRECTORY=dpump_dir DUMPFILE=hr_employees.dmp TABLES=employees TABLE_EXISTS_ACTION=APPEND  
    

四、目录对象与权限配置

1. 创建目录对象

CREATE DIRECTORY dpump_dir AS '/u01/app/oracle/dpump';  

2. 授权用户访问权限

GRANT READ, WRITE ON DIRECTORY dpump_dir TO hr;  

五、高级功能与性能优化

1. 并行导出与导入

  • 设置并行度
    expdp hr/hr DIRECTORY=dpump_dir DUMPFILE=hr_parallel_%U.dmp SCHEMAS=hr PARALLEL=4  
    
    • %U表示生成多个文件(如hr_parallel_01.dmp, hr_parallel_02.dmp)。

2. 压缩与加密

  • 压缩导出文件
    expdp hr/hr DIRECTORY=dpump_dir DUMPFILE=hr_compressed.dmp COMPRESSION=ALL  
    
  • 加密敏感数据
    expdp hr/hr DIRECTORY=dpump_dir DUMPFILE=hr_encrypted.dmp ENCRYPTION_PASSWORD=mykey  
    

3. 网络模式导出/导入

  • 直接跨数据库迁移
    impdp hr/hr NETWORK_LINK=source_db DIRECTORY=dpump_dir SCHEMAS=hr  
    
    • source_db为预先创建的数据库链接。

六、典型场景与解决方案

场景 操作步骤 注意事项
跨版本迁移(11g → 19c) 使用数据泵导出,设置VERSION=12兼容低版本 检查对象兼容性(如XMLType字段)
恢复误删表 从备份DMP文件中导入指定表 使用TABLE_EXISTS_ACTION=REPLACE
数据归档 导出历史表并清理生产库 结合分区表(Partitioning)减少锁竞争

七、常见问题与解决方法

1. 错误:ORA-39002: invalid operation

  • 原因:目录对象权限不足或路径不存在。
  • 解决
    GRANT READ, WRITE ON DIRECTORY dpump_dir TO hr;  
    

2. 错误:ORA-31655: no data or metadata objects selected

  • 原因:导出过滤条件过于严格(如EXCLUDE误用)。
  • 解决:检查TABLESSCHEMAS参数是否匹配实际对象。

3. 错误:ORA-02374: conversion error loading data

  • 原因:字符集不一致(源库与目标库NLS_LANG设置不同)。
  • 解决
    # 设置环境变量  
    export NLS_LANG=AMERICAN_AMERICA.AL32UTF8  
    

八、最佳实践与总结

1. 备份策略建议

  • 定期全量导出:每周全量导出关键用户模式。
  • 增量导出:每日导出增量变更(结合FLASHBACK_TIME)。
  • 验证备份:定期执行测试恢复流程。

2. 性能优化总结

  • 并行操作:根据CPU核心数设置PARALLEL参数。
  • 压缩与分片:减少I/O压力,加速传输。
  • 网络模式:避免中间文件,直接跨库迁移。

3. 关键注意事项

  • 权限管理:确保用户拥有目录对象读写权限。
  • 字符集一致:源库与目标库NLS_LANG需匹配。
  • 日志监控:通过LOGFILE参数记录操作日志。

附录:常用命令速查表

# 导出全库  
expdp system/oracle DIRECTORY=dpump_dir DUMPFILE=full.dmp FULL=YES  

# 导入全库  
impdp system/oracle DIRECTORY=dpump_dir DUMPFILE=full.dmp FULL=YES  

# 导出指定表空间  
expdp system/oracle DIRECTORY=dpump_dir DUMPFILE=tbs_users.dmp TABLESPACES=users  

# 查看导出文件内容  
impdp system/oracle DIRECTORY=dpump_dir DUMPFILE=hr.dmp SQLFILE=hr_metadata.sql  

实操示例

一、导出操作(expdp/exp)

使用 expdp 导出全库(普通用户模式)

# 导出全库(排除系统表)
expdp username/password directory=DATA_PUMP_DIR dumpfile=full_20230321.dmp logfile=expdp.log

导出指定用户对象
bash
# 导出指定用户所有对象
expdp sjk_190828/sjk_190828 \
directory=DATA_PUMP_DIR \
dumpfile=sjk_20200602.dmp \
logfile=exp_20200602.log
导出指定表(数据泵模式)
bash
expdp sjk_190828/sjk_190828 \
directory=DATA_PUMP_DIR \
dumpfile=sjk_20230313.dmp \
tables=('inv_sbpc') \
rows=n  # 仅导出表结构
传统导出工具 exp
bash
# 导出指定表(兼容旧版本)
exp username/password@database \
file=/path/to/dump.dmp \
tables=('tab1','tab2') \
rows=y  # 导出数据(默认)

二、导入操作(impdp)

基本导入(覆盖已存在表)

impdp username/password@target_db \
directory=DATA_PUMP_DIR \
dumpfile=sjk_20230321.dmp \
table_exists_action=replace

模式重映射(用户迁移)

impdp sjk_230315/sjk@target_db \
directory=DATA_PUMP_DIR \
dumpfile=sjk_20230321.dmp \
remap_schema=sjk_190828:sjk_230315

数据泵导入注意事项
确保目标库已创建同名用户
提前创建 DATA_PUMP_DIR 目录
检查权限:

grant imp_full_database to username;

三、文件管理与传输

查找 dmp 文件

# 在Linux系统查找文件
find / -name 'sjk_20200602.dmp'
下载文件(SecureCRT 等工具)
bash
# 进入目标目录
cd /home/work/data/oracle/u01/app/oracle/admin/zssd/dpdump

# 使用sz命令下载
sz sjk_20230306.dmp

四、环境配置检查

查看数据泵目录

以sysdba身份登录检查

sqlplus / as sysdba
SELECT directory_path 
FROM dba_directories 
WHERE directory_name = 'DATA_PUMP_DIR' 
AND owner = 'SYS';

典型目录路径示例

Linux: /u01/app/oracle/admin/实例名/dpdump/
Windows: E:\app\PC\admin\orcl\dpdump\

五、常见问题

权限问题
普通用户需授予 exp_full_database 权限
避免使用 AS SYSDBA 登录(非系统用户)
路径配置
确保导出 / 导入目录一致
跨平台注意路径格式差异(Windows 反斜杠转义)
数据一致性
导出前执行

ALTER TABLESPACE READ ONLY

大表建议分批次导出

Logo

一站式 AI 云服务平台

更多推荐