Oracle RAC集群的DB home升级是DBA工作中风险等级较高的操作之一。与单机环境不同,RAC环境涉及多个节点、Grid Infrastructure(GI)与Database Home的版本匹配、集群服务依赖关系等多个层面,任何一个环节疏忽都可能导致节点间版本不一致、实例无法正常启动,甚至影响整个集群的可用性。本文结合生产实践,系统地讲解RAC集群DB home升级的完整流程、两种典型升级策略的选择,以及常见问题的处理方法。

一、升级前的准备与兼容性确认
升级前最重要的一步是确认目标版本与现有环境的兼容性。首先要明确一点:DB home的目标版本不能高于GI(Grid Infrastructure)的版本。例如GI是19.3而DB要升到19.22补丁版本没有问题,但如果GI还是18c而DB想直接升到19c,必须先把GI升级到19c及以上版本,否则在预检查阶段就会直接失败。可以用以下命令确认GI版本:
# 确认集群软件版本 $GRID_HOME/OPatch/opatch lsinventory # 查看集群状态,确认所有节点在线 crsctl check cluster -all # 查看数据库与GI的版本关系 srvctl config database -d orcl
其次要梳理清楚当前数据库的版本和补丁情况。建议先用DBMS_DST检查时区文件版本,因为目标home的时区文件版本必须不低于数据库当前使用的版本,否则升级数据字典时会报ORA-04030之后的阶段失败。同时确认审计文件目录、归档路径是否有足够空间,一般建议/u01文件系统预留至少50GB以上,闪回恢复区预留足够的空间来存放升级过程中产生的归档。
最后是备份,这一点怎么强调都不过分。升级前必须对数据库做全备,并确认备份可恢复。如果使用的是Data Guard环境,还可以先升级备库验证流程。此外,建议在测试环境完整演练一遍升级过程,记录每一步的耗时和报错,这对生产窗口的时间评估非常关键。
二、Out-of-Place安装新版本DB Home
Oracle推荐使用out-of-place方式升级,即在服务器上安装一个全新的DB home目录,而不是在原目录上打补丁。这种方式的最大好处是可以保留旧版本home,一旦升级失败可以快速回退。安装前先创建新的home目录,例如从12.2升级到19c,规划目录为/u01/app/oracle/product/19.0.0/dbhome_1:
# 各节点创建新DB home目录
mkdir -p /u01/app/oracle/product/19.0.0/dbhome_1
chown oracle:oinstall /u01/app/oracle/product/19.0.0/dbhome_1
# 解压安装介质并安装,注意选择只安装软件不建库
cd /u01/app/oracle/product/19.0.0/dbhome_1
unzip -q /tmp/LINUX.X64_193000_db_home.zip
./runInstaller -ignorePrereq -waitforcompletion -silent \
-responseFile /u01/app/oracle/product/19.0.0/dbhome_1/install/response/db_install.rsp \
oracle.install.option=INSTALL_DB_SWONLY \
ORACLE_BASE=/u01/app/oracle \
oracle.install.db.InstallEdition=EE \
oracle.install.db.OSDBA=dba \
oracle.install.db.OSOPER=oper \
oracle.install.db.CLUSTER_NODES={rac1,rac2} \
oracle.install.db.isClusterInstall=true \
INVENTORY_LOCATION=/u01/app/oraInventory \
oracle.install.db.config.starterdb.type=GENERAL_PURPOSE
安装完成后会提示以root用户在所有节点执行root.sh脚本,这一步会为新home注册集群资源信息,必须按节点顺序依次执行并确认成功。之后不要忘了为新home打上最新的Release Update补丁,很多人习惯先升级再打补丁,其实更稳妥的做法是在新home上先打完RU补丁再切换数据库,这样切换后的版本一步到位,避免数据库在旧补丁版本上运行过久。
补丁安装建议使用opatchauto方式,它会自动处理GI与DB home之间的补丁依赖。注意检查opatch本身版本是否满足补丁要求,必要时先升级opatch工具。打完补丁后用opatch lsinventory确认所有节点的新home补丁号完全一致,这一点在多节点环境下尤其重要,版本不一致是后续节点启动失败的常见根源。
三、滚动升级与全停升级的选择
RAC集群的DB升级有两种策略。全停升级是所有节点停止服务,数据库以Upgrade模式启动一次完成数据字典升级,窗口期内业务完全中断;滚动升级则是利用一个节点一个节点交替升级的方式,期间至少有一个节点持续提供服务,业务几乎不中断。对于两节点集群,滚动升级的实际意义有限,因为升级节点重启时所有负载都会压到另一个节点上;对于三节点及以上的集群,滚动升级的业务价值明显更高。
如果选择全停方式,典型流程是:所有节点停止实例后,用新home的srvctl修改数据库的Oracle Home指向,然后以Upgrade模式启动数据库执行升级,也可以使用catctl.pl并行升级数据字典来缩短时间:
# 修改数据库home指向到新目录 srvctl modify database -d orcl -oraclehome /u01/app/oracle/product/19.0.0/dbhome_1 # 单实例以升级模式启动后执行并行升级 cd $ORACLE_HOME/rdbms/admin $ORACLE_HOME/perl/bin/perl catctl.pl -n 4 catupgrd.sql # 升级完成后检查组件状态与失效对象 @?/rdbms/admin/utlrp.sql SELECT comp_name, version, status FROM dba_registry ORDER BY 1;
如果选择滚动方式(19c环境常用DBRU配合data guard或使用rac的滚动打补丁机制),核心思路是逐节点停止实例、切换home、启动验证,全部节点完成后统一处理数据字典。需要特别注意的是,混合版本状态下集群可以短暂运行,但应尽快完成所有节点的切换,避免长期处于不一致状态。无论哪种方式,升级完成后都建议执行dbupgdiag.sql收集升级诊断信息,确认无严重错误后再对业务开放。
四、常见问题与回退方案
升级过程中最常见的问题有三类。第一类是预检查失败,例如runcluvfy报PRVG系列的磁盘组、网络时间同步或SSH等效性问题,这类问题必须在升级前解决,不要用-ignorePrereq强行跳过。第二类是OPatch冲突,新补丁与home中已有补丁冲突时安装会中断,解决方法是先用opatch lspatches核对冲突号并回退冲突补丁。第三类是数据字典升级中断,比如升级中途实例异常终止,此时不要慌张,重新以Upgrade模式启动数据库并再次执行catupgrd.sql即可,脚本本身设计为可重入的。
关于回退方案,out-of-place方式的优势在这里体现得最充分:只要旧home目录没有删除,将数据库的Oracle Home改回旧路径、启动实例即可回到旧版本。但要注意,如果数据字典已经升级完成,降级就不能简单地切回home,而需要使用降级流程(在Upgrade模式前用FLASHBACK或降级脚本),因此强烈建议在升级数据字典前开启闪回或确保有Guaranteed Restore Point:
-- 升级前创建保证还原点 CREATE RESTORE POINT before_upgrade GUARANTEE FLASHBACK DATABASE; -- 如需回退(数据字典已升级的情况下) SHUTDOWN IMMEDIATE; STARTUP MOUNT; FLASHBACK DATABASE TO RESTORE POINT before_upgrade; ALTER DATABASE OPEN RESETLOGS;
最后提醒一点,升级完成后记得更新所有节点的oracle用户环境变量、/etc/oratab中的home路径,以及监控脚本、备份脚本中硬编码的旧home路径,否则容易出现备份任务仍然指向旧home的隐蔽问题。整套流程走完后,用crsctl stat res -t确认所有资源 ONLINE,升级工作才算真正收尾。
Oracle RACDB home升级数据库集群修改时间:2026-09-02 15:08:53