19c 的 RU 补丁包含数据库二进制和 SQL 字典两部分,只跑 opatch apply 不算打完:数据库能启动,但字典还是旧版本,部分功能和新特性会异常。完整流程是 OPatch 打二进制 → 启动库 → datapatch 打字典 → 编译无效对象 → 验证。回退则要反着来,并且同样要处理字典。
本文记录一次单机环境从 19.3.0 升级到 RU 19.25 的实操,包含 OJVM 补丁和回退。环境为单实例,Oracle Home 为 /oracle/app/19.3.0/db_1,数据库名 SINCDB,PDB 为 SINGLE,监听端口 1526。RAC 环境需要按节点逐个打补丁,并且要额外处理 GI Home,步骤不同,不能直接套用。
文中的目录名、日志文件名、时间戳都来自原文,用于对照;实际执行时以你自己的补丁目录和日志路径为准。所有 opatch、datapatch 命令都必须在正确的 Oracle Home 下执行,切换用户和 Home 后先 echo $ORACLE_HOME 确认。
补丁清单(原文所用):
| 补丁 | 编号 | 说明 |
|---|---|---|
| DB RU | 36912597 | Database Release Update 19.25.0.0.241015 |
| OJVM RU | 36878697 | OJVM RELEASE UPDATE 19.25.0.0.241015 |
| OPatch | 6880880 | 升级后版本 12.2.0.1.49 |
补丁号、版本号必须与实际下载的补丁一致。不同平台、不同 RU 的编号不同,不要照抄本文的编号去 MOS 搜索。
一、升级前的准备
停机窗口与备份
打补丁是不可逆的停机操作,回退也只能回到打补丁前的二进制状态,不能替代备份。动手前至少确认:
- 有完整的数据库备份(RMAN 全备 + 归档),并验证过可恢复。
- 有
$ORACLE_HOME的操作系统级备份,或至少记录当前opatch lspatches输出。 - 有回退窗口:
opatch rollback之后还需要跑datapatch,这段时间业务同样不可用。 - 业务已停止,没有长事务、没有正在跑的批量任务。
- 磁盘空间足够:补丁包本身约 1.9G,解压后还需要额外空间,
$ORACLE_HOME所在文件系统要留足余量。
原文的提醒是“若是生产环境尽量在无业务的情况下进行升级补丁”。实际上不只是“尽量”,RU 升级期间数据库必须关闭,datapatch 期间也不能有业务连接。
先确认“现在到底是什么版本”
补丁出问题,先别急着怀疑补丁本身,先确认版本状态。opatch lspatches 看到的是二进制补丁,dba_registry_sqlpatch 看到的是字典补丁,两者可能不一致:
select patch_id,patch_type,action,status,description,action_time
from dba_registry_sqlpatch
order by action_time;
正常状态下,最新一条 RU 的 action 应为 APPLY、status 为 SUCCESS。如果二进制已经是 19.25 而这里最新还是 19.3,说明 datapatch 没跑或没跑完,这时直接再打下一个补丁会叠加问题。
还要确认三件事:
$ORACLE_HOME是否只有一个。机器上残留旧 Home 时,很容易在错误的 Home 里执行opatch。- 当前 RU 与要打的 RU 之间是否有额外的 one-off 补丁。有的话先看补丁 README 的冲突说明,不要直接 apply。
- 数据库是否启用了 OJVM 相关功能。不用 Java in Database 的环境可以不打 OJVM,但一旦打过,后续 RU 必须保持 OJVM 同步升级,否则版本组合不在 Oracle 支持矩阵内。
时间窗口怎么估
整个过程的时间主要花在四处:opatch apply 的二进制替换、datapatch 的字典更新、utlrp 编译、以及回退时的反向操作。datapatch 的耗时和 PDB 数量、字典对象数量、表空间余量直接相关,原文环境里第二轮 datapatch 从 21:57:59 跑到 22:04:59,约 7 分钟,但这不能当作通用估算。
窗口安排建议留出至少两倍于实测时间的余量,并把回退路径也算进去:一旦打补丁失败,需要先 opatch rollback 再恢复备份,这段时间业务同样不可用。窗口内不要安排其他变更。
上传补丁
[oracle@ora19c-single psu]# pwd
/oracle/soft/psu
[oracle@ora19c-single psu]# ls -rlth
总用量 1.9G
-rw-r--r-- 1 oracle oinstall 1.7G 4月 4 17:54 p36912597_190000_Linux-x86-64.zip
-rw-r--r-- 1 oracle oinstall 122M 4月 4 17:54 p36878697_190000_Linux-x86-64.zip
-rw-r--r-- 1 oracle oinstall 70M 4月 4 17:54 p6880880_190000_Linux-x86-64.zip
解压
[root@ora19c-single psu]# unzip p36912597_190000_Linux-x86-64.zip
[oracle@ora19c-single psu]$ unzip p36878697_190000_Linux-x86-64.zip
解压后的目录名就是补丁号:36912597/、36878697/。后续 opatch apply 要在对应目录里执行。
替换 OPatch
旧版本 OPatch 可能不支持新补丁,先确认版本:
[oracle@ora19c-single psu]$ cd $ORACLE_HOME/
[oracle@ora19c-single db_1]$ ./OPatch/opatch version
OPatch Version: 12.2.0.1.17
OPatch succeeded.
备份旧目录,再解压新版本:
[oracle@ora19c-single db_1]$ mv OPatch/ OPatch_20260404
[oracle@ora19c-single db_1]$ unzip /oracle/soft/psu/p6880880_190000_Linux-x86-64.zip -d $ORACLE_HOME
[oracle@ora19c-single db_1]$ ./OPatch/opatch version
OPatch Version: 12.2.0.1.49
OPatch succeeded.
mv 而不是删除,是为了出问题时能换回来。替换后必须再查一次版本,确认解压到了正确目录。
二、应用 DB 补丁
关闭监听和数据库
[oracle@ora19c-single 36912597]$ lsnrctl stop
LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 04-APR-2026 18:07:50
Copyright (c) 1991, 2019, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ora19c-single)(PORT=1526)))
The command completed successfully
[oracle@ora19c-single 36912597]$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Sat Apr 4 18:08:12 2026
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
先停监听再停库,可以避免应用在停库过程中反复重连。确认实例已经关闭再继续,不要用 shutdown abort 赶时间。
检查系统空间
[oracle@ora19c-single 36912597]$ pwd
/oracle/soft/psu/36912597
[oracle@ora19c-single 36912597]$ $ORACLE_HOME/OPatch/opatch prereq CheckSystemSpace -ph ./
Oracle Interim Patch Installer version 12.2.0.1.49
Copyright (c) 2026, Oracle Corporation. All rights reserved.
PREREQ session
Oracle Home : /oracle/app/19.3.0/db_1
Central Inventory : /oracle/app/oraInventory
from : /oracle/app/19.3.0/db_1/oraInst.loc
OPatch version : 12.2.0.1.49
OUI version : 12.2.0.7.0
Log file location : /oracle/app/19.3.0/db_1/cfgtoollogs/opatch/opatch2026-04-04_18-10-17PM_1.log
Invoking prereq "checksystemspace"
Prereq "checkSystemSpace" passed.
OPatch succeeded.
检查补丁冲突
[oracle@ora19c-single 36912597]$ $ORACLE_HOME/OPatch/opatch prereq CheckConflictAgainstOHWithDetail -ph ./
Oracle Interim Patch Installer version 12.2.0.1.49
Copyright (c) 2026, Oracle Corporation. All rights reserved.
PREREQ session
Oracle Home : /oracle/app/19.3.0/db_1
Central Inventory : /oracle/app/oraInventory
from : /oracle/app/19.3.0/db_1/oraInst.loc
OPatch version : 12.2.0.1.49
OUI version : 12.2.0.7.0
Log file location : /oracle/app/19.3.0/db_1/cfgtoollogs/opatch/opatch2026-04-04_18-10-27PM_1.log
Invoking prereq "checkconflictagainstohwithdetail"
Prereq "checkConflictAgainstOHWithDetail" passed.
OPatch succeeded.
两项检查都 passed 才继续。冲突检查不通过时,先看日志里冲突的补丁号,不要强行加 -force。
应用补丁
[oracle@ora19c-single 36912597]$ /oracle/app/19.3.0/db_1/OPatch/opatch apply
Oracle Interim Patch Installer version 12.2.0.1.49
Copyright (c) 2026, Oracle Corporation. All rights reserved.
Oracle Home : /oracle/app/19.3.0/db_1
Central Inventory : /oracle/app/oraInventory
from : /oracle/app/19.3.0/db_1/oraInst.loc
OPatch version : 12.2.0.1.49
OUI version : 12.2.0.7.0
Log file location : /oracle/app/19.3.0/db_1/cfgtoollogs/opatch/opatch2026-04-04_18-23-22PM_1.log
Verifying environment and performing prerequisite checks...
OPatch continues with these patches: 36912597
Do you want to proceed? [y|n]
y
User Responded with: Y
All checks passed.
Please shutdown Oracle instances running out of this ORACLE_HOME on the local system.
(Oracle Home = '/oracle/app/19.3.0/db_1')
Is the local system ready for patching? [y|n]
y
User Responded with: Y
Backing up files...
Applying interim patch '36912597' to OH '/oracle/app/19.3.0/db_1'
ApplySession: Optional component(s) [ oracle.network.gsm, 19.0.0.0.0 ] , [ oracle.crypto.rsf, 19.0.0.0.0 ] , [ oracle.pg4appc, 19.0.0.0.0 ] , [ oracle.pg4mq, 19.0.0.0.0 ] , [ oracle.precomp.companion, 19.0.0.0.0 ] , [ oracle.rdbms.ic, 19.0.0.0.0 ] , [ oracle.rdbms.tg4db2, 19.0.0.0.0 ] , [ oracle.tfa, 19.0.0.0.0 ] , [ oracle.sdo.companion, 19.0.0.0.0 ] , [ oracle.net.cman, 19.0.0.0.0 ] , [ oracle.oid.client, 19.0.0.0.0 ] , [ oracle.xdk.companion, 19.0.0.0.0 ] , [ oracle.options.olap.api, 19.0.0.0.0 ] , [ oracle.ons.eons.bwcompat, 19.0.0.0.0 ] , [ oracle.rdbms.tg4msql, 19.0.0.0.0 ] , [ oracle.network.cman, 19.0.0.0.0 ] , [ oracle.rdbms.tg4tera, 19.0.0.0.0 ] , [ oracle.rdbms.tg4ifmx, 19.0.0.0.0 ] , [ oracle.rdbms.tg4sybs, 19.0.0.0.0 ] , [ oracle.ldap.ztk, 19.0.0.0.0 ] , [ oracle.ons.cclient, 19.0.0.0.0 ] , [ oracle.options.olap, 19.0.0.0.0 ] , [ oracle.jdk, 1.8.0.191.0 ] , [ oracle.jdk, 1.8.0.391.11 ] not present in the Oracle Home or a higher version is found.
Patching component oracle.rdbms, 19.0.0.0.0...
Patching component oracle.rdbms.util, 19.0.0.0.0...
Patching component oracle.rdbms.rsf, 19.0.0.0.0...
Patching component oracle.assistants.acf, 19.0.0.0.0...
Patching component oracle.assistants.deconfig, 19.0.0.0.0...
Patching component oracle.assistants.server, 19.0.0.0.0...
Patching component oracle.blaslapack, 19.0.0.0.0...
......
Patching component oracle.precomp.lang, 19.0.0.0.0...
Patching component oracle.jdk, 1.8.0.201.0...
Patch 36912597 successfully applied.
Sub-set patch [29517242] has become inactive due to the application of a super-set patch [36912597].
Please refer to Doc ID 2161861.1 for any possible further required actions.
Log file location: /oracle/app/19.3.0/db_1/cfgtoollogs/opatch/opatch2026-04-04_18-23-22PM_1.log
OPatch succeeded.
Sub-set patch [29517242] has become inactive 是正常输出:19.3 的基础 RU 被 19.25 这个超集替代,不需要手动处理,但建议按提示看一下 Doc ID 2161861.1。
三、应用 OJVM 补丁
OJVM 补丁按需安装。如果应用不使用 Java in Database,可以不装;装了就要和 DB RU 版本匹配,否则 datapatch 可能报错。
[oracle@ora19c-single 36912597]$ cd ..
[oracle@ora19c-single psu]$ ll
total 1930580
drwxr-xr-x 4 oracle oinstall 67 Sep 24 2024 36878697
drwxr-xr-x 5 oracle oinstall 81 Oct 11 2024 36912597
-rw-r--r-- 1 oracle oinstall 127601834 Apr 4 17:54 p36878697_190000_Linux-x86-64.zip
-rw-r--r-- 1 oracle oinstall 1776391552 Apr 4 17:54 p36912597_190000_Linux-x86-64.zip
-rw-r--r-- 1 oracle oinstall 72896144 Apr 4 17:54 p6880880_190000_Linux-x86-64.zip
-rw-rw-r-- 1 oracle oinstall 19453 Oct 15 2024 PatchSearch.xml
[oracle@ora19c-single psu]$ cd 36878697/
[oracle@ora19c-single 36878697]$ /oracle/app/19.3.0/db_1/OPatch/opatch apply
Oracle Interim Patch Installer version 12.2.0.1.49
Copyright (c) 2026, Oracle Corporation. All rights reserved.
Oracle Home : /oracle/app/19.3.0/db_1
Central Inventory : /oracle/app/oraInventory
from : /oracle/app/19.3.0/db_1/oraInst.loc
OPatch version : 12.2.0.1.49
OUI version : 12.2.0.7.0
Log file location : /oracle/app/19.3.0/db_1/cfgtoollogs/opatch/opatch2026-04-04_18-38-32PM_1.log
Verifying environment and performing prerequisite checks...
OPatch continues with these patches: 36878697
Do you want to proceed? [y|n]
y
User Responded with: Y
All checks passed.
Please shutdown Oracle instances running out of this ORACLE_HOME on the local system.
(Oracle Home = '/oracle/app/19.3.0/db_1')
Is the local system ready for patching? [y|n]
y
User Responded with: Y
Backing up files...
Applying interim patch '36878697' to OH '/oracle/app/19.3.0/db_1'
Patching component oracle.javavm.server, 19.0.0.0.0...
Patching component oracle.javavm.server.core, 19.0.0.0.0...
Patching component oracle.rdbms.dbscripts, 19.0.0.0.0...
Patching component oracle.rdbms, 19.0.0.0.0...
Patching component oracle.javavm.client, 19.0.0.0.0...
......
Do you want to proceed? [y|n]
y
User Responded with: Y
Patch 36878697 successfully applied.
验证已安装补丁
[oracle@ora19c-single 36878697]$ /oracle/app/19.3.0/db_1/OPatch/opatch lspatches
36878697;OJVM RELEASE UPDATE: 19.25.0.0.241015 (36878697)
36912597;Database Release Update : 19.25.0.0.241015 (36912597)
29585399;OCW RELEASE UPDATE 19.3.0.0.0 (29585399)
OPatch succeeded.
这里只能证明二进制已打上,字典还没动。29585399 是 OCW 组件,版本仍是 19.3,属于正常现象。
四、启动数据库并执行 datapatch
启动数据库和监听
二进制打完后,数据库仍然是关闭的。先用新二进制启动实例:
[oracle@ora19c-single 36878697]$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Sat Apr 4 18:42:44 2026
Version 19.25.0.0.0
Copyright (c) 1982, 2024, Oracle. All rights reserved.
Connected to an idle instance.
SQL> startup
ORACLE instance started.
Total System Global Area 2080372592 bytes
Fixed Size 9185136 bytes
Variable Size 654311424 bytes
Database Buffers 1409286144 bytes
Redo Buffers 7589888 bytes
Database mounted.
Database opened.
SQL> exit
Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.25.0.0.0
[oracle@ora19c-single 36878697]$ lsnrctl start
注意 SQL*Plus 显示的 Version 已经变成 19.25.0.0.0,这是二进制生效的标志。
datapatch 前置检查
datapatch 会修改数据字典,必须先确认表空间空间足够,否则可能长时间卡住:
SYSTEM、SYSAUX、UNDO、TEMP表空间要够。PDB$SEED和每个 PDB 的SYSTEM、SYSAUX、UNDO、TEMP也要够。- 不够时先扩容:
alter database datafile ' ' resize 1G;
alter database tempfile ' ' resize 1G;
这两条是模板,单引号里要填实际文件路径,不能直接执行。扩容前先用 dba_data_files/dba_temp_files 确认文件名和当前大小。
PDB 必须处于 OPEN 状态,datapatch 不会处理关闭的 PDB。执行前确认:
select con_id,name,open_mode from v$pdbs;
执行 datapatch
[oracle@ora19c-single 36878697]$ /oracle/app/19.3.0/db_1/OPatch/datapatch -verbose
SQL Patching tool version 19.25.0.0.0 Production on Sat Apr 4 21:57:59 2026
Copyright (c) 2012, 2024, Oracle. All rights reserved.
Log file for this invocation: /oracle/app/db/cfgtoollogs/sqlpatch/sqlpatch_10247_2026_04_04_21_57_59/sqlpatch_invocation.log
Connecting to database...OK
Gathering database info...done
Note: Datapatch will only apply or rollback SQL fixes for PDBs
that are in an open state, no patches will be applied to closed PDBs.
Please refer to Note: Datapatch: Database 12c Post Patch SQL Automation
(Doc ID 1585822.1)
Bootstrapping registry and package to current versions...done
Determining current state...done
Current state of interim SQL patches:
Interim patch 36878697 (OJVM RELEASE UPDATE: 19.25.0.0.241015 (36878697)):
Binary registry: Installed
PDB CDB$ROOT: Not installed
PDB PDB$SEED: Not installed
PDB SINGLE: Not installed
Current state of release update SQL patches:
Binary registry:
19.25.0.0.0 Release_Update 241010184253: Installed
PDB CDB$ROOT:
Applied 19.3.0.0.0 Release_Update 190410122720 successfully on 03-APR-26 12.57.03.631907 AM
PDB PDB$SEED:
Applied 19.3.0.0.0 Release_Update 190410122720 successfully on 03-APR-26 01.01.42.529305 AM
PDB SINGLE:
Applied 19.3.0.0.0 Release_Update 190410122720 successfully on 03-APR-26 01.01.42.529305 AM
Adding patches to installation queue and performing prereq checks...done
Installation queue:
For the following PDBs: CDB$ROOT PDB$SEED SINGLE
No interim patches need to be rolled back
Patch 36912597 (Database Release Update : 19.25.0.0.241015 (36912597)):
Apply from 19.3.0.0.0 Release_Update 190410122720 to 19.25.0.0.0 Release_Update 241010184253
The following interim patches will be applied:
36878697 (OJVM RELEASE UPDATE: 19.25.0.0.241015 (36878697))
Installing patches...
Patch installation complete. Total patches installed: 6
Validating logfiles...done
Patch 36912597 apply (pdb CDB$ROOT): SUCCESS
logfile: /oracle/app/db/cfgtoollogs/sqlpatch/36912597/25871884/36912597_apply_SINCDB_CDBROOT_2026Apr04_21_58_15.log (no errors)
Patch 36878697 apply (pdb CDB$ROOT): SUCCESS
logfile: /oracle/app/db/cfgtoollogs/sqlpatch/36878697/25797620/36878697_apply_SINCDB_CDBROOT_2026Apr04_21_58_15.log (no errors)
Patch 36912597 apply (pdb PDB$SEED): SUCCESS
logfile: /oracle/app/db/cfgtoollogs/sqlpatch/36912597/25871884/36912597_apply_SINCDB_PDBSEED_2026Apr04_22_01_32.log (no errors)
Patch 36878697 apply (pdb PDB$SEED): SUCCESS
logfile: /oracle/app/db/cfgtoollogs/sqlpatch/36878697/25797620/36878697_apply_SINCDB_PDBSEED_2026Apr04_22_01_32.log (no errors)
Patch 36912597 apply (pdb SINGLE): SUCCESS
logfile: /oracle/app/db/cfgtoollogs/sqlpatch/36912597/25871884/36912597_apply_SINCDB_SINGLE_2026Apr04_22_01_32.log (no errors)
Patch 36878697 apply (pdb SINGLE): SUCCESS
logfile: /oracle/app/db/cfgtoollogs/sqlpatch/36878697/25797620/36878697_apply_SINCDB_SINGLE_2026Apr04_22_01_32.log (no errors)
SQL Patching tool complete on Sat Apr 4 22:04:59 2026
6 个 SUCCESS 对应 2 个补丁 × 3 个容器(CDB$ROOT、PDB$SEED、SINGLE)。任何一条不是 SUCCESS 都不能继续,先去日志里找原因。
检查日志
[oracle@ora19c-single 36878697]$ ll /oracle/app/db/cfgtoollogs/sqlpatch/36878697/25797620/
total 96
-rw-r--r-- 1 oracle oinstall 14478 Apr 4 18:54 36878697_apply_SINCDB_CDBROOT_2026Apr04_18_54_24.log
-rw-r--r-- 1 oracle oinstall 14478 Apr 4 21:58 36878697_apply_SINCDB_CDBROOT_2026Apr04_21_58_15.log
-rw-r--r-- 1 oracle oinstall 14478 Apr 4 19:00 36878697_apply_SINCDB_PDBSEED_2026Apr04_18_59_49.log
-rw-r--r-- 1 oracle oinstall 14478 Apr 4 22:01 36878697_apply_SINCDB_PDBSEED_2026Apr04_22_01_32.log
-rw-r--r-- 1 oracle oinstall 14478 Apr 4 19:00 36878697_apply_SINCDB_SINGLE_2026Apr04_18_59_49.log
-rw-r--r-- 1 oracle oinstall 14478 Apr 4 22:01 36878697_apply_SINCDB_SINGLE_2026Apr04_22_01_32.log
[oracle@ora19c-single 36878697]$ ll /oracle/app/db/cfgtoollogs/sqlpatch/36912597/25871884/
total 179112
-rw-r--r-- 1 oracle oinstall 29612867 Apr 4 18:59 36912597_apply_SINCDB_CDBROOT_2026Apr04_18_54_58.log
-rw-r--r-- 1 oracle oinstall 29637990 Apr 4 22:01 36912597_apply_SINCDB_CDBROOT_2026Apr04_21_58_15.log
-rw-r--r-- 1 oracle oinstall 29612546 Apr 4 19:04 36912597_apply_SINCDB_PDBSEED_2026Apr04_19_00_08.log
-rw-r--r-- 1 oracle oinstall 29637669 Apr 4 22:04 36912597_apply_SINCDB_PDBSEED_2026Apr04_22_01_32.log
-rw-r--r-- 1 oracle oinstall 29612946 Apr 4 19:04 36912597_apply_SINCDB_SINGLE_2026Apr04_19_00_06.log
-rw-r--r-- 1 oracle oinstall 29638069 Apr 4 22:04 36912597_apply_SINCDB_SINGLE_2026Apr04_22_01_32.log
-rw-r--r-- 1 oracle oinstall 941513 Apr 4 18:59 36912597_ru_apply_SINCDB_CDBROOT_2026Apr04_18_54_23.log
-rw-r--r-- 1 oracle oinstall 941513 Apr 4 22:01 36912597_ru_apply_SINCDB_CDBROOT_2026Apr04_21_58_15.log
-rw-r--r-- 1 oracle oinstall 941513 Apr 4 19:04 36912597_ru_apply_SINCDB_PDBSEED_2026Apr04_18_59_48.log
-rw-r--r-- 1 oracle oinstall 941513 Apr 4 22:04 36912597_ru_apply_SINCDB_PDBSEED_2026Apr04_22_01_31.log
-rw-r--r-- 1 oracle oinstall 941513 Apr 4 19:04 36912597_ru_apply_SINCDB_SINGLE_2026Apr04_18_59_48.log
-rw-r--r-- 1 oracle oinstall 941513 Apr 4 22:04 36912597_ru_apply_SINCDB_SINGLE_2026Apr04_22_01_31.log
目录里能看到两轮 datapatch(18:54–19:04 和 21:58–22:04),说明第一次执行过、之后又重跑了一次。日志文件名里的时间就是判断依据,排查问题时要看最新一轮,不要拿旧日志下结论。
datapatch 报错怎么处理
datapatch 失败时不要反复重跑,先看它自己给出的日志路径。常见几类:
- 表空间不足:日志里出现无法扩展段或 ORA-01653/ORA-01654。先扩容对应表空间,再重跑
datapatch -verbose;已成功的 PDB 会被识别为已应用,不会重复执行。 - PDB 未打开:日志提示跳过某个 PDB。打开后单独对该 PDB 执行,或重跑整个 datapatch。
- 字典对象无效导致编译失败:先跑
utlrp.sql,再重跑 datapatch。 - 补丁与已有 one-off 冲突:日志会给出补丁号,按 README 要求先回退冲突补丁。
重跑前确认上一轮的会话已经完全退出。datapatch 中断后可能留下未提交的字典变更,直接重跑一般能续上,但如果报错涉及 registry 表,应先按 MOS 文档处理,不要手工改字典表。
编译无效对象
补丁会改动大量包和视图,跑完 datapatch 必须编译无效对象。多租户环境用 catcon.pl:
[oracle@ora19c-single 36878697]$ $ORACLE_HOME/perl/bin/perl $ORACLE_HOME/rdbms/admin/catcon.pl -n 1 -e -b utlrp -d $ORACLE_HOME/rdbms/admin utlrp.sql
catcon::set_log_file_base_path: ALL catcon-related output will be written to [/oracle/soft/psu/36878697/utlrp_catcon_12110.lst]
catcon::set_log_file_base_path: catcon: See [/oracle/soft/psu/36878697/utlrp*.log] files for output generated by scripts
catcon::set_log_file_base_path: catcon: See [/oracle/soft/psu/36878697/utlrp_*.lst] files for spool files, if any
catcon.pl: completed successfully
单实例非 CDB 可以用 $ORACLE_HOME/rdbms/admin/utlrp.sql。编译后查剩余无效对象:
select owner,object_type,count(*) from dba_objects where status='INVALID' group by owner,object_type order by 3 desc;
少量系统对象(例如 SYS 下的回收站相关对象)可能仍是 INVALID,属于常见情况;业务 schema 下的无效对象必须处理。
datapatch 之后必须做的事
datapatch 成功不代表升级完成,还有三件收尾工作:
- 编译无效对象。补丁会替换大量包、视图、类型,未编译的对象在业务调用时才报 ORA-04063/ORA-06508。
- 确认组件版本。查
dba_registry,确认CATALOG、CATPROC等组件的版本和状态正常:
select comp_id,comp_name,version,status from dba_registry order by comp_id;
- 确认 SQL 补丁记录。
dba_registry_sqlpatch里应能看到本次 RU 和 OJVM 的 APPLY 记录,且status为SUCCESS。这一步在回退时同样要用,建议升级前后各存一份输出。
catcon.pl 执行 utlrp.sql 时,日志会写到当前工作目录。如果当前目录没有写权限,会出现“completed successfully”但实际没有编译的情况,执行前先 cd 到有权限的目录。
五、什么时候该回退
不是所有异常都要回退。先区分三类情况:
- 补丁没打成功(
opatch apply报错、datapatch 有 FAILED):必须处理,通常回退后重来。 - 补丁打成功但业务报错:先确认是否由补丁引起,查告警日志、SQL 执行计划变化、无效对象。能通过编译、收集统计信息、调整 SQL 解决的,不回退。
- 性能下降:RU 可能改变优化器行为。先在测试环境复现,确认是计划变化还是 bug,再决定回退或打 one-off。
回退是不可逆操作的一部分:回退后字典也要回退,期间业务不可用,而且回退到旧版本意味着放弃了本次 RU 修复的安全问题。生产环境做这个决定前,应该有明确的故障证据,而不是“感觉不对就先退”。
六、回退步骤
回退的前提是二进制补丁还在 $ORACLE_HOME 的补丁记录里,并且 OPatch 备份目录没有被清理。回退同样需要停机,且回退后字典版本与二进制不匹配,必须重新执行 datapatch。
停止监听和数据库
[oracle@ora19c-single 36878697]$ lsnrctl stop
LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 05-APR-2026 01:04:47
Copyright (c) 1991, 2024, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ora19c-single)(PORT=1526)))
The command completed successfully
[oracle@ora19c-single 36878697]$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Sun Apr 5 01:05:47 2026
Version 19.25.0.0.0
Copyright (c) 1982, 2024, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.25.0.0.0
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
回退 DB 补丁
[oracle@ora19c-single 36912597]$ /oracle/app/19.3.0/db_1/OPatch/opatch rollback -id 36912597
Oracle Interim Patch Installer version 12.2.0.1.49
Copyright (c) 2026, Oracle Corporation. All rights reserved.
Oracle Home : /oracle/app/19.3.0/db_1
Central Inventory : /oracle/app/oraInventory
from : /oracle/app/19.3.0/db_1/oraInst.loc
OPatch version : 12.2.0.1.49
OUI version : 12.2.0.7.0
Log file location : /oracle/app/19.3.0/db_1/cfgtoollogs/opatch/opatch2026-04-05_01-08-42AM_1.log
Patches will be rolled back in the following order:
36912597
The following patch(es) will be rolled back: 36912597
Please shutdown Oracle instances running out of this ORACLE_HOME on the local system.
(Oracle Home = '/oracle/app/19.3.0/db_1')
Is the local system ready for patching? [y|n]
y
User Responded with: Y
Rolling back patch 36912597...
RollbackSession rolling back interim patch '36912597' from OH '/oracle/app/19.3.0/db_1'
Patching component oracle.rdbms, 19.0.0.0.0...
Patching component oracle.rdbms.util, 19.0.0.0.0...
Patching component oracle.rdbms.rsf, 19.0.0.0.0...
......
Patching component oracle.jdk, 1.8.0.201.0...
RollbackSession removing interim patch '36912597' from inventory
Inactive sub-set patch [29517242] has become active due to the rolling back of a super-set patch [36912597].
Please refer to Doc ID 2161861.1 for any possible further required actions.
Log file location: /oracle/app/19.3.0/db_1/cfgtoollogs/opatch/opatch2026-04-05_01-08-42AM_1.log
OPatch succeeded.
回退 OJVM 补丁
[oracle@ora19c-single 36878697]$ /oracle/app/19.3.0/db_1/OPatch/opatch rollback -id 36878697
Oracle Interim Patch Installer version 12.2.0.1.49
Copyright (c) 2026, Oracle Corporation. All rights reserved.
Oracle Home : /oracle/app/19.3.0/db_1
Central Inventory : /oracle/app/oraInventory
from : /oracle/app/19.3.0/db_1/oraInst.loc
OPatch version : 12.2.0.1.49
OUI version : 12.2.0.7.0
Log file location : /oracle/app/19.3.0/db_1/cfgtoollogs/opatch/opatch2026-04-05_01-18-36AM_1.log
Patches will be rolled back in the following order:
36878697
The following patch(es) will be rolled back: 36878697
Please shutdown Oracle instances running out of this ORACLE_HOME on the local system.
(Oracle Home = '/oracle/app/19.3.0/db_1')
Is the local system ready for patching? [y|n]
y
User Responded with: Y
Rolling back patch 36878697...
RollbackSession rolling back interim patch '36878697' from OH '/oracle/app/19.3.0/db_1'
Patching component oracle.javavm.server, 19.0.0.0.0...
Patching component oracle.javavm.server.core, 19.0.0.0.0...
Patching component oracle.rdbms.dbscripts, 19.0.0.0.0...
......
Do you want to proceed? [y|n]
y
User Responded with: Y
OPatch Session completed with warnings.
Log file location: /oracle/app/19.3.0/db_1/cfgtoollogs/opatch/opatch2026-04-05_01-18-36AM_1.log
OPatch completed with warnings.
completed with warnings 不等于失败,但必须看日志确认警告内容。常见的警告是某些组件已被其他补丁覆盖或文件校验不一致,若涉及 oracle.javavm 相关组件,回退后要重点验证 Java 存储过程。
验证回退结果
[oracle@ora19c-single 36912597]$ /oracle/app/19.3.0/db_1/OPatch/opatch lspatches
29585399;OCW RELEASE UPDATE 19.3.0.0.0 (29585399)
29517242;Database Release Update : 19.3.0.0.190416 (29517242)
OPatch succeeded.
补丁列表回到 19.3.0.0.190416,说明二进制回退完成。接下来必须启动数据库并执行 datapatch,把字典也回退到 19.3:
/oracle/app/19.3.0/db_1/OPatch/datapatch -verbose
原文的回退章节没有记录这一步和它的输出。这是回退流程中不能省的一步:只回退二进制、不回退字典,会出现二进制版本低于字典版本的状态,后续打补丁或升级可能直接失败。执行后同样要检查日志、编译无效对象,并确认:
select patch_id,action,status,action_time from dba_registry_sqlpatch order by action_time;
最后启动监听、启动数据库,做一次业务连接和关键功能验证。
七、RAC 环境差在哪
本文是单机流程,RAC 不能照抄。主要差异:
- GI Home 可能也要打补丁。如果本次补丁包含 GI 组件,需要先打 GI(
opatch apply -local逐节点,或opatchauto),再打 DB Home;只打 DB Home 会导致版本不匹配。 - 实例要按节点停。打某个节点的 DB Home 时,只停该节点实例,其他节点继续提供服务;全部节点打完后再统一
datapatch。 - datapatch 只需在一个节点执行,但它会处理所有容器;执行前确认所有节点实例都已用新二进制启动。
- 回退要逐节点做,并且要确认 Clusterware 版本与 DB 版本的兼容性,不能只回退其中一个 Home。
RAC 的停机策略、滚动方式和单机完全不同,具体顺序以补丁 README 和 MOS 的 RAC 补丁指南为准。本文的命令可以用于理解单节点上的动作,但不能作为 RAC 的操作手册。
八、风险与检查清单
必须做的前置动作:
- 完整备份(数据库 +
$ORACLE_HOME),并确认可恢复。 - 记录
opatch lspatches和dba_registry_sqlpatch的当前输出。 - 确认
$ORACLE_HOME、/oracle/soft/psu、归档目录、表空间都有足够空间。 - 确认所有 PDB 处于
OPEN,否则 datapatch 会跳过它。 - 确认没有业务连接、没有长事务、没有正在跑的作业。
容易出错的点:
- 只跑
opatch apply不跑datapatch:二进制是新的,字典是旧的。 datapatch前不检查表空间:可能长时间卡住,误以为补丁有问题。- PDB 未打开就执行 datapatch:该 PDB 被跳过,日志里可能只有提示没有报错。
- 回退后不跑
datapatch:二进制与字典版本不一致。 - 用
-force跳过冲突检查:冲突没有解决,只是被掩盖。 - 忘记替换 OPatch:旧版本可能直接拒绝新补丁,或打出不完整的结果。
回退的边界:
OPatch 回退只能撤销二进制补丁,不能撤销补丁期间产生的数据变更,也不能替代备份。如果补丁后已经跑过业务、数据字典被修改,回退的风险会显著上升,必须先在测试环境验证。回退窗口内业务同样不可用,安排时要把 datapatch 和无效对象编译的时间算进去。
待核对
- 原文的 datapatch 日志目录里存在两轮记录(18:54–19:04 与 21:58–22:04),文中引用的是第二轮输出;第一轮为何重跑,原文未说明。
- 原文回退顺序为先 DB(36912597)后 OJVM(36878697),与安装顺序相同;部分补丁 README 要求按安装逆序回退(先 OJVM 后 DB),实际执行前请以该补丁的 README 为准。
- 原文回退章节未记录
datapatch回退字典、编译无效对象和启动验证,本文在“验证回退结果”中补充了这些必要步骤,但未给出对应输出。 - 原文未记录
opatch prereq CheckSystemSpace之外的磁盘空间数值,实际所需空间以补丁 README 为准。 - 原文未说明 OJVM 是否为业务必需;不打 OJVM 时,datapatch 的补丁数量和日志目录会不同。
原文首发于微信公众号「止水研习社」。
文章评论