Oracle 跨平台迁移与 Transportable Tablespaces

Oracle 跨平台迁移与 Transportable Tablespaces

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


1. 概述

Transportable Tablespaces(TTS,可传输表空间) 是 Oracle 跨平台迁移的高效方案[1]:

核心特性

  • 仅迁移数据文件元数据
  • 比传统导出导入快 10-100 倍
  • 支持跨平台
  • 支持跨字节序

2. 平台与字节序

2.1 查看平台

-- 当前平台
SELECT platform_name, endian_format 
FROM v$transportable_platform 
WHERE platform_id = (SELECT platform_id FROM v$database);

-- 所有支持的平台
SELECT platform_id, platform_name, endian_format 
FROM v$transportable_platform
ORDER BY platform_name;

2.2 字节序

字节序平台
LittleLinux, Windows, Solaris x86
BigSolaris SPARC, AIX, HP-UX

2.3 跨字节序需要转换

Linux (Little) → Solaris SPARC (Big)
需要 RMAN CONVERT 转换字节序

3. TTS 迁移流程

3.1 检查表空间自包含

-- 检查自包含
EXEC DBMS_TTS.TRANSPORT_SET_CHECK('users,example', TRUE);

-- 查看结果
SELECT * FROM transport_set_violations;

-- 无结果表示自包含

3.2 将表空间设为只读

ALTER TABLESPACE users READ ONLY;
ALTER TABLESPACE example READ ONLY;

3.3 生成 Transportable Set

# Data Pump 导出元数据
expdp system/pwd DIRECTORY=dpump_dir 
  DUMPFILE=tts_meta.dmp 
  TRANSPORT_TABLESPACES=users,example 
  TRANSPORT_FULL_CHECK=Y

3.4 同字节序直接复制

# 同字节序:直接复制数据文件
# 源库
cp /u01/oradata/orcl/users01.dbf /tmp/
cp /u01/oradata/orcl/example01.dbf /tmp/

# 传输到目标库
scp /tmp/users01.dbf target-host:/u01/oradata/orcl/
scp /tmp/example01.dbf target-host:/u01/oradata/orcl/

3.5 跨字节序 RMAN CONVERT

# RMAN 转换字节序
rman target /

RMAN> CONVERT TABLESPACE users,example 
  TO PLATFORM 'Solaris Operating System (SPARC)' 
  FORMAT '/tmp/%U';

3.6 目标库导入

# 导入元数据
impdp system/pwd DIRECTORY=dpump_dir 
  DUMPFILE=tts_meta.dmp 
  TRANSPORT_DATAFILES='/u01/oradata/orcl/users01.dbf','/u01/oradata/orcl/example01.dbf'

3.7 表空间设为读写

ALTER TABLESPACE users READ WRITE;
ALTER TABLESPACE example READ WRITE;

4. 跨平台完整数据库迁移

4.1 19c Cross-Platform PDB

-- 1. 源 PDB 设为只读
ALTER PLUGGABLE DATABASE hrpdb CLOSE;
ALTER PLUGGABLE DATABASE hrpdb OPEN READ ONLY;

-- 2. 检查兼容性
SET SERVEROUTPUT ON
DECLARE
  compatible BOOLEAN;
BEGIN
  compatible := DBMS_PDB.CHECK_PLUG_COMPATIBILITY(
    pdb_descr_file => NULL,
    pdb_name => 'hrpdb',
    pdb_db_link => NULL);
  IF compatible THEN
    DBMS_OUTPUT.PUT_LINE('Compatible');
  END IF;
END;
/

4.2 RMAN 转换平台

# RMAN CONVERT DATABASE
rman target /

RMAN> CONVERT DATABASE 
  NEW DATABASE 'newdb' 
  TRANSPORT SCRIPT '/tmp/transport.sql' 
  TO PLATFORM 'Linux x86 64-bit' 
  DB_FILE_NAME_CONVERT=('/u01/oradata/orcl/','/u01/oradata/newdb/');

4.3 启动新数据库

# 在目标平台执行 transport.sql
sqlplus / as sysdba
@/tmp/transport.sql

5. 12c+ Full Transportable Export/Import

5.1 完整传输

# 1. 表空间设为只读
sqlplus / as sysdba
ALTER TABLESPACE users READ ONLY;
ALTER TABLESPACE example READ ONLY;

# 2. Full Transportable Export
expdp system/pwd FULL=Y DIRECTORY=dpump_dir 
  DUMPFILE=full_tts.dmp 
  TRANSPORTABLE=ALWAYS 
  VERSION=12

# 3. 复制数据文件和 dump
scp /u01/oradata/orcl/users01.dbf target:/u01/oradata/newdb/
scp /u01/oradata/orcl/example01.dbf target:/u01/oradata/newdb/
scp /u01/dpump/full_tts.dmp target:/u01/dpump/

