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 导入包含:
- 用户属性
- 用户角色
- 系统权限
- 视图依赖系统表
- 序列 / 存储过程的创建
- 触发器的编译
这些操作普通业务用户无法完成。
所以正确做法是:
- expdp 可用业务用户执行
- impdp 强烈建议使用 sysdba 执行
否则会产生大量如下错误:
- ORA-31685 权限不足
- ORA-39083 创建对象失败
- ORA-01031 权限不足
- 视图创建失败
- 存储过程无法编译
五、总结:不要用 Navicat,用官方工具 Data Pump
| 迁移方式 | 支持结构 | 支持数据 | 支持权限 | 支持序列 | 支持视图 | 是否可靠 |
|---|---|---|---|---|---|---|
| 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