不能在主备库上并行执行opatch apply,因为物理备库mounted状态下无法加载新补丁所需动态链接库,主库归档应用时opatch易因library cache lock失败,且共享dg_broker_config_file会导致broker检测版本不一致而触发ora-16826并禁用配置。

必须分节点、分角色升级,不能同时打补丁,也不能靠Broker自动调度——否则DGMGRL会干预进程状态,导致ORA-16826或同步中断。
为什么不能在主备库上并行执行opatch apply
Oracle Data Guard的物理备库在MOUNTED状态下无法加载新补丁所需的动态链接库(如libserver19.so),而主库若正在应用归档,opatch可能因library cache lock争用失败;更关键的是,两个节点共享同一套dg_broker_config_file元数据,Broker看到版本不一致会主动禁用配置,报ORA-16826。
- 现象:打完补丁后
DGMGRL中SHOW CONFIGURATION显示DISABLED,且STATUS为ORA-16826 - 根本原因:Broker检测到主备
ORACLE_HOME的inventory路径或OPatch版本不一致,触发保护性停用 - 补丁包本身不校验DG角色——它只认
$ORACLE_HOME和$ORACLE_SID,所以必须人工控制顺序
补丁升级的正确执行顺序与关键命令
以19c/21c环境为例,先升备库、再升主库,全程禁用Broker,且每个节点必须单独完成“停库→换OPatch→打补丁→启库→运行datapatch”闭环。
- 升级前必须执行:
ALTER SYSTEM SET dg_broker_start=FALSE SCOPE=BOTH(主备都执行) - 备库升级时,先
SHUTDOWN IMMEDIATE,再opatch apply,完成后用STARTUP MOUNT启动,**不要OPEN** - 主库升级时,必须确保备库已启用实时应用(
MANAGED REAL TIME APPLY),否则datapatch会因字典不一致失败 - 每个节点打完补丁后,必须立即运行:
datapatch -verbose -pdbs <pdb_name></pdb_name>(CDB环境)或datapatch -verbose(非CDB)
opatch参数与datapatch易错点
opatch默认不检查DG角色,但datapatch会读取V$DATABASE和V$PDBS,若备库未MOUNT或主库未OPEN,它会跳过组件升级甚至静默失败。
-
opatch apply前务必备份原OPatch目录:mv $ORACLE_HOME/OPatch $ORACLE_HOME/OPatch.bak_$(date +%Y%m%d) -
datapatch必须在数据库OPEN(主库)或MOUNT(备库)状态下运行,否则报ORA-29913: error in executing ODCIEXTTABLEOPEN callout - 跨PDB环境,
datapatch -pdbs参数必须显式指定PDB名,不能用通配符;漏掉某个PDB会导致DBA_REGISTRY_SQLPATCH中状态为APPLIED但STATUS为ERROR - 如果
datapatch中途被杀,残留的sqlpatch会话锁住OBJ$,需手动清理:ALTER SYSTEM KILL SESSION '<sid>,<serial>'</serial></sid>
升级后验证同步与补丁状态
补丁生效不等于DG同步正常——常见错误是datapatch成功但MRP进程卡在旧SCN,因为补丁改变了redo解析逻辑,未触发自动恢复重启。
- 主库查补丁历史:
SELECT ACTION, PATCH_ID, STATUS FROM DBA_REGISTRY_SQLPATCH ORDER BY ACTION_TIME DESC - 备库确认MRP是否运行:
SELECT PROCESS, STATUS, THREAD#, SEQUENCE# FROM V$MANAGED_STANDBY WHERE PROCESS = 'MRP0',若STATUS不是APPLYING_LOG,需手动重启:ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT - 检查主备组件版本一致性:
SELECT COMP_NAME, VERSION, STATUS FROM DBA_REGISTRY,重点核对Oracle Database Packages and Types和Oracle Java Packages两行 - 最后做一次
ALTER SYSTEM ARCHIVE LOG CURRENT,观察备库V$ARCHIVED_LOG中APPLIED列是否变为YES
最常被忽略的是datapatch执行时机:它必须在数据库实例启动后、用户连接前完成,否则补丁SQL可能被并发DDL阻塞,导致ORA-00054并永久挂起。宁可多等两分钟确认V$INSTANCE.STATUS = 'OPEN',也不要抢着跑脚本。











