Ubuntu 上 Oracle 数据库迁移实操指南
一、迁移方式选型
- Data Pump 逻辑迁移(expdp/impdp):适合大多数版本升级、跨小版本迁移、选择性迁移(按schema/表)、或源与目标 Endian/字符集不一致的场景。操作简便、可并行、可重映射用户与表空间,停机时间可控。
- RMAN 跨平台传输数据库(Full Transportable Export/Import):适合整库迁移且要求停机时间极短的场景。基本思路是源库只读后,用 RMAN 转换数据文件到目标平台,再在目标端执行脚本开库。支持在源端或目标端做平台转换。
- XTTS(Cross-Platform Transportable Tablespaces):适合超大规模数据库、需要增量同步与分阶段切换的跨平台迁移(如 Unix/Linux 到 Linux)。复杂度较高,但停机窗口最小。
- 仅更换存储或目录(非跨机/跨平台):在同一主机/同平台下移动 数据文件/表空间,通过脱机、移动、rename datafile 完成,停机时间取决于表空间大小与业务可停窗。
二、Data Pump 迁移步骤(推荐通用)
- 源库准备
- 以 oracle 用户登录,创建目录对象并授权:
- SQL> create or replace directory tmpDir as ‘/tempFile’;
- SQL> grant read, write on directory tmpDir to your_user;
- 导出(按 schema 示例):
- $ expdp your_user/password@//host:1521/service schemas=your_user directory=tmpDir dumpfile=export.dmp logfile=export.log parallel=4
- 如需仅导出部分表:
- $ expdp … tables=T1,T2 directory=tmpDir dumpfile=export.dmp logfile=export.log
- 传输转储文件
- $ scp -P 2222 /tempFile/export.dmp user@target:/home/tempFile/
- 目标库准备
- 创建同名/映射的 表空间 与 用户(保持默认表空间一致可减少额外参数),并创建目录对象:
- SQL> create or replace directory tmpDir as ‘/tempFile’;
- SQL> grant read, write on directory tmpDir to your_user;
- 导入
- 同构同版本直导:
- $ impdp your_user/password@//host:1521/service directory=tmpDir dumpfile=export.dmp logfile=import.log parallel=4
- 跨用户/跨表空间重映射(常见):
- $ impdp system/password@//host:1521/service directory=tmpDir dumpfile=export.dmp remap_schema=src_user:dst_user remap_tablespace=SRC_TS:DST_TS logfile=import.log TABLE_EXISTS_ACTION=REPLACE
- 常用参数说明:
- TABLE_EXISTS_ACTION:SKIP/APPEND/TRUNCATE/REPLACE
- VERSION:当源/目标版本不一致时,用 VERSION 指定目标库兼容版本(expdp 侧设置)
- PARALLEL:按 CPU/IO 能力设置并行度提升速度
三、RMAN 跨平台整库迁移(停机短)
- 前置检查
- 确认两端平台名称与兼容性:
- SQL> select platform_name from v$database;
- SQL> select * from v$transportable_platform order by platform_name;
- 源库只读并校验可传输性:
- SQL> startup mount;
- SQL> alter database open read only;
- SQL> SET SERVEROUTPUT ON;
DECLARE
db_ready BOOLEAN;
BEGIN
db_ready := DBMS_TDB.CHECK_DB(‘Linux x86 64-bit’); – 目标平台名
END;
/
- 方式 A(源端转换,目标端开库)
- 源端 RMAN 转换并生成脚本:
- $ rman target /
- RMAN> CONVERT DATABASE
NEW DATABASE ‘newdb’
TO PLATFORM ‘Linux x86 64-bit’
FORMAT ‘/tmp/%U’
TRANSPORT SCRIPT ‘/tmp/crdb.sql’
DATAPUMP DESTINATION ‘/tmp’;
- 将生成的 数据文件、TRANSPORT SCRIPT、PFILE 传到目标端(保持目录结构一致或后续编辑脚本)
- 目标端开库:
- $ sqlplus / as sysdba
- SQL> startup nomount;
- SQL> @/tmp/crdb.sql
- 方式 B(目标端转换)
- 源端只读后拷贝数据文件到目标端;
- 目标端 RMAN 转换并开库:
- $ rman target /
- RMAN> CONVERT DATABASE
ON TARGET PLATFORM
NEW DATABASE ‘newdb’
FORMAT ‘/u01/oradata/%U’
TRANSPORT SCRIPT ‘/u01/oradata/crdb.sql’
DATAPUMP DESTINATION ‘/u01/oradata’;
- SQL> startup nomount;
- SQL> @/u01/oradata/crdb.sql
- 重要提示
- 传输集通常不含 tempfiles、redo logs、control files、spfile/pfile、口令文件、外部表/BFILE 等,需按脚本或手工补齐;必要时用 DBNEWID 更改 DBID。
四、XTTS 跨平台迁移(超大规模与增量)
- 适用场景:TB 级数据、可接受复杂准备、需要增量前滚与分阶段切换的跨平台迁移(如 AIX/Solaris/HPUX → Linux x86-64)。
- 核心思路
- 准备可传输表空间集(只读检查、自包含检查),导出元数据;
- 初始导入到目标库;
- 通过 增量备份(RMAN) 持续前滚数据差异;
- 短暂停业务,最后一次增量与切换,完成最终导入与校验。
- 实施要点
- 版本建议:源库 11.2.0.4+,目标库 12.1.0.2+ 更易实施;
- 严格做 自包含检查 与 平台/字节序评估;
- 规划 停机窗口、对象统计信息收集、无效对象编译与回放验证脚本。
五、常见问题与关键注意事项
- 版本与工具兼容
- exp/imp 与 expdp/impdp 转储文件互不兼容;跨版本迁移优先用 Data Pump,必要时用 VERSION 参数控制导出对象兼容性。
- 字符集与 Endian
- 字符集建议保持一致;跨 Endian 平台整库迁移优先 RMAN 跨平台或 XTTS。
- 目录与权限
- Data Pump 的 directory 对象必须存在且对目标用户授予 READ/WRITE;操作系统目录需 oracle:oinstall 权限与合适 Umask。
- 表空间与存储
- 目标库提前创建同名/映射的 表空间 与 用户;导入时用 remap_tablespace/remap_schema 减少手工改动。
- 增量与回滚
- 整库一次性切换用 RMAN 跨平台;需要滚动窗口与最小停机用 XTTS。
- 校验与回放
- 迁移后核对:数据量(count/checksum)、对象数量、无效对象、统计信息、应用连通性与关键业务回放。
- 仅更换磁盘/目录(同平台)
- 表空间级迁移流程:offline → 拷贝/移动数据文件 → alter tablespace rename datafile → online;注意权限与文件占用。