Oracle RAC滚动升级补丁的核心前提与必要条件
实现Oracle RAC零停机滚动升级,其核心并非简单地执行补丁命令,而是必须满足一系列严苛的兼容性与环境隔离条件。这里有三个关键判断点需要牢牢把握:首先,opatch_version 必须不低于 12.2.0.1.0,因为旧版本的 opatch 工具根本无法识别滚动升级的语义;其次,grid_home 和 oracle_home 必须是独立的目录,混用部署极易导致节点间的补丁应用冲突;最后,也是至关重要的一点,补丁包本身必须被标注为 rolling 类型——这可以通过执行 opatch query -all 命令,查看输出中是否包含 rolling patch: true 来确认。
- 通常,支持滚动的补丁包名称会带有
RUL(Release Update Limited)或RU(Release Update)后缀。需要注意的是,自 12.1 版本起,传统的PSU(Patch Set Update)已不再支持滚动升级。 - 如果
opatch lsinventory -detail显示当前补丁状态仅为Applied而未标记Rolling,那么强行执行滚动操作很可能会触发OPATCH-41933错误。 - 在启动升级流程前,务必运行
cluvfy stage -pre crsinst -upgrade进行集群验证。这个工具会深入检查 OCR、ASM 兼容性等实际可能存在的阻塞点,其价值远超过单纯依赖文档列表进行核对。
如何安全执行Oracle RAC滚动补丁升级?
安全地执行滚动补丁,其本质是一个“分阶段验证 + 人工确认”的闭环过程,而非机械地按顺序输入命令。整个过程的核心动作,是逐个节点停止并重启集群资源栈,而非直接操作数据库实例本身。
- 在第一个节点上,运行命令:
opatch auto。此命令会自动调用-oh -rolling crsctl stop crs -f停止本节点的集群服务,应用补丁后再将其重启。在此期间,集群中的其他节点仍保持在线并提供完整服务。 - 在对第二个节点进行操作前,必须进行关键确认:执行
crsctl check cluster -all确保所有节点检查通过,同时通过crsctl stat res -t | grep ONLINE观察,确认第一个节点的所有资源状态已恢复为ONLINE。 - 数据库实例通常无需手动干预。RAC 环境中的
ora.资源由集群管理软件(CRS)自动管理。补丁完成后,实例会在新的.db ORACLE_HOME路径下被自动拉起。如果发现实例仍运行在旧的 HOME 目录下,往往意味着前期遗漏了执行srvctl modify database -d命令来修改数据库的家目录。-o
哪些情况会导致Oracle RAC滚动升级失败或业务中断?
滚动升级的失败,很多时候并非源于命令行的直接报错,而是由一些隐性的资源不可用问题所导致,最终引发业务感知的中断。
- 当 ASM 实例所依赖的
grid home补丁尚未在所有节点完成时,如果业务恰好在进行大文件迁移,那么ALTER DISKGROUP ... REBALANCE这类操作可能会卡住,进而引发 IO 阻塞。其外在表现往往是应用连接超时,而非直接的数据库宕机。 - 在使用 ACFS 文件系统的环境中,如果
acfsload驱动未能同步更新,可能导致节点重启后 ACFS 卷无法自动挂载。此时,通过df -h命令可能看不到挂载点,但crsctl stat res -t却可能仍然显示资源状态为ONLINE,造成状态误判。 - 如果集群启用了
Flex ASM架构,在补丁过程中,若某个节点的 ASM 实例异常终止,其他节点的 ASM 实例并不会自动接管其客户端连接。此时必须手动执行srvctl relocate asm -node进行重定位,否则,该故障节点上的数据库实例将持续报告ORA-15032或ORA-15063错误。
最后,滚动升级中最容易被忽略的一点,是“时间窗口之外的副作用”。例如,补丁应用后首次进行的全库统计信息收集,可能会因为新的优化器路径选择而引发 SQL 执行计划的突变。这本身并非升级过程的直接问题,但却常常被归咎于滚动操作本身,值得额外关注。
