rac跨版本迁移必须停机,因版本不一致会导致ora-1092、ora-600等严重错误;减少停机的关键是将备份、增量同步、验证等耗时操作前置,仅保留切断写入、应用最后归档、启动目标库三个步骤在停机窗口内完成。

RAC 跨版本迁移本身不支持在线升级,必须停机。但“减少停机”不是靠跳过停机,而是把大量耗时操作前置——把能提前做的备份、转换、验证全挪到业务运行期完成,只留最短的切换窗口。
为什么不能直接在线升级 RAC 版本
RAC 实例共享控制文件、数据字典和集群注册信息,版本不一致会导致 ORA-1092、ORA-600 或节点无法加入集群。Oracle 官方明确要求:跨版本(如 12.2 → 19c)必须先关闭所有实例,再执行 dbua 或手动升级。试图强制启动混合版本节点会触发 CRS 层仲裁失败,整个集群不可用。
RMAN + duplicate 预建目标库是最稳路径
核心思路是:源库照常运行,用 RMAN 在后台持续拉取增量备份,在新环境搭建已同步的目标 RAC 库。最后仅需一次切换。
- 用
RMAN备份源库时,启用BACKUP INCREMENTAL FROM SCN,每天或每几小时打一个增量,避免全量重跑 - 目标端用
DUPLICATE TARGET DATABASE FOR STANDBY初始化,再通过RECOVER DATABASE应用增量,保持与源库 SCN 差距在分钟级 - 升级前最后一次增量应用后,停源库写入(
ALTER SYSTEM QUIESCE RESTRICTED),再执行SWITCHOVER或FAILOVER - 注意:目标
RAC的 OCR/Voting Disk 必须用新版本 Grid Infrastructure 初始化,不能复用旧 OCR
XTTS 适合跨平台+跨版本,但对字节序和字符集敏感
如果目标是 Linux x86_64 → AIX 或 Windows → Linux 这类跨平台场景,XTTS(Cross Platform Transportable Tablespaces)比 RMAN duplicate 更可控,因为它绕过实例层,只搬数据文件+元数据。
- 源库表空间必须设为
READ ONLY才能导出,所以需协调业务窗口提前冻结对应模块 - 检查
V$TRANSPORTABLE_PLATFORM确认平台兼容性,特别注意ENDIAN_FORMAT—— x86 和 SPARC 字节序相反,必须用RMAN CONVERT转换 -
expdp导出元数据时加TRANSPORT_FULL_CHECK=NO可跳过跨版本约束校验,但要求目标库版本 ≥ 源库(如 11g → 19c 允许,反之不行) - 导入后务必运行
utlrp.sql重新编译失效对象,DBMS_STATS重建统计信息,否则执行计划可能劣化
停机窗口内必须完成的三件事
真正“停机”的时间,只够做三件事:切断写入、拷贝最后归档、启目标库。其余全是预置动作。
- 切断写入前,用
SELECT MAX(SEQUENCE#) FROM V$ARCHIVED_LOG记下最后归档号,确保目标端RECOVER DATABASE USING BACKUP CONTROLFILE能精准应用到该点 - 目标
RAC的监听配置(listener.ora、tnsnames.ora)和应用连接串必须提前测试通,避免切完发现连不上 - 切完第一件事不是查数据,而是立刻在目标库跑
SELECT NAME, OPEN_MODE FROM V$DATABASE和SELECT INSTANCE_NAME, STATUS FROM GV$INSTANCE,确认所有实例都OPEN且状态为ONLINE
COMPATIBLE 参数。这些没法自动化,只能靠 checklist 逐项核对。











