Oracle TTS 传输表空间详解

Oracle TTS 传输表空间详解

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


1. 概述

TTS(Transportable Tablespace)跨库传输表空间[1]:

优势

  • 快速
  • 跨平台
  • 大数据迁移

详细见:Oracle TTS 传输表空间


2. 适用场景

  • 数据库迁移
  • 数据仓库加载
  • 跨平台
  • 数据归档

3. 同平台 TTS

3.1 自包含检查

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

3.2 READ ONLY

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

3.3 导出元数据

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

3.4 复制数据文件

scp /u01/oradata/users01.dbf target:/u01/oradata/
scp /u01/oradata/tools01.dbf target:/u01/oradata/
scp tts.dmp target:/tmp/

3.5 导入

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

3.6 READ WRITE

-- 源
ALTER TABLESPACE users READ WRITE;
ALTER TABLESPACE tools READ WRITE;

-- 目标
ALTER TABLESPACE users READ WRITE;
ALTER TABLESPACE tools READ WRITE;

4. 跨平台 TTS

4.1 查看 Endian

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

SELECT platform_name FROM v$database;

4.2 同 Endian

- 直接传输
- 无需 CONVERT
- 如 Linux x86 ↔ Windows x86

4.3 跨 Endian

- 必须 CONVERT
- 如 Solaris SPARC → Linux x86

4.4 CONVERT

-- 源平台
RMAN> CONVERT TABLESPACE users
  TO PLATFORM 'Linux x86 64-bit'
  FORMAT '/u01/converted/%U';

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

详细见:Oracle 跨平台迁移


5. XTTS(增量)

5.1 概述

- 11g+
- 减少停机
- 增量传输

5.2 步骤

1. 初始全量传输
2. 持续增量传输
3. 业务停机
4. 最后增量
5. 切换

5.3 RMAN

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

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

6. 自包含

6.1 检查内容

  • 索引
  • 约束
  • 触发器
  • 对象依赖

6.2 解决

- 包含依赖对象
- 或移除依赖
- 重试检查

7. 限制

7.1 不可传输

  • SYSTEM 表空间
  • SYSAUX 表空间
  • Undo 表空间
  • Temporary 表空间

7.2 对象

  • 视图(同义词)
  • 存储过程
  • 同义词(依赖对象)

7.3 字符集

- 必须一致
- 或源是目标的超集

8. 完整示例

8.1 源库

-- 1. 检查
BEGIN
  DBMS_TTS.TRANSPORT_SET_CHECK('users', TRUE);
END;
/
SELECT * FROM transport_set_violations;

-- 2. READ ONLY
ALTER TABLESPACE users READ ONLY;

8.2 导出

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

8.3 传输

scp /u01/oradata/users01.dbf target:/u01/oradata/
scp tts.dmp target:/tmp/

8.4 目标库

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

8.5 验证

-- 1. 表空间状态
SELECT tablespace_name, status FROM dba_tablespaces;

-- 2. 数据
SELECT COUNT(*) FROM scott.employees;

-- 3. READ WRITE
ALTER TABLESPACE users READ WRITE;

8.6 源库恢复

ALTER TABLESPACE users READ WRITE;

9. 12c+ 全库传输

9.1 完整数据库

expdp system/pwd DIRECTORY=dpump_dir DUMPFILE=fdb.dmp 
  FULL=Y 
  TRANSPORTABLE=ALWAYS 
  VERSION=19.0

9.2 优势

- 全库传输
- 减少手动
- 跨平台

10. 性能

10.1 数据文件大小

- 文件少
- 大文件
- 复制快

10.2 网络

- 高带宽
- 压缩
- 并行

10.3 I/O

- 直接 I/O
- 异步
- 磁盘分离

11. 验证

11.1 自包含

SELECT * FROM transport_set_violations;
-- 应为空

11.2 Endian

SELECT d.platform_name, p.endian_format
FROM v$database d, v$transportable_platform p
WHERE d.platform_name = p.platform_name;

11.3 字符集

SELECT parameter, value FROM nls_database_parameters 
WHERE parameter LIKE '%CHARACTERSET';

12. 常见坑与排错

12.1 ORA-29304

- 表空间不存在
- 检查名字

12.2 ORA-29341

- 自包含违反
- 解决依赖

12.3 ORA-29345

- 字符集不兼容
- 检查字符集

12.4 ORA-39123

- 平台不支持
- 检查 Endian

13. 最佳实践

  1. 自包含检查:必做
  2. READ ONLY:必须
  3. 跨 Endian CONVERT:必须
  4. 多文件并行:性能
  5. XTTS 增量:减少停机
  6. 字符集一致:避免问题
  7. 验证完整:质量
  8. 测试:可行
  9. 文档化:流程
  10. 业务低峰:影响小

14. 参考资料

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