Oracle 表空间传输(TTS)实战

Oracle 表空间传输(TTS)实战

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


1. 概述

Transportable Tablespace(TTS,表空间传输) 是高效迁移数据的方案[1],仅传输数据文件+元数据:

详细架构见:Oracle 跨平台迁移与 TTS

本文聚焦实战操作。


2. TTS 类型

类型说明
同平台 TTS相同 OS/字节序
跨平台 TTS(XTTS)不同 OS/字节序
Full Transportable全库传输(12c+)

3. 同平台 TTS 实战

3.1 环境准备

-- 源库与目标库:Linux x86-64
-- 表空间:users, example
-- 用户:scott

-- 检查平台
SELECT platform_name, endian_format 
FROM v$transportable_platform 
WHERE platform_id = (SELECT platform_id FROM v$database);
-- Linux x86 64-bit (Little)

3.2 检查自包含

-- 检查表空间是否自包含
EXEC DBMS_TTS.TRANSPORT_SET_CHECK('users,example', TRUE);

-- 查看违规
SELECT * FROM transport_set_violations;
-- 无结果表示自包含

3.3 设置只读

-- 表空间设为只读
ALTER TABLESPACE users READ ONLY;
ALTER TABLESPACE example READ ONLY;

3.4 导出元数据

expdp system/pwd DIRECTORY=dpump_dir \
  DUMPFILE=tts_meta.dmp \
  TRANSPORT_TABLESPACES=users,example \
  TRANSPORT_FULL_CHECK=Y \
  LOGFILE=tts_export.log

3.5 复制数据文件

# 复制数据文件到目标库
scp /u01/oradata/orcl/users01.dbf target-host:/u01/oradata/orcl/
scp /u01/oradata/orcl/example01.dbf target-host:/u01/oradata/orcl/

# 复制 dump 文件
scp /u01/dpump/tts_meta.dmp target-host:/u01/dpump/

3.6 目标库导入

impdp system/pwd DIRECTORY=dpump_dir \
  DUMPFILE=tts_meta.dmp \
  TRANSPORT_DATAFILES='/u01/oradata/orcl/users01.dbf','/u01/oradata/orcl/example01.dbf' \
  LOGFILE=tts_import.log

3.7 设为读写

-- 目标库
ALTER TABLESPACE users READ WRITE;
ALTER TABLESPACE example READ WRITE;

-- 源库(如不再需要)
ALTER TABLESPACE users READ WRITE;
ALTER TABLESPACE example READ WRITE;

3.8 验证

-- 检查数据
SELECT COUNT(*) FROM scott.employees;
SELECT object_type, COUNT(*) FROM dba_objects WHERE owner='SCOTT' GROUP BY object_type;

4. 跨平台 TTS(XTTS)

4.1 检查字节序

-- 源库:Linux (Little)
-- 目标库:Solaris SPARC (Big)
-- 需要转换

4.2 RMAN CONVERT

# 方法 1:在源库转换
rman target /

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

# 复制转换后的文件
scp /tmp/conv_* target-host:/u01/oradata/orcl/

# 方法 2:在目标库转换
# 直接复制原文件,在目标库转换
scp /u01/oradata/orcl/users01.dbf target-host:/tmp/
scp /u01/oradata/orcl/example01.dbf target-host:/tmp/

# 在目标库
rman target /
RMAN> CONVERT DATAFILE '/tmp/users01.dbf','/tmp/example01.dbf' 
  FROM PLATFORM 'Linux x86 64-bit' 
  DB_FILE_NAME_CONVERT=('/tmp/','/u01/oradata/orcl/');

4.3 后续步骤

同同平台 TTS。


5. 增量 XTTS(减少停机)

5.1 初始备份

# 源库
rman target /

RMAN> BACKUP FOR TRANSPORT FORMAT '/tmp/initial_%U.bkp' 
  TABLESPACE users,example;

5.2 目标库恢复

# 传输
scp /tmp/initial_*.bkp target-host:/tmp/

# 目标库
rman target /

RMAN> RESTORE FOREIGN DATAFILE 4,5 
  FORMAT '/u01/oradata/orcl/users01.dbf','/u01/oradata/orcl/example01.dbf' 
  FROM BACKUPSET '/tmp/initial_01.bkp';

5.3 增量备份

# 源库(业务继续运行)
RMAN> BACKUP FOR TRANSPORT INCREMENTAL LEVEL 1 
  FORMAT '/tmp/incr_%U.bkp' 
  TABLESPACE users,example;

# 传输
scp /tmp/incr_*.bkp target-host:/tmp/

5.4 应用增量

# 目标库
RMAN> RESTORE FOREIGN DATAFILE 4,5 
  FROM BACKUPSET '/tmp/incr_01.bkp';

5.5 最终切换

-- 1. 源库表空间只读
ALTER TABLESPACE users READ ONLY;
ALTER TABLESPACE example READ ONLY;

-- 2. 最后一次增量
-- 3. 应用增量
-- 4. 导出元数据
-- 5. 目标库导入

6. Full Transportable(12c+)

6.1 完整迁移

# 1. 系统表空间只读
ALTER TABLESPACE system READ ONLY;
ALTER TABLESPACE sysaux READ ONLY;
ALTER TABLESPACE users READ ONLY;

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

# 3. 复制所有数据文件
scp /u01/oradata/orcl/*.dbf target-host:/u01/oradata/newdb/

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

7. TTS 与 Data Pump 对比

维度TTSData Pump
速度快(仅复制文件)慢(导出导入)
停机短(只读切换)
跨平台支持支持
元数据仅表空间对象全部
复杂度
适用大数据量小-中数据量

8. 常见坑与排错

8.1 ORA-29341: 自包含违规

修复

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

-- 处理:
-- 1. 移动对象到目标表空间
-- 2. 包含依赖表空间
-- 3. 删除依赖对象

8.2 ORA-19721: 字节序不匹配

修复

# 使用 RMAN CONVERT 转换
RMAN> CONVERT TABLESPACE users TO PLATFORM '...' FORMAT '...';

8.3 ORA-39151: 表空间只读

修复

-- 表空间必须只读
ALTER TABLESPACE users READ ONLY;

8.4 数据文件路径错误

修复

# 使用 DB_FILE_NAME_CONVERT
impdp system/pwd DIRECTORY=dpump_dir DUMPFILE=tts.dmp \
  TRANSPORT_DATAFILES='/new/path/users01.dbf'

8.5 字符集不一致

修复

-- 检查字符集
SELECT * FROM nls_database_parameters WHERE parameter LIKE '%CHARACTERSET%';

# 目标库字符集应兼容源库

9. 最佳实践

  1. 大数据量用 TTS:性能最佳
  2. 跨平台用 XTTS:增量减少停机
  3. 检查自包含:避免失败
  4. 测试库演练:验证流程
  5. 低峰期操作:减少影响
  6. 保留旧库:回滚保障
  7. 监控进度:及时发现问题
  8. 验证数据:导入后检查
  9. 19c+ 用 PDB Relocate:零停机
  10. 结合 Data Pump:元数据迁移

10. 参考资料

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