oracle 19c data guard 不支持跨平台物理 standby,因块格式、字节序、二进制等平台差异导致重做应用失败;跨平台容灾需用逻辑 standby 或 tts+data pump 组合方案。
oracle 19c 的 data guard 本身不支持跨平台(比如从 linux x86_64 切换到 aix 或 windows)的物理备用库,因为物理 standby 依赖字节级一致的块格式和平台特定的二进制兼容性。真要跨平台容灾,必须放弃物理复制路径,转而使用逻辑 standby 或可传输表空间(tts)+ data pump 的组合方案——但后者不是实时容灾,而是准实时/计划性切换场景下的数据迁移补充手段。
为什么不能直接用物理 Data Guard 跨平台
物理 standby 通过传输并应用主库的重做日志(redo),在备库上逐块恢复数据文件。这要求:DB_BLOCK_SIZE、字节序(endianness)、数据块结构、甚至 Oracle 内部对象编号都完全一致。Linux 和 Windows 的 Oracle 二进制、共享内存布局、文件系统语义也不同,导致 ALTER DATABASE RECOVER MANAGED STANDBY DATABASE 直接报错,典型如:
ORA-01172: recovery of thread 1 stuck at block 12345 of file 3 ORA-01151: use media recovery to recover block, or end backup
这类错误本质是平台不兼容引发的块解析失败,不是配置问题。
可传输表空间(TTS)在跨平台容灾中的真实定位
TTS 不是 Data Guard 的替代品,而是用于“冷切”或“灰度切换”时的数据一次性搬移。它适合主备异构、且能接受小时级 RPO 的场景(比如从旧 AIX 系统迁移到新 Linux 集群)。关键前提是:
- 源库和目标库的
COMPATIBLE参数兼容(如都 ≥ 19.0.0) - 使用
DBMS_TTS.TRANSPORT_SET_CHECK确认表空间自包含(无跨表空间外键、物化视图日志等) - 目标平台需提前运行
CONVERT DATAFILE(用RMAN CONVERT处理 endianness 转换) - 必须停写源库,或至少确保 TTS 导出期间无 DDL 变更(否则
transport_set_violations视图会报错)
示例命令片段:
-- 在源库(AIX)执行
EXEC DBMS_TTS.TRANSPORT_SET_CHECK('USERS', TRUE);
SELECT * FROM transport_set_violations;
<p>-- RMAN 转换数据文件(目标为 Linux)
RMAN> CONVERT TABLESPACE users
TO PLATFORM 'Linux x86 64-bit'
FORMAT '/tmp/%U';</p>
逻辑 standby 是唯一接近“跨平台实时同步”的选项
逻辑 standby 通过 SQL Apply 将重做日志解码为 DML/DDL 语句,在目标库上重放。只要源库和目标库的字符集兼容、数据类型映射可行(如 NUMBER、VARCHAR2 通用),就能跨平台。但它有硬限制:
- 不支持某些对象:索引组织表(IOT)、BFILE、临时表、高级队列(AQ)表
- 主库必须启用
FORCE LOGGING和补充日志(ADD SUPPLEMENTAL LOG DATA) - 逻辑 standby 无法直接升级为主库(
SWITCHOVER不支持),只能FAILOVER,且需手动重建原主库 - 性能开销显著高于物理 standby,尤其高并发 DML 场景下容易 lag
创建逻辑 standby 的核心步骤中,DBMS_LOGSTDBY.INSTANTIATE_TABLE 和 DBMS_LOGSTDBY.SKIP 常被忽略,导致同步中断。
真正可行的跨平台容灾组合策略
没有银弹。生产中建议采用分层策略:
- 同平台(如 Linux→Linux):用物理 ADG +
Maximum Availability模式,保障秒级 RPO/RTO - 跨平台(如 AIX→Linux):主库开启归档 + 定期
EXPDP全库导出 +IMPDP迁移至备用平台,配合应用层双写或消息队列补偿(如 Kafka 同步关键业务表) - 极端情况(仅容灾兜底):用 TTS + 归档日志追平(
RECOVER DATABASE USING BACKUP CONTROLFILE),但整个过程需演练至少 2 次,确认字符集转换、时区处理、序列值一致性等细节
最容易被忽略的是时间点一致性——TTS 导出的 SCN 必须与归档日志起点对齐,否则 RECOVER 会跳过部分事务。务必用 V$DATABASE.CURRENT_SCN 和 ARCHIVE LOG LIST 交叉验证。











