Standby-First Patching(SFP)是DataGuard环境下唯一官方支持的零停机升级路径,因19c RU/PSU会修改数据字典和内部版本号,主库先升级会导致备库MRP进程解析归档失败、同步中断甚至无法MOUNT;必须先升级备库(MOUNT状态)、验证同步后switchover,再升级原主库。
不能直接在 dataguard 容灾环境里对主库打补丁再拉备库同步升级——这会导致备库应用日志失败、mrp 进程中断、甚至无法启动到 mount 状态。
Oracle 官方推荐且唯一支持的零停机容灾升级路径是 Standby-First Patching(SFP):先升级备库,验证通过后切换角色,再升级原主库。整个过程主库持续提供服务,业务无感知。
为什么 Standby-First Patching 是必须的?
Oracle 19c 的 RU/PSU 补丁会修改数据字典、系统视图结构和内部对象版本号(如 DBA_REGISTRY_HISTORY 中的 VERSION 字段)。如果主库先升级,新版本生成的归档日志中包含不兼容的 SCN 和 DDL 元数据,而旧版备库无法解析,MRP 进程会报 ORA-00600: internal error code, arguments: [kcvxfResync] 或卡在 APPLYING_LOG 状态,最终导致 ADG 同步断裂。
- 备库升级前必须处于
MOUNT状态(非 OPEN READ ONLY),否则opatch apply会拒绝执行 - 主库与备库的
ORACLE_HOME路径必须完全一致(包括版本号、补丁集、OPatch 版本),否则opatch lsinventory检查失败 - RAC 环境下,需确保所有节点的
grid和oracle用户 OPatch 均 ≥12.2.0.1.19,否则opatch auto报OPatch failed with error code 73
Standby-First Patching 实操四步走
以单实例主备 + Oracle 19.25 RU(Patch 36912597)为例:
-
Step 1:停同步、启备库至 MOUNT
在主库执行:ALTER SYSTEM SWITCH LOGFILE;确保最新日志已传输;在备库执行:ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;,然后SHUTDOWN IMMEDIATE→STARTUP MOUNT -
Step 2:升级备库 ORACLE_HOME
用root执行:opatch auto /opatch/36912597 -oh $ORACLE_HOME(注意:不是opatch apply);完成后检查:$ORACLE_HOME/OPatch/opatch lsinventory -detail | grep 36912597 -
Step 3:重启备库并验证同步
SHUTDOWN IMMEDIATE→STARTUP MOUNT→ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;;确认V$MANAGED_STANDBY中MRP进程状态为APPLYING_LOG,且SELECT MAX(SEQUENCE#) FROM V$ARCHIVED_LOG WHERE APPLIED='YES';持续增长 -
Step 4:Switchover 后升级原主库
执行SWITCHOVER TO 'standby_db_name';完成角色切换;新主库(原备库)正常运行后,对原主库(现备库)重复 Step 1–3
常见错误现象及定位命令
升级后备库无法启动或 MRP 卡住,优先检查以下三项:
-
tail -n 50 $ORACLE_BASE/diag/rdbms/,搜索/ /trace/alert_ .log ORA-和OPATCH -
SELECT * FROM V$DATAGUARD_STATS WHERE NAME LIKE '%apply%';—— 若VALUE长期为0,说明日志应用未真正启动 -
SELECT STATUS, INSTANCE_NAME FROM V$INSTANCE;—— 备库必须返回MOUNTED,若为OPEN则opatch已被跳过或静默失败
容易被忽略的细节
SFP 不是“只升级备库就完事”——它本质是一次受控的滚动升级,真正的难点在角色切换窗口的协调和回退预案。
- 升级前必须备份
$ORACLE_HOME(不是数据库),因为opatch rollback在 DataGuard 场景下不可靠 - 若使用
srvctl管理,升级后需手动执行:srvctl modify database -d,否则-o $ORACLE_HOME srvctl start仍调用旧路径 - OJVM 补丁(如
Patch 36878697)必须与 DB 补丁同时应用,否则备库OPEN READ ONLY时触发ORA-01092: ORACLE instance terminated











