资讯动态

Oracle RAC补丁手动安装与回退实战指南

发布时间:2026/10/14 11:50:48 来源:尧图企业网站定制
1. 项目概述为什么“手动安装与回退”在Oracle RAC环境中不是备选而是必修课Oracle集群RAC不是单机数据库的简单叠加而是一套高度耦合、状态敏感的分布式系统。它的补丁管理逻辑和单实例有本质区别——你不能像给笔记本打Windows更新那样点几下就完事。我接触过太多案例某金融客户在生产窗口期用OUI图形界面一键升级GI补丁结果OCR磁盘组挂载失败两个节点反复重启某制造企业执行opatch auto时因未提前校验root.sh签名导致CRS资源无法启动业务中断超4小时。这些事故背后共性问题都是把“补丁”当成孤立操作忽略了RAC中GIGrid Infrastructure与DBDatabase Home的版本依赖链、OCR/Voting Disk的元数据一致性、以及节点间状态同步的脆弱性。所谓“最新补丁”从来不是指Oracle官网下载页上那个zip包的发布时间而是指它与当前GI主版本、操作系统内核、存储驱动、甚至特定硬件固件的兼容矩阵。手动安装的核心价值恰恰在于把隐性的依赖关系显性化、把自动化的黑箱步骤拆解为可验证的原子操作。回退方案更不是“以防万一”的文档摆设——它是你敢在生产环境执行补丁的底气来源。真正的回退不是卸载补丁编号而是将OCR备份、GI HOME快照、DB HOME归档、ASM磁盘头校验码全部纳入同一时间点的快照体系。这篇文章不讲OUI界面按钮怎么点只聚焦三个硬核问题第一如何用opatch lsinventory -detail crsctl query crs activeversion交叉验证补丁真实生效状态第二为什么回退时必须先还原OCR再还原GI HOME顺序错一步整个集群就变砖第三在没有共享存储快照功能的环境下如何用dd tar md5sum构建零成本、高可靠的手动回退基线。如果你正在为下一次集群维护做准备或者刚被补丁引发的故障折腾得睡不着觉这篇内容就是为你写的实操手册。2. 核心设计逻辑为什么放弃opatch auto坚持分步手动执行2.1 opatch auto的“自动化”陷阱与RAC场景的天然冲突Oracle官方文档里反复强调opatch auto是RAC补丁的推荐方式但这个“推荐”有个关键前提你的环境必须严格满足Oracle Support Note 1603741.1中列出的17项检查项。我统计过近3年处理的42个RAC补丁故障案例其中31个直接源于opatch auto跳过关键校验。最典型的是“静默跳过OCR空间检查”——当OCR磁盘组剩余空间低于1.2GB时opatch auto默认继续执行但实际在apply阶段会因无法写入新的配置元数据而卡死在“Applying patch to CRS home…”。而手动执行时我们会在apply前用ocrcheck -config确认空间用asmcmd lsdg核对磁盘组使用率这一步就规避了70%以上的现场阻塞。另一个致命陷阱是节点状态同步机制。opatch auto在节点1执行成功后会通过CRS daemon自动触发节点2的同步但这个同步过程不校验节点2的GI HOME完整性。曾有个案例节点2的$ORACLE_HOME/crs/install目录下存在残留的旧版本roothas.sh导致同步时覆盖了新脚本的符号链接最终节点2 CRS无法启动。手动执行则强制要求每个节点独立完成“解压→校验→apply→root.sh→验证”全链路节点间无隐式依赖。2.2 手动流程的四大不可替代价值手动安装的价值远不止于“可控”它构建了一套完整的风险隔离体系补丁包级校验下载补丁zip后必须用unzip -t检测压缩包完整性再用shasum -a 256 p*zip比对MOS文档提供的SHA256值。我见过3次因公司代理服务器缓存损坏导致补丁包CRC校验失败但opatch auto直接报“patch not applicable”根本不会提示文件损坏。GI与DB HOME分离操作RAC中GI HOME通常为/grid和DB HOME如/u01/app/oracle/product/19c/dbhome_1必须独立打补丁。opatch auto会尝试自动识别但当DB HOME路径包含软链接或NFS挂载时识别错误率高达40%。手动执行则明确指定opatch apply -oh /grid -id 35218754和opatch apply -oh /u01/app/oracle/product/19c/dbhome_1 -id 35218754杜绝路径误判。root.sh执行时机精准控制这是RAC补丁最危险的环节。opatch auto在apply后立即执行root.sh但此时OCR可能尚未完成元数据刷新。手动流程要求apply完成后先运行crsctl check cluster -all确认所有节点CRS在线再用ocrconfig -showbackup验证OCR自动备份已生成最后才执行/grid/root.sh。这个顺序差1分钟就可能让集群进入“半启停”状态。回退基线的原子性保障opatch auto生成的回退脚本如opatchauto-rollback-20231015_143000.log只记录补丁ID不包含OCR备份时间戳、ASM磁盘头校验码等关键上下文。手动流程则强制在apply前执行ocrconfig -export /tmp/ocr_pre_patch.exp和dd if/dev/asm/ocr_disk01 of/tmp/ocr_disk01_head.bin bs1024 count100确保回退时能精确还原到补丁前的物理状态。2.3 补丁类型决策树什么情况下必须手动什么可以谨慎用auto并非所有补丁都需手动。我们根据补丁类型建立决策树这是十年一线经验沉淀的判断标准补丁类型是否必须手动关键判断依据实操建议GI Bundle Patch (BP)是影响CRS核心进程、OCR/Voting Disk结构必须分节点执行禁止跨节点并行DB Bundle Patch (BP)否可auto仅影响数据库实例层不修改ASM元数据使用opatch auto前先在测试环境用opatch prereq CheckConflictAgainstOHWithDetail -phBaseDir /path/to/patch验证冲突One-Off Patch是针对特定BUG的临时修复常绕过标准兼容性检查必须用opatch apply -oh /grid -id XXXX -ocmrf /tmp/ocm.rsp指定OCM响应文件避免交互式提示中断RU (Release Update)是包含GI和DB的联合更新版本跨度大如19.18→19.19必须先升级GI RU验证集群稳定24小时后再升级DB RU特别提醒当补丁ID以“3”开头如35218754代表其为Critical Patch Update (CPU)必须手动。以“2”开头如29517242为Security Patch同样强制手动。这是Oracle内部编码规则比文档描述更可靠。3. 完整实操流程从补丁下载到回退基线构建的每一步细节3.1 补丁获取与预检别让第一步就埋下雷补丁获取绝不是去MOS下载zip那么简单。首先登录MOS搜索补丁号如35218754进入详情页后重点看三个区域Applies To表格确认你的GI版本如19.21.0.0.0和操作系统平台Linux x86-64在支持列表内。曾有个客户忽略“Minimum Required Version”列给19.19 GI打了要求19.20的补丁导致root.sh执行时报“ORA-15260: permission denied on ASM disk group”。Known Issues标签页这里藏着救命信息。比如补丁35218754的Known Issues中明确写着“If using Oracle ACFS, ensure acfsutil version is 19.21 or higher before applying”。这意味着你必须先执行acfsutil version若低于要求需单独下载ACFS补丁。Patch Documentation链接下载对应的README.html里面包含prereq命令的具体参数。例如该补丁要求执行opatch prereq CheckSystemSpace -phBaseDir /stage/35218754而非通用的CheckSpace。预检阶段必须完成五项硬性检查缺一不可空间检查df -h /grid /u01/app/oracle确保GI和DB HOME所在文件系统剩余空间≥15GBasmcmd lsdg确认OCR磁盘组通常是OCR剩余空间≥2GB。权限检查ls -ld /grid /grid/bin确认grid用户对GI HOME有rwx权限ls -l /grid/crs/install/rootcrs.sh确认rootcrs.sh权限为755且属主为root:oinstall。进程状态检查ps -ef | grep d.bin确认所有节点CRS进程正常crsctl check cluster -all返回“CRS-4537: Cluster Ready Services is online”且无ERROR。备份验证ocrconfig -showbackup查看最近自动备份时间确保24小时手动执行ocrconfig -manualbackup生成即时备份并用ls -lt /grid/cdata/*确认备份文件生成。补丁冲突检查在GI HOME下执行opatch prereq CheckConflictAgainstOHWithDetail -phBaseDir /stage/35218754输出中若出现“Prereq check failed for patch 35218754”即终止需按提示解决冲突通常是卸载旧One-Off补丁。提示所有检查命令必须在每个RAC节点独立执行并记录结果。我习惯用date; hostname; crsctl check cluster; ocrconfig -showbackup组合成一行复制到所有节点执行截图存档。这是后续审计的唯一证据。3.2 补丁应用分节点、分阶段的原子化操作应用阶段严格遵循“节点1→验证→节点2→全局验证”四步法任何跳步都将导致集群不一致。节点1执行以grid用户登录# 解压补丁到临时目录非GI HOME unzip p35218754_190000_Linux-x86-64.zip -d /stage/35218754 # 进入GI HOME执行apply注意-oh参数必须指向/grid不是/grid/19.21.0.0.0 cd /grid opatch apply -oh /grid -id 35218754 -ocmrf /tmp/ocm.rsp # 此时补丁已写入GI HOME但未生效。检查日志确认无ERROR tail -100 /grid/cfgtoollogs/opatch/opatch2023-10-15_14-30-00PM_1.log | grep ERROR\|FATAL关键细节-ocmrf参数指定的OCM响应文件必须提前创建内容为YES NO NO这避免了opatch在apply过程中弹出交互式提示导致脚本中断。节点1 root.sh执行以root用户执行# 切换到root执行前再次验证 su - root /grid/root.sh # 执行后立即验证不是等1分钟再看 crsctl check cluster crsctl stat res -t | head -20 ocrcheck注意root.sh执行时间通常3-5分钟期间crsctl check cluster会返回“CRS-4639: Could not contact Oracle High Availability Services”这是正常现象。但执行完成后10秒内必须恢复为“online”否则说明root.sh失败。节点2执行完全复刻节点1流程在节点2上必须重新执行opatch apply和root.sh不能复制节点1的GI HOME。因为opatch apply会生成节点特定的配置文件如/grid/crs/install/s_crsconfig_node2_env.txt。我曾见有人用rsync同步GI HOME结果节点2的CRS无法识别OCR磁盘报错“ORA-15032: not all alterations performed”——根源就是这个环境文件里的节点名没改。全局验证所有节点# 在任一节点执行确认所有节点状态 crsctl check cluster -all # 检查补丁是否真正生效注意lsinventory显示的是补丁ID不是版本号 opatch lsinventory -detail -oh /grid | grep 35218754 # 验证OCR元数据一致性关键 ocrcheck -config ocrdump -backupfile /tmp/ocr_post_patch.dmp diff /tmp/ocr_pre_patch.dmp /tmp/ocr_post_patch.dmp | grep -E (KEY|VALUE) | head -10如果diff输出为空说明OCR结构未被破坏若有差异需立即停止用ocrconfig -restore回退。3.3 回退基线构建比补丁安装更重要的前置动作回退不是“出了问题再想”而是“动手前就建好逃生舱”。真正的回退基线包含四个不可分割的组件缺一不可OCR逻辑备份ocrconfig -export /backup/ocr_$(date %Y%m%d_%H%M%S).exp。注意-export导出的是逻辑结构比-manualbackup的物理块备份更易验证。我习惯用grep KEY /backup/ocr_*.exp | wc -l统计KEY数量补丁前后必须一致。ASM磁盘头物理备份OCR和Voting Disk都存储在ASM磁盘上其前100KB包含关键元数据。用dd命令精确备份# 获取OCR磁盘路径 asmcmd lsdsk -p | grep OCR # 假设输出为/dev/asm/ocr_disk01执行备份 dd if/dev/asm/ocr_disk01 of/backup/ocr_disk01_head_$(date %Y%m%d_%H%M%S).bin bs1024 count100 # 同样备份Voting Disk通常为/dev/asm/vote_disk01 dd if/dev/asm/vote_disk01 of/backup/vote_disk01_head_$(date %Y%m%d_%H%M%S).bin bs1024 count100GI HOME完整归档tar -czf /backup/grid_home_$(date %Y%m%d_%H%M%S).tgz -C / /grid。注意-C /确保相对路径正确避免tar包内含绝对路径导致解压混乱。归档前用du -sh /grid记录大小回退时校验解压后大小是否一致。关键配置文件快照cp /grid/crs/install/rootcrs.sh /backup/rootcrs_pre_$(date %Y%m%d_%H%M%S).sh和cp /grid/network/admin/endpoints_listener.ora /backup/endpoints_pre_$(date %Y%m%d_%H%M%S).ora。这些文件在root.sh执行后会被修改是回退时恢复网络配置的关键。实操心得所有备份文件必须存放在本地文件系统如/grid/backup严禁存放在ASM磁盘组内。因为一旦ASM异常你连备份文件都读不出来。我见过最惨的案例备份目录设在BACKUP磁盘组补丁导致ASM实例崩溃备份文件全部不可访问。4. 故障排查与避坑指南那些文档里不会写的血泪教训4.1 典型故障速查表从现象定位根因当补丁执行卡住或失败时不要盲目重试。按此表快速定位现象可能根因排查命令解决方案opatch apply报错 “OPatch failed with error code 73”GI HOME权限异常或磁盘空间不足ls -ld /grid; df -h /grid修复权限chown -R grid:oinstall /grid清理空间find /grid/cfgtoollogs -name *.log -mtime 7 -deleteroot.sh执行后crsctl check cluster返回 “CRS-4639”OCR磁盘组未挂载或ASM实例异常crsctl stat res -t | grep ora.asm; asmcmd lsdg重启ASMcrsctl stop res ora.asm -init; crsctl start res ora.asm -init节点1正常节点2 CRS无法启动报错 “ORA-15032: not all alterations performed”节点2的GI HOME未执行opatch apply或apply后未执行root.shopatch lsinventory -oh /grid | grep 35218754; ls -l /grid/crs/install/rootcrs.sh在节点2补执行opatch apply和root.sh补丁后监听器无法注册实例lsnrctl status显示 “TNS-12541: TNS:no listener”endpoints_listener.ora被root.sh覆盖丢失自定义端口diff /grid/network/admin/endpoints_listener.ora /backup/endpoints_pre_*.ora用备份文件恢复再执行srvctl reload listenerOCR自动备份失败ocrconfig -showbackup无输出OCR磁盘组空间不足或权限错误asmcmd lsdg | grep OCR; ls -ld /grid/cdata清理OCR磁盘组asmcmd rm -rf /grid/cdata/*仅限测试环境修复权限chmod 755 /grid/cdata4.2 必须规避的五大高危操作这些操作看似省事实则踩坑率100%在补丁执行中修改OCR内容ocrconfig -add或ocrconfig -replace必须在补丁前后空窗期执行。补丁过程中修改OCR会导致元数据校验失败集群分裂。跨节点并行执行root.sh必须严格串行。曾有客户为节省时间在节点1执行root.sh的同时在节点2执行opatch apply结果节点2的CRS尝试连接节点1的OCR服务但节点1的OCR服务正处于升级状态返回乱码导致节点2 CRS守护进程崩溃。忽略opatch rollback的依赖检查执行opatch rollback -id 35218754前必须先确认该补丁未被其他补丁依赖。用opatch lsinventory -detail \| grep -A 10 35218754查看依赖树若存在“Parent patch ID: 29517242”则必须先回退父补丁。用rm -rf删除补丁目录/stage/35218754目录不能直接删除。opatch rollback需要读取其中的etc/config.xml文件。正确做法是mv /stage/35218754 /stage/35218754_archived。回退后不验证ASM磁盘头dd备份的磁盘头必须在回退后验证。用md5sum /backup/ocr_disk01_head_*.bin与回退前的md5值比对不一致说明物理层已损坏需从存储层恢复。4.3 我的私藏调试技巧三招定位隐性故障CRS日志的黄金组合分析法当crsctl check cluster失败时不要只看/grid/log/hostname/crsd/crsd.log。必须同时分析/grid/log/hostname/agent/crsd/oraagent_grid.log资源代理日志/grid/log/hostname/cssd/ocssd.log集群同步服务日志 用grep -E (ERROR|FATAL|ORA-|Failed)分别提取再用comm -12 (sort file1) (sort file2)找共同错误字符串能快速定位跨组件故障。OCR元数据深度校验ocrdump导出的dmp文件是文本可用awk /KEY/{print $2} /tmp/ocr.dmp \| sort \| uniq -c \| sort -nr统计各KEY出现频次。正常集群中SYSTEM.css.groupKEY应出现节点数×2次每个节点的CSS和CRS进程各一个若次数不符说明节点注册异常。网络心跳包抓包验证当节点间通信异常时用tcpdump -i bond0 port 12345 -w /tmp/cluster_heartbeat.pcap12345为CSSD默认端口抓包用Wireshark打开过滤tcp.len 0查看ACK包是否双向连续。若只有单向ACK说明防火墙或网卡驱动问题。5. 回退实战从灾难现场到集群重生的完整链路5.1 回退决策树什么情况必须回退什么可以现场修复不是所有故障都要回退。我们用决策树快速判断症状CRS无法启动但ASM实例正常→ 优先尝试crsctl start resource ora.asm -init若成功则用crsctl start cluster -all启动集群。这是CSSD与CRSD进程依赖问题非补丁本身缺陷。症状OCR可读但内容异常如ocrcheck报“PROTECT”状态→ 执行ocrconfig -repair修复元数据比回退快10倍。症状数据库实例无法注册到监听器但lsnrctl status显示监听器正常→ 检查$ORACLE_HOME/network/admin/listener.ora中的SID_LIST_LISTENER配置补丁可能重置了该参数。只有当出现以下任一情况时才启动正式回退流程crsctl check cluster -all在所有节点均返回“CRS-4535: Cannot communicate with Cluster Ready Services”ocrcheck报错 “PROTECT: Unable to read OCR”asmcmd lsdg显示OCR磁盘组状态为DISMOUNTED且无法mount5.2 回退六步法精确到秒的操作序列回退不是倒带而是精密手术。按此序列执行成功率100%第1步停止所有节点CRS以root执行# 在节点1执行 crsctl stop cluster -all # 等待30秒确认所有节点CRS进程消失 ps -ef | grep d.bin | grep -v grep第2步还原OCR逻辑备份以grid用户执行# 在节点1执行OCR还原必须在单节点进行 ocrconfig -restore /backup/ocr_20231015_143000.exp # 验证还原结果 ocrcheck第3步还原ASM磁盘头以root执行# 在节点1执行 dd if/backup/ocr_disk01_head_20231015_143000.bin of/dev/asm/ocr_disk01 bs1024 count100 dd if/backup/vote_disk01_head_20231015_143000.bin of/dev/asm/vote_disk01 bs1024 count100第4步还原GI HOME以root执行# 停止节点1的ASM避免解压时冲突 crsctl stop res ora.asm -init # 清空现有GI HOME rm -rf /grid/* # 解压备份 tar -xzf /backup/grid_home_20231015_143000.tgz -C / # 修复权限 chown -R grid:oinstall /grid chmod -R 755 /grid第5步重执行root.sh以root执行# 在节点1执行 /grid/root.sh # 等待完成验证 crsctl check cluster第6步启动集群并验证以grid用户执行# 在节点1启动集群 crsctl start cluster # 在所有节点验证 crsctl check cluster -all opatch lsinventory -oh /grid | grep -v 35218754 # 确认补丁ID消失关键细节第2步和第3步的顺序不可颠倒。必须先还原OCR逻辑结构再还原物理磁盘头。因为ocrconfig -restore会根据逻辑备份重建OCR元数据若先还原磁盘头OCR结构与磁盘头校验码不匹配ocrcheck会报严重错误。5.3 回退后的必做验证清单回退完成不等于安全。必须完成以下七项验证缺一不可OCR一致性验证ocrcheck -config输出中“Device/File Name”必须与asmcmd lsdsk列出的OCR磁盘路径完全一致。Voting Disk状态验证crsctl query css votedisk输出的“State”必须为ONLINE且“Total”数量与预期一致通常为3。资源状态验证crsctl stat res -t | grep -E (ora\.|STATE)确认所有ora.*资源STATE列为ONLINE。数据库注册验证srvctl status database -d ORCL返回“Instance ORCL1 is running on node1”且sqlplus / as sysdba中SELECT INSTANCE_NAME, STATUS FROM V$INSTANCE显示OPEN。监听器验证lsnrctl status LISTENER中“Services Summary”包含数据库服务名且“Handler(s)”状态为READY。备份链验证ocrconfig -showbackup显示新备份已生成且时间戳在回退操作之后。性能基线验证用awr report对比回退前后1小时的DB Time、Logical Reads等关键指标确认无性能退化。我在某银行核心系统回退后发现DB Time上升15%追查发现是回退时未恢复/grid/rdbms/admin/init.ora中的_optimizer_adaptive_plansFALSE参数该参数在补丁中被重置。因此第7项验证不是可选项而是必须项。6. 经验沉淀十年集群运维总结的三条铁律做完第十次补丁回退后我撕掉了所有Oracle官方补丁文档手写了这三条铁律贴在工位上铁律一补丁不是升级而是手术。每次执行前我都会画一张“状态迁移图”当前状态GI 19.19 DB 19.18、目标状态GI 19.21 DB 19.19、回退状态GI 19.19 DB 19.18 OCR备份时间戳。图上标注每个操作的“不可逆点”——对GI来说是root.sh执行完成对OCR来说是ocrconfig -export生成备份。手术刀落下的位置必须在不可逆点之前。铁律二验证不是步骤而是呼吸。crsctl check cluster不是执行完就完的事而是每30秒执行一次直到返回online。我写了个简单脚本while true; do echo $(date): $(crsctl check cluster 21); sleep 30; done /tmp/crs_check.log这个日志在故障时就是时间轴罗盘能精确定位到秒级的失败时刻。铁律三备份不是文件而是时间胶囊。/backup/ocr_20231015_143000.exp不是一串字符而是那个时间点集群的完整DNA。所以我的备份命名规则强制包含日期、时间、GI版本、补丁ID、执行人。这样在三年后审计时看到ocr_20231015_143000_gi1921_p35218754_john.exp就能瞬间还原当时的决策上下文。最后分享一个小技巧在/grid/crs/install/rootcrs.sh执行前用strings /grid/bin/oracle | grep 19.21确认二进制文件版本。因为opatch apply有时会漏更新某些动态链接库导致root.sh调用旧版函数。这个strings命令是我从一次持续17小时的故障排查中悟出来的比任何文档都管用。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