不能先打备库再打主库,因为12c PSU可能含redo格式变更(如bug 21419221),备库提前升级后无法解析主库旧版本redo,导致MRP中断、ORA-10567/ORA-10562错误,只能重建备库。

在 Oracle 12c Data Guard 环境中直接对主库或备库单独打 PSU 补丁,极大概率导致角色切换失败、MRP 进程中断、甚至 ORA-10567 / ORA-10562 等重做应用错误。必须按主备协同节奏操作,且顺序不可颠倒。
为什么不能先打备库再打主库?
12c 的 PSU 可能包含 redo 格式变更(如 bug 21419221 引入的 logminer 元数据兼容性调整),若备库提前升级到新 PSU 版本,而主库仍运行旧版本,主库生成的 redo 在备库上解析时会因内部结构不匹配报错,MRP 进程直接终止,且无法通过 ALTER DATABASE RECOVER MANAGED STANDBY DATABASE 恢复。
常见现象包括:
Errors in file /u01/app/oracle/diag/rdbms/xxx_stby/xxx/trace/xxx_mrp0_XXXX.trc:ORA-10567: Redo is inconsistent with data blockORA-10562: Error occurred while applying redo to data block
此时只能重建备库 —— 不是重启 MRP 就能解决的。
正确的主备 PSU 应用顺序
必须严格遵循「主库先停、备库先升、主库后升、再切回」四步闭环,且每步之间需验证关键状态:
- 主库停应用前:确认备库已
APPLY OFF并完成所有归档接收(SELECT MAX(SEQUENCE#) FROM V$ARCHIVED_LOG WHERE DEST_ID=1与主库一致) - 备库升级时:使用
opatch apply -oh $ORACLE_HOME -id <code>PSU_PATCH_NUMBER,完成后立即执行STARTUP MOUNT+RECOVER MANAGED STANDBY DATABASE DISCONNECT,观察是否报错 - 主库升级前:必须确认备库已成功应用完所有主库停机前的归档,并且
V$DATAGUARD_STATS中apply_lag显示为 0 - 主库升级后:启动到
OPEN状态前,先执行ALTER SYSTEM SWITCH LOGFILE两次,确保至少两个新格式日志被传到备库并可解析
OPatch 版本和冲突检查容易漏掉的关键点
12c RAC + DG 环境下,OPatch 版本不匹配是静默失败主因。例如 PSU p26925311 要求最低 OPatch 为 12.2.0.1.17,但很多环境只升级了数据库 ORACLE_HOME 下的 OPatch,却忘了同步 GRID_HOME 下的 —— 而 DG 切换依赖 ASM 和 OCR,GRID_HOME 的 OPatch 若过旧,crsctl stop crs 后可能无法正常启库。
冲突检查不能只跑一次:
- 在主库上运行
opatch prereq CheckConflictAgainstOHWithDetail -phBaseDir /path/to/psu,记录输出中的Conflicts行 - 在备库上用相同命令再跑一遍 —— 因为备库可能装过个别补丁(
one-off patch),与 PSU 冲突但主库没有 - 若发现冲突,必须用
opatch rollback先卸载对应补丁,不能跳过
打完 PSU 后必须验证的三个状态
补丁安装成功 ≠ DG 功能正常。以下三项缺一不可:
-
SELECT * FROM V$DATABASE WHERE DB_UNIQUE_NAME = 'xxx_stby'中OPEN_MODE必须为MOUNTED,不是READ ONLY(否则 MRP 不工作) -
SELECT PROCESS, STATUS, THREAD#, SEQUENCE#, BLOCK# FROM V$MANAGED_STANDBY WHERE PROCESS IN ('RFS','MRP0')中MRP0的STATUS必须为APPLYING_LOG,且SEQUENCE#持续递增 - 主库执行
ALTER SYSTEM SWITCH LOGFILE后,备库V$ARCHIVE_DEST_STATUS中对应 DG 目标的状态STATUS必须为VALID,ERROR字段为空
最易被忽略的是:12c 中启用 ADG(Active Data Guard)时,备库 OPEN READ ONLY 后必须显式执行 ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT 才能开启实时应用;仅靠 STARTUP MOUNT + RECOVER 默认不会启用实时日志流,这点在 PSU 升级后常被遗忘。


















