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 对比
| 维度 | TTS | Data 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. 最佳实践
- 大数据量用 TTS:性能最佳
- 跨平台用 XTTS:增量减少停机
- 检查自包含:避免失败
- 测试库演练:验证流程
- 低峰期操作:减少影响
- 保留旧库:回滚保障
- 监控进度:及时发现问题
- 验证数据:导入后检查
- 19c+ 用 PDB Relocate:零停机
- 结合 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