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
相关推荐
倔强的石头_3 小时前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库
jiayou641 天前
KingbaseES 实战:深度解析数据库对象访问权限管理
数据库
李广坤2 天前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
爱可生开源社区3 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
随逸1773 天前
《从零搭建NestJS项目》
数据库·typescript
加号34 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏4 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
李慕婉学姐4 天前
Springboot智慧社区系统设计与开发6n99s526(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
百锦再4 天前
Django实现接口token检测的实现方案
数据库·python·django·sqlite·flask·fastapi·pip
tryCbest4 天前
数据库SQL学习
数据库·sql