Oracle 11g中用可传输表空间(TTS)迁移最快,但需源目标库同平台、同字节序、兼容块大小;须检查endian_format一致、表空间自包含且设为只读,再用expdp导出元数据并复制数据文件,最后impdp导入并设为读写。
oracle 11g 中迁移表空间到新存储,用可传输表空间(tts)是最快、最可控的方式——前提是源和目标数据库在**同一平台、同字节序、兼容块大小**。跨平台或需增量同步时得换 xtts,但那是另一套逻辑。
检查平台兼容性与字节序是否一致
不验证这一步,impdp 会直接报错 ORA-39123: Data Pump transportable tablespace job failed 或更底层的 endian 不匹配错误。必须两边都查:
在源库执行:SELECT platform_name, endian_format FROM v$database, v$transportable_platform WHERE v$database.platform_name = v$transportable_platform.platform_name;
在目标库执行同样语句。两个 endian_format 值必须完全相同(如都是 Little 或都是 Big)。如果不同,RMAN 转换不可避免,且不能跳过;expdp 生成的 dump 文件无法被目标库识别。
确保表空间自包含且设为只读
TTS 要求表空间内对象不依赖外部表空间(比如索引在 A 表空间,而对应表在 B 表空间),否则导入会失败或数据不一致。
- 运行自包含检查:
EXEC DBMS_TTS.TRANSPORT_SET_CHECK('USERS', TRUE);(把USERS换成你要迁移的实际表空间名) - 检查结果:
SELECT * FROM TRANSPORT_SET_VIOLATIONS;,输出为空才安全 - 设只读:
ALTER TABLESPACE USERS READ ONLY;—— 这步不可省,否则expdp会拒绝导出 - 注意:设只读后,应用写入该表空间的操作会立即报
ORA-01642: begin backup not valid for read only tablespace,务必协调停写窗口
用 Data Pump 导出元数据 + 复制数据文件
Oracle 11g 起,exp/imp 不再支持 TTS 元数据导出(XMLType 例外),必须用 expdp。
导出命令示例(在源库执行):expdp '/ as sysdba' directory=DATA_PUMP_DIR dumpfile=users_tts.dmp logfile=users_tts.log transport_tablespaces=USERS transport_full_check=y
关键点:
-
transport_full_check=y启用严格依赖检查(比DBMS_TTS更细),建议始终开启 - dump 文件只含元数据,真正耗时的是数据文件复制 —— 直接
scp或rsync对应的.dbf文件(路径查SELECT file_name FROM dba_data_files WHERE tablespace_name='USERS';) - 目标端数据文件路径要提前规划好,
impdp的transport_datafiles参数必须精确指向新位置的绝对路径
在目标库导入并恢复读写
导入前,目标库需已存在对应用户(或用 remap_schema 映射),且用户默认表空间不能是待导入的表空间(否则报 ORA-39120)。
导入命令示例:impdp '/ as sysdba' dumpfile=users_tts.dmp directory=DATA_PUMP_DIR transport_datafiles='/u02/oradata/ORCL/users01.dbf' logfile=imp_users.log
常见卡点:
- 目标库若已存在同名表空间,
impdp默认失败;加table_exists_action=replace可覆盖,但会清空原内容 - 导入完成后立刻执行:
ALTER TABLESPACE USERS READ WRITE;,否则应用连不上 - 别忘了验证:查
DBA_TABLESPACES状态、抽样查几张表数据是否可读、检查段是否归属正确
最容易被忽略的是:表空间迁移后,DBA_DATA_FILES 中的 FILE_NAME 已更新为目标路径,但控制文件里旧路径残留会导致下次启动异常——所以复制数据文件必须在设只读之后、导出之前完成,且不能靠 rename 操作“事后补救”,必须一步到位。











