opatchauto rollback 是唯一能安全回退 RAC 补丁的官方方式,但必须先以 root 用户在每个节点执行 crsctl stop crs -f 停止 CRS 全栈,再指定 -oh 指向 GI HOME 执行回退,否则会报 OPATCHAUTO-68061 或 CRS is running 错误。

opatchauto rollback是唯一能安全回退 RAC 补丁的官方方式,但必须满足前置条件——否则直接执行会失败甚至破坏集群。
回退前必须停掉整个 CRS 集群(两节点都要)
补丁回退不是数据库级操作,而是 Grid Infrastructure 层级行为。只要 CRS 还在运行,opatchauto rollback 就会拒绝执行,并报错 OPATCHAUTO-68061 或 CRS is running。
正确做法是:以 root 用户在每个节点依次执行:
cd /u01/app/19.3.0/grid/bin/ crsctl stop crs -f
等待输出 CRS-4133: Oracle High Availability Services has been stopped. 后再继续。不要只停数据库实例或只停 ASM —— 必须停 CRS 全栈。
- 别用
srvctl stop database代替,它不触达 CRS 核心服务 - 确认状态:执行
crsctl check crs应返回CRS-4639: Could not contact Oracle High Availability Services - Windows 环境下需额外停止
OracleServiceGRID和OracleServiceASM服务(用services.msc或net stop)
回退命令中 -oh 参数必须指向 GI HOME,不能是 DB HOME
常见错误是把 opatchauto rollback 误用在 $ORACLE_HOME(即数据库软件目录),结果报错 Cannot find inventory for the given Oracle Home 或静默失败。
RAC 的补丁(尤其是 RU、RUR、COMBO)默认打在 Grid Infrastructure 层,回退也必须指定 -oh /u01/app/19.3.0/grid(路径按实际调整)。
- 查 GI HOME 路径:登录
grid用户,运行echo $ORACLE_HOME - 补丁包路径要完整:如
/soft/35940989/,末尾不能带斜杠,也不能是 zip 文件名 - 如果补丁同时打了 GI 和 DB(例如 combo patch),只需对 GI HOME 执行一次 rollback,DB 部分会自动联动回退
权限和文件锁问题常导致 rollback 中断
opatchauto rollback 过程中若遇到 Permission denied 或 java.io.IOException,大概率是 /u01/app/oraInventory/ContentsXML/ 下的文件被锁定或权限不对。
典型错误日志片段:
oracle.sysman.oui.patch.PatchException: java.io.FileNotFoundException: /u01/app/oraInventory/ContentsXML/oui-patch.xml (Permission denied)
- 临时修复:以
root执行chmod 644 /u01/app/oraInventory/ContentsXML/oui-patch.xml - 根本预防:回退前确保
oraInventory所有者为grid:oinstall,且组可读 - 别忽略
opatchauto resume:中断后不要重跑整条命令,先用opatchauto resume续跑,避免重复解压或冲突校验
回退后必须验证 OCR/Voting Disk 和 ASM 实例状态
回退成功不代表集群就恢复可用——OCR 可能残留新补丁的配置项,ASM 密码文件可能损坏(尤其低于 19.8 版本),这些不会在 rollback 日志里报错,但会导致后续 crsctl start crs 失败或 ASM 启不来。
- 检查 OCR 完整性:
ocrcheck -config+ocrcheck -local - 确认 Voting Disk 状态:
crsctl query css votedisk输出应显示STATE: ONLINE - 启动 CRS 后立即检查 ASM:
sqlplus / as sysasm→startup→ 若报ORA-15170或凭证错误,需用asmcmd --nocp credfix(19.8+)或手动重建密码文件
最容易被跳过的环节是:没验证 ASM 实例是否真能 mount 所有磁盘组。哪怕 CRS 启动成功,asmcmd lsdg 返回空或部分 OFFLINE,说明回退未真正完成闭环。











