Oracle 跨平台迁移

Oracle 跨平台迁移

适用版本:Oracle Database 10g / 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

跨平台迁移方案[1]:

场景

  • Solaris → Linux
  • Windows → Linux
  • Big Endian → Little Endian

详细见:Oracle 零停机迁移方案


2. 平台支持

2.1 查看

SELECT platform_id, platform_name, endian_format 
FROM v$transportable_platform
ORDER BY platform_name;

-- 当前平台
SELECT platform_name FROM v$database;

2.2 Endian

Endian平台
LittleLinux x86, Windows
BigSolaris SPARC, AIX, HP-UX

3. 迁移方式

3.1 同 Endian

  • RMAN Backup/Restore
  • TTS
  • Active Duplicate

3.2 跨 Endian

  • TTS + CONVERT
  • Data Pump
  • GoldenGate

4. RMAN CONVERT

4.1 概述

  • 10g+
  • 同 Endian 直接
  • 跨 Endian CONVERT

4.2 步骤

-- 1. OPEN READ ONLY
STARTUP MOUNT;
ALTER DATABASE OPEN READ ONLY;

-- 2. 检查
RMAN> RUN {
  SET NEWNAME FOR DATAFILE 1 TO '/u01/oradata/system01.dbf';
  ...
  CONVERT DATABASE 
    NEW DATABASE 'orcl'
    TRANSPORT SCRIPT '/tmp/transport.sql'
    TO PLATFORM 'Linux x86 64-bit';
}

-- 3. 复制文件到目标

-- 4. 执行 transport.sql

5. TTS 跨 Endian

5.1 检查自包含

BEGIN
  DBMS_TTS.TRANSPORT_SET_CHECK('users, tools, indexes', TRUE);
END;
/
SELECT * FROM transport_set_violations;

5.2 READ ONLY

ALTER TABLESPACE users READ ONLY;
ALTER TABLESPACE tools READ ONLY;

5.3 导出元数据

expdp system/pwd DIRECTORY=dpump_dir DUMPFILE=tts.dmp 
  TRANSPORT_TABLESPACES=users,tools 
  TRANSPORT_FULL_CHECK=Y

5.4 CONVERT 数据文件

# 源平台
RMAN> CONVERT DATAFILE 
  '/u01/oradata/users01.dbf',
  '/u01/oradata/tools01.dbf'
  TO PLATFORM 'Linux x86 64-bit'
  FROM PLATFORM 'Solaris[tm] OE (64-bit)'
  DB_FILE_NAME_CONVERT 
  ('/u01/oradata/', '/u01/converted/')
  PARALLELISM 4;

5.5 复制到目标

scp /u01/converted/*.dbf target-host:/u01/oradata/
scp tts.dmp target-host:/tmp/

5.6 导入

impdp system/pwd DIRECTORY=dpump_dir DUMPFILE=tts.dmp 
  TRANSPORT_DATAFILES='/u01/oradata/users01.dbf','/u01/oradata/tools01.dbf'

5.7 READ WRITE

ALTER TABLESPACE users READ WRITE;
ALTER TABLESPACE tools READ WRITE;

详细见:Oracle TTS 传输表空间


6. Data Pump

6.1 适用

  • 跨平台
  • 跨版本
  • 选择性

6.2 导出

expdp system/pwd DIRECTORY=dpump_dir DUMPFILE=full.dmp 
  FULL=Y PARALLEL=8 COMPRESSION=ALL

6.3 传输

scp full.dmp target-host:/tmp/

6.4 导入

impdp system/pwd DIRECTORY=dpump_dir DUMPFILE=full.dmp 
  FULL=Y PARALLEL=8

详细见:Oracle Data Pump 详解


7. GoldenGate 跨平台

7.1 概述

  • 实时
  • 零停机
  • 异构

7.2 架构

源 (Solaris) → Extract → Pump → Replicat → 目标 (Linux)

详细见:Oracle GoldenGate 实时复制


8. XTTS(Cross-Platform TTS)

8.1 11g RMAN

# 1. 增量备份
RMAN> BACKUP FOR TRANSPORT INCREMENTAL LEVEL 0 
  FORMAT '/u01/backup/%U' 
  TABLESPACE users;

# 2. 传输
# 3. 应用
# 4. 增量
# 5. 切换

8.2 12c+

RMAN> BACKUP FOR TRANSPORT INCREMENTAL LEVEL 0 
  FORMAT '/u01/backup/%U' 
  TABLESPACE users
  PLATFORM 'Linux x86 64-bit';

9. 验证

9.1 字符集

SELECT * FROM nls_database_parameters 
WHERE parameter IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET');

9.2 数据

-- 行数对比
SELECT 'EMPLOYEES' AS tab, COUNT(*) FROM employees
UNION ALL
SELECT 'DEPARTMENTS', COUNT(*) FROM departments;

-- 对象
SELECT COUNT(*) FROM dba_objects;

9.3 字节序

-- 确认平台
SELECT platform_name FROM v$database;

10. 字符集注意

10.1 一致

- 源和目标字符集一致
- 推荐 AL32UTF8

10.2 转换

- Data Pump 自动转换
- TTS 必须一致

11. 常见坑与排错

11.1 Endian 不支持

- 检查 v$transportable_platform
- 跨 Endian 必须 CONVERT

11.2 字符集不一致

-- TTS 必须一致
-- Data Pump 自动转换

11.3 自包含违反

-- 检查
SELECT * FROM transport_set_violations;
-- 解决
-- - 包含依赖
-- - 移除依赖

12. 最佳实践

  1. 平台支持验证:前提
  2. 同 Endian 直接:简单
  3. 跨 Endian CONVERT:必须
  4. TTS 大数据:高效
  5. XTTS 增量:减少停机
  6. Data Pump 简单:中小
  7. GoldenGate 零停机:大型
  8. 字符集一致:避免问题
  9. 验证完整性:业务
  10. 文档化:流程

13. 参考资料

[1] Oracle Database Backup and Recovery User’s Guide 19c, “Cross-Platform” https://docs.oracle.com/en/database/oracle/oracle-database/19/bradv/