Oracle 数据迁移最佳实践(不使用第三方工具)

Oracle 数据迁移最佳实践(不使用第三方工具)


复制代码
# Oracle 数据迁移最佳实践指南(避免使用 Navicat,使用 expdp/impdp)

本文介绍如何在 Oracle 环境中进行可靠的数据迁移,并说明为什么 Navicat 等工具并不适合迁移 Oracle 的完整数据结构。

---

# 一、为什么不建议使用 Navicat/DBeaver 迁移 Oracle

第三方工具导出的 SQL 文件通常无法完整覆盖 Oracle 的对象类型,例如:

- 表空间(Tablespace)
- 序列(Sequence)
- 触发器(Trigger)
- 存储过程 / 函数(Procedure / Function)
- 视图(View)
- CLOB/BLOB 字段
- 系统级权限
- 用户、角色、依赖关系等

因此 Navicat 导出再导入常出现:

- ORA-00942:表或视图不存在  
- ORA-01031:权限不足  
- ORA-00959:表空间不存在  
- ORA-00907:语法错误  
- 视图、触发器、序列无法创建  
- 存储过程编译失败  

**这些都不是数据库坏了,而是 SQL 导出本身不完整导致的。**

此外,Navicat 导大数据量性能极差,且依赖关系无法处理,导致大量失败。

👉 **Oracle 官方推荐的迁移方式只有一个:Data Pump(expdp/impdp)。**

---

# 二、正确的数据迁移方式:Oracle Data Pump

Data Pump 支持:

- 表结构  
- 全量数据  
- 视图  
- 存储过程  
- 序列  
- 触发器  
- 权限  
- 用户属性  
- 表空间映射  

并能保持原有依赖关系,是 Oracle 唯一可信的完整迁移手段。

---

# 三、标准迁移步骤(推荐)

以下为完整规范迁移步骤(示例中均不包含任何真实账号或密码)。

---

## **步骤 1:在源库创建 DIRECTORY(必须使用 sysdba)**

```sql
sqlplus / as sysdba
CREATE OR REPLACE DIRECTORY DP AS '数据导出目录路径';
GRANT READ, WRITE ON DIRECTORY DP TO 某业务用户;

步骤 2:源库使用 expdp 导出 schema

复制代码
expdp 业务用户/密码@服务名 schemas=SCHEMA_NAME directory=DP dumpfile=export.dmp logfile=export.log

此步骤会导出:

  • 表 + 数据
  • 视图
  • 触发器
  • 序列
  • 权限
  • 存储过程
  • 依赖关系

步骤 3:将 .dmp 文件复制到目标服务器对应目录

任意方式复制即可,如:

  • U 盘
  • 内网文件传输
  • FTP
  • 共享文件夹

步骤 4:目标库创建 DIRECTORY

仍然使用 sysdba:

复制代码
sqlplus / as sysdba
CREATE OR REPLACE DIRECTORY DP AS '目标服务器中的存放路径';
GRANT READ, WRITE ON DIRECTORY DP TO 某业务用户;

步骤 5:目标库执行 impdp 导入

推荐使用 sysdba 导入(权限最完整)

复制代码
impdp "'/ as sysdba'" schemas=SCHEMA_NAME directory=DP dumpfile=export.dmp logfile=import.log table_exists_action=replace

(如需要)表空间映射 remap_tablespace

如果源库的表空间与目标库不同:

复制代码
impdp "'/ as sysdba'" schemas=SCHEMA_NAME directory=DP dumpfile=export.dmp \
  logfile=import.log \
  remap_tablespace=源表空间:目标表空间

四、权限说明(非常关键)

许多迁移失败都是因为权限不足,因此需要了解权限分工------

Data Pump 导入包含:

  • 用户属性
  • 用户角色
  • 系统权限
  • 视图依赖系统表
  • 序列 / 存储过程的创建
  • 触发器的编译

这些操作普通业务用户无法完成。

所以正确做法是:

  1. expdp 可用业务用户执行
  2. impdp 强烈建议使用 sysdba 执行

否则会产生大量如下错误:

  • ORA-31685 权限不足
  • ORA-39083 创建对象失败
  • ORA-01031 权限不足
  • 视图创建失败
  • 存储过程无法编译

迁移方式 支持结构 支持数据 支持权限 支持序列 支持视图 是否可靠
Navicat / SQL ❌ 不完整 ✔️ 部分 ❌ 缺失 ❌ 不支持 ❌ 依赖失败 ❌ 不推荐
expdp / impdp ✔️ 完整 ✔️ 完整 ✔️ 完整 ✔️ 完整 ✔️ 完整 ✔️ 官方推荐

Data Pump 是唯一可以完整 100% 恢复 Oracle schema 的方式。

🚀 Oracle 数据迁移核心指令(简洁版)

以下步骤适用于 Oracle 11g/12c/19c,迁移方案使用官方 Data Pump(expdp/impdp)。


1. 在两个服务器上创建 DIRECTORY(仅需一次)

复制代码
-- 以 sysdba 登录
sqlplus / as sysdba

-- 创建数据泵目录
CREATE OR REPLACE DIRECTORY DP AS 'E:/oracle/dp';

-- 授权业务用户使用目录
GRANT READ, WRITE ON DIRECTORY DP TO HRBUST;

2. 在源库导出 schema

复制代码
expdp 用户/你的密码@ORCL schemas=HRBUST directory=DP dumpfile=hrbust.dmp logfile=exp.log

3. 把生成的 hrbust.dmp 文件复制到目标服务器的目录

例如:E:/oracle/dp/


4. 在目标库导入 schema(推荐 sysdba 执行)

复制代码
impdp "'/ as sysdba'" schemas=HRBUST directory=DP dumpfile=hrbust.dmp logfile=imp.log table_exists_action=replace

5. 如果目标库没有源库的表空间,需要映射表空间

复制代码
impdp "'/ as sysdba'" schemas=HRBUST directory=DP dumpfile=hrbust.dmp logfile=imp.log \
  remap_tablespace=源表空间:目标表空间 \
  table_exists_action=replace

📌 常用补充命令(可选)

查看 directory 位置

复制代码
select * from dba_directories where directory_name='DP';

删除旧的 dmp 文件避免 ORA-27038

手动删除:

复制代码
hrbust.dmp
exp.log
imp.log
相关推荐
周杰伦fans2 小时前
C# 中的**享元工厂**模式
开发语言·数据库·c#
空空kkk2 小时前
SpringMVC——拦截器
java·数据库·spring·拦截器
J***51682 小时前
MySql中的事务、MySql事务详解、MySql隔离级别
数据库·mysql·adb
SelectDB3 小时前
Apache Doris 中的 Data Trait:性能提速 2 倍的秘密武器
数据库·后端·apache
i***27953 小时前
Spring boot 3.3.1 官方文档 中文
java·数据库·spring boot
TDengine (老段)3 小时前
TDengine 日期函数 DATE 用户手册
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
q***65693 小时前
PostgreSQL 中进行数据导入和导出
大数据·数据库·postgresql
一 乐3 小时前
助农平台|基于SprinBoot+vue的助农服务系统(源码+数据库+文档)
前端·javascript·数据库·vue.js·ecmascript·springboot
NineData4 小时前
保姆级!Oracle→达梦零停机迁移攻略,5 步操作,业务零影响!
数据库·程序员