# 4. 目标库导入
impdp system/pwd FULL=Y DIRECTORY=dpump_dir 
  DUMPFILE=full_tts.dmp 
  TRANSPORT_DATAFILES='/u01/oradata/newdb/users01.dbf','/u01/oradata/newdb/example01.dbf'

6. PDB 跨平台迁移(19c+)

6.1 PDB Relocate

-- 19c+ 零停机 PDB 迁移
CREATE PLUGGABLE DATABASE hrpdb 
  FROM hrpdb@src_link 
  RELOCATE 
  AVAILABILITY MAX;

详细内容见:Oracle 在线 PDB Relocate

6.2 PDB Unplug/Plug

-- 1. 拔出 PDB
ALTER PLUGGABLE DATABASE hrpdb UNPLUG INTO '/tmp/hrpdb.xml';

-- 2. 检查兼容性
SET SERVEROUTPUT ON
DECLARE
  compatible BOOLEAN;
BEGIN
  compatible := DBMS_PDB.CHECK_PLUG_COMPATIBILITY(
    pdb_descr_file => '/tmp/hrpdb.xml',
    pdb_name => 'hrpdb');
END;
/

-- 3. 在新平台插入
CREATE PLUGGABLE DATABASE hrpdb USING '/tmp/hrpdb.xml' NOCOPY;

7. XTTS(Cross-Platform TTS)

7.1 增量跨平台迁移

# 1. 初始增量备份
rman target /
RMAN> BACKUP FOR TRANSPORT FORMAT '/tmp/initial.bkp' 
  TABLESPACE users,example;

# 2. 传输到目标
scp /tmp/initial.bkp target:/tmp/

# 3. 目标库恢复
RMAN> RESTORE FOREIGN DATAFILE 4,5 
  FORMAT '/u01/oradata/newdb/users01.dbf','/u01/oradata/newdb/example01.dbf' 
  FROM BACKUPSET '/tmp/initial.bkp';

# 4. 增量备份
RMAN> BACKUP FOR TRANSPORT INCREMENTAL LEVEL 1 
  FORMAT '/tmp/incr.bkp' TABLESPACE users,example;

# 5. 目标库应用增量
RMAN> RESTORE FOREIGN DATAFILE 4,5 
  FROM BACKUPSET '/tmp/incr.bkp';

# 6. 最终切换(短暂停机)

8. 监控与验证

8.1 验证迁移后数据

-- 1. 行数对比
SELECT COUNT(*) FROM scott.employees;

-- 2. 数据校验
SELECT SUM(id), COUNT(*) FROM scott.employees;

-- 3. 对象数量
SELECT object_type, COUNT(*)
FROM dba_objects 
WHERE owner='SCOTT'
GROUP BY object_type;

8.2 字符集检查

-- 源库与目标库字符集
SELECT parameter, value 
FROM nls_database_parameters 
WHERE parameter LIKE '%CHARACTERSET%';

9. 常见坑与排错

9.1 ORA-29304: 表空间不存在

修复

-- 检查表空间名称
SELECT tablespace_name FROM dba_tablespaces;

9.2 ORA-29333: 表空间非只读

修复

ALTER TABLESPACE users READ ONLY;

9.3 ORA-29341: 自包含违规

修复

-- 检查违规
EXEC DBMS_TTS.TRANSPORT_SET_CHECK('users,example', TRUE);
SELECT * FROM transport_set_violations;

-- 处理违规项后重试

9.4 ORA-39123: 字节序不兼容

修复

# 使用 RMAN CONVERT 转换
RMAN> CONVERT TABLESPACE users 
  TO PLATFORM 'Solaris Operating System (SPARC)' 
  FORMAT '/tmp/%U';

9.5 字符集不匹配

修复

-- 1. 检查字符集
SELECT * FROM nls_database_parameters WHERE parameter='NLS_CHARACTERSET';

-- 2. 目标库调整字符集
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER SYSTEM ENABLE RESTRICTED SESSION;
ALTER DATABASE OPEN;
ALTER DATABASE CHARACTER SET AL32UTF8;

10. 最佳实践

  1. 同平台优先:性能最佳
  2. 跨字节序用 RMAN CONVERT:必须转换
  3. 检查自包含:避免迁移失败
  4. 大表空间用 XTTS:增量迁移
  5. 19c+ 用 PDB Relocate:零停机
  6. 测试验证:迁移后对比数据
  7. 字符集兼容:避免乱码
  8. 数据文件路径:FILE_NAME_CONVERT
  9. 保留旧库:回滚保障
  10. 业务低峰期操作:影响最小

11. 参考资料

[1] Oracle Database Administrator’s Guide 19c, “Transporting Tablespaces” https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/transporting-data.html

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