RMAN 不支持直接“冷备分区表”,因其备份粒度最小为数据文件,分区表仅是逻辑结构、物理上隶属表空间;可行方案是使用 BACKUP FOR TRANSPORT 打包含该表的表空间,并配合 IMPDP 传输导入。
rman 本身不支持“自动冷备分区表”这个说法——分区表不是独立备份对象,它物理上属于某个(或多个)表空间。真正可行、生产验证过的路径是:把含目标分区表的表空间作为传输单元,用 rman backup for transport 打包,再在目标库还原并 impdp 导入元数据。整个过程无需停业务(只要不用 alter tablespace ... read only),且比传统 expdp/impdp 更快、更一致。
为什么不能直接对分区表做“冷备”?
Oracle 没有 BACKUP PARTITION 或类似语法。分区只是逻辑切分,底层数据块仍存于数据文件中,受表空间级管理约束。试图只备份某个分区会触发 ORA-19625(无法识别数据文件)或 ORA-19602(非归档模式下不支持联机备份非只读表空间)。
- 分区表 DDL(如
ALTER TABLE ... SPLIT PARTITION)会修改段头和数据字典,必须保证备份时的一致性窗口 -
RMAN备份粒度最小是数据文件,不是段或分区 - 所谓“冷备分区”,实际是“冷备其所在表空间”,但 19c 支持不置为只读的传输备份(见下条)
RMAN BACKUP FOR TRANSPORT 是核心命令
这是 Oracle 12c 起引入、19c 完善的机制,能生成可跨库迁移的传输集(含数据文件 + 元数据 dump),且不要求源表空间 READ ONLY。
- 执行前必须运行
DBMS_TTS.TRANSPORT_SET_CHECK,检查分区表是否自包含(比如本地索引、LOB 段、依赖函数都在同一表空间内);否则TRANSPORT_SET_VIOLATIONS视图会报错 - 命令中必须显式指定
FOR TRANSPORT,漏掉就会生成普通备份集,后续RESTORE时提示ORA-19687 - 示例(源库 RMAN 中):
BACKUP FOR TRANSPORT FORMAT '/backup/tts_%U.bkp' DATAPUMP FORMAT '/backup/tts_meta.dmp' TABLESPACE sales_ts, sales_idx_ts;
-
DATAPUMP FORMAT生成的.dmp是元数据(DDL + 对象依赖),必须和备份片一起拷到目标端
目标库还原时三个关键动作
光把备份片拷过去不行,RESTORE 后必须处理路径、状态和导入逻辑。
- 用
SET NEWNAME FOR DATAFILE或DB_FILE_NAME_CONVERT映射数据文件路径,避免还原到源库路径(尤其 Windows ↔ Linux 跨平台时路径分隔符不同) - 还原后表空间默认是
READ WRITE,但需手动ALTER TABLESPACE ... READ WRITE才能被访问(RMAN 不自动改状态) -
IMPDP必须用TRANSPORT_DATAFILES参数指向还原后的数据文件路径,例如:impdp system/password \ DIRECTORY=dp_dir \ DUMPFILE=tts_meta.dmp \ TRANSPORT_DATAFILES='/u01/oradata/orcl/sales_ts01.dbf','/u01/oradata/orcl/sales_idx_ts01.dbf'
- 若目标库无对应用户,加
REMAP_SCHEMA;若字符集不一致(如源 AL32UTF8 → 目标 ZHS16GBK),需提前确认NLS_CHARACTERSET兼容性,否则中文字段乱码
容易被忽略的跨平台细节
哪怕都是 Oracle 19c,Linux 和 Windows 的字节序(endian format)不同,直接还原会报 ORA-19721(无法识别数据块)。必须先查清两端平台:
SELECT platform_name, endian_format FROM v$transportable_platform
WHERE platform_name IN ('Linux x86 64-bit', 'Microsoft Windows x86 64-bit');- 若
endian_format不同,必须在源库用CONVERT DATABASE或CONVERT TABLESPACE命令转字节序,再执行BACKUP FOR TRANSPORT -
COMPATIBLE参数必须 ≥ 10.2.0,且建议源/目标库版本补丁级别一致(如 19.20.0 → 19.20.0),否则IMPDP可能报ORA-39126(内部包错误) - 目标库
DB_BLOCK_SIZE必须与源库完全相同,否则RESTORE阶段直接失败
实际操作中最常卡住的点不在备份,而在目标库的路径映射和 IMPDP 的 TRANSPORT_DATAFILES 路径写错——多一个斜杠、少一个文件、路径没加引号,都会让导入静默失败。


















