Oracle RAC滚动升级补丁的核心前提是满足严格的版本兼容性与组件隔离条件:OPATCH_VERSION ≥ 12.2.0.1.0、GRID_HOME与ORACLE_HOME独立、补丁标注为ROLLING类型。
Oracle RAC滚动升级补丁的核心前提是什么?
滚动升级能实现零停机的前提,不是“打了补丁就自动切换”,而是必须满足严格的版本兼容性与组件隔离条件。关键判断点有三个:opatch_version 必须 ≥ 12.2.0.1.0(旧版 opatch 不识别 rac 滚动语义),grid_home 和 oracle_home 必须独立(混用会导致节点间 patch 冲突),且补丁本身需标注为 rolling 类型——可通过 opatch query -all 查看输出中是否含 rolling patch: true。
- 补丁包名通常带
RUL(Release Update Limited)或RU(Release Update)后缀,PSU(Patch Set Update)从 12.1 起已不支持滚动 - 若
opatch lsinventory -detail显示当前补丁状态为Applied但未标记Rolling,强行滚动会触发OPATCH-41933错误 - 升级前必须运行
cluvfy stage -pre crsinst -upgrade,它检查 OCR、ASM 兼容性等真实阻塞点,而非仅依赖文档列表
如何真正执行一次安全的滚动补丁应用?
执行不是顺序敲命令,而是分阶段验证+人工确认的闭环。核心动作是逐节点停启集群资源,而非数据库实例本身。
- 在第一个节点上运行:
opatch auto <patch_path> -oh <GRID_HOME> -rolling,该命令会自动调用crsctl stop crs -f停止本地集群栈,打完补丁再重启;此时其他节点仍提供完整服务 - 第二个节点操作前,必须确认:
crsctl check cluster -all全部通过,且crsctl stat res -t | grep ONLINE中本节点资源状态已恢复为ONLINE - 数据库实例无需手动重启:RAC 的
ora.<db_name>.db</db_name>资源由 CRS 自动管理,补丁完成后,实例会在新ORACLE_HOME下被拉起;若发现实例仍运行在旧 HOME,说明srvctl modify database -d <db> -o <new_home>未提前执行
哪些情况会让滚动升级实际变成停机?
滚动失败往往不是命令报错,而是隐性资源不可用导致业务感知中断。
- ASM 实例依赖的
grid home补丁未完成时,若业务正进行大文件迁移,ALTER DISKGROUP ... REBALANCE可能卡住并引发 IO 阻塞,表象是应用超时而非数据库宕机 - 使用 ACFS 的环境,
acfsload驱动未同步更新会导致节点重启后 ACFS 卷无法挂载,df -h看不到挂载点,但crsctl stat res -t显示资源状态仍是ONLINE - 如果启用了
Flex ASM,补丁过程中某节点 ASM 实例异常终止,其他节点不会自动接管其客户端连接,需手工执行srvctl relocate asm -node <failed_node>,否则该节点上的数据库实例持续报ORA-15032 / ORA-15063
滚动升级最易被忽略的点是“时间窗口外的副作用”:补丁后首次全库统计信息收集可能因新优化器路径引发执行计划突变,这不是升级过程的问题,但常被归咎于滚动操作本身。


















