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 字节序
| 字节序 | 平台 |
|---|---|
| Little | Linux, Windows, Solaris x86 |
| Big | Solaris 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. 最佳实践
- 同平台优先:性能最佳
- 跨字节序用 RMAN CONVERT:必须转换
- 检查自包含:避免迁移失败
- 大表空间用 XTTS:增量迁移
- 19c+ 用 PDB Relocate:零停机
- 测试验证:迁移后对比数据
- 字符集兼容:避免乱码
- 数据文件路径:FILE_NAME_CONVERT
- 保留旧库:回滚保障
- 业务低峰期操作:影响最小
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/