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
相关推荐
JIngJaneIL4 小时前
基于springboot + vue古城景区管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
微学AI4 小时前
复杂时序场景的突围:金仓数据库是凭借什么超越InfluxDB?
数据库
廋到被风吹走5 小时前
【数据库】【Redis】定位、优势、场景与持久化机制解析
数据库·redis·缓存
有想法的py工程师6 小时前
PostgreSQL + Debezium CDC 踩坑总结
数据库·postgresql
Nandeska6 小时前
2、数据库的索引与底层数据结构
数据结构·数据库
小卒过河01046 小时前
使用apache nifi 从数据库文件表路径拉取远程文件至远程服务器目的地址
运维·服务器·数据库
过期动态6 小时前
JDBC高级篇:优化、封装与事务全流程指南
android·java·开发语言·数据库·python·mysql
Mr.朱鹏6 小时前
SQL深度分页问题案例实战
java·数据库·spring boot·sql·spring·spring cloud·kafka
一位代码6 小时前
mysql | 常见日期函数使用及格式转换方法
数据库·mysql
SelectDB7 小时前
Apache Doris 4.0.2 版本正式发布
数据库·人工智能