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
相关推荐
AI人工智能+电脑小能手6 小时前
【大白话说Java面试题 第87题】【Mysql篇】第17题:分布式事务的实现原理?
java·数据库·分布式·mysql·面试
yyuuuzz6 小时前
独立站的技术基础与常见运维问题
大数据·运维·服务器·网络·数据库·aws
键盘上的猫头鹰9 小时前
【MySQL 教程(八)】索引、事务、用户管理、导入导出与分页查询
数据库·python·mysql
Royzst9 小时前
数据库知识点
数据库
雪的季节10 小时前
企业级 Qt 全功能项目
开发语言·数据库·qt
宋浮檀s10 小时前
应急响应——Web漏洞:命令执行+SSRF+弱口令
运维·数据库·sql·网络安全·oracle·应急响应
yurenpai(27届找实习中)11 小时前
redis_点评(21.好友关注——关注、取关功能实现;共同关注功能实现)
数据库·redis·缓存
Rick199311 小时前
索引的排序和分组
数据库·mysql
爱莉希雅&&&11 小时前
zabbix快速搭建和使用
android·linux·数据库·zabbix·监控
JohnYan12 小时前
工作笔记 - PG分组极值
数据库·后端·postgresql