大家好,这里是公众号 DBA学习之路,分享一些学习国产数据库路上的知识和经验。
目录
前言
OPatch 是什么? 对于 Oracle DBAers 来说,这是常识(囧),但许多不太熟悉 Oracle 数据库的人会经常问我,为什么安装补丁时要上传一个以 p6880880 开头的 zip 文件?它到底有什么作用呢?
为此,我打算写一篇关于 OPatch 的文章科普一下,以后直接发就行!
OPatch
OPatch 是 Oracle 提供的一个命令行工具,用于管理和应用补丁(Patch)到 Oracle 数据库、中间件(如 WebLogic)等 Oracle 产品。它是 Oracle 补丁管理流程的核心工具,帮助用户维护系统的稳定性、安全性和功能更新。
Oracle 数据库初始安装后,在 $ORACLE_HOME
目录下会包含一个 OPatch 文件夹,这个就是 OPatch 管理工具。
OPatch 的主要功能:
- 安装补丁
- 回滚补丁
- 冲突检测
- 显示已安装的组件和补丁信息
通常我们会将 OPatch 目录添加到 PATH 环境变量中,这样就不需要每次进入 $ORACLE_HOME/OPatch
目录来执行命令:
## Windows
set PATH=%ORACLE_HOME%/OPatch:%PATH%
## Unix
export PATH=$ORACLE_HOME/OPatch:$PATH
配置完成后,直接运行命令即可:
[oraprod@rac01:~]$ opatch version OPatch Version: 12.2.0.1.3 OPatch succeeded.
但是,当我们要安装某些补丁时,常会发现默认的 OPatch 版本并不能满足补丁 README 中对 OPatch 版本的要求:
If you do not have OPatch 12c Release 12.2.0.1.43 or the latest version available for 12c Release 12.2.0.1.0,then download it from patch# 6880880 for 12.2.0.1.0 release.
这时我们就需要更新 OPatch 工具。
更新 OPatch
OPatch 工具通常放在 $ORACLE_HOME/OPatch
目录下。
下载 OPatch
从 Oracle 支持网站(MOS)下载 OPatch:https://updates.oracle.com/download/6880880.html
根据数据库版本和操作系统平台选择合适的 OPatch 安装包,下载后的文件名通常为:p6880880_<version>_<platform>.zip
,这就是我们文章开头所说的 p6880880 文件,这个文件实际上就是 OPatch 工具!
这里我整理了 2025.02 最新的 OPatch 包(适用于 Linux 和 Windows)分享给大家:
关注微信公众号:DBA学习之路,回复关键词:
OPatch
即可获取!
备份 OPatch
在更新 OPatch 之前,建议先备份 $ORACLE_HOME
目录下旧版本的 OPatch:
[oraprod@rac01:~]$ cd $ORACLE_HOME
[oraprod@rac01:~]$ mv OPatch OPatch.bkp
更新 OPatch
每个补丁的 README 文件中都有具体的安装说明。我们将下载的 p6880880 安装包解压到 $ORACLE_HOME
目录下:
unzip /soft/p6880880_<version>_<platform>.zip opatch version
那么,如何知道需要安装哪个版本的 OPatch?
其实很简单:根据你当前的数据库版本安装最新的 OPatch 就行!例如,如果你现在使用的是 19C 版本,且需要安装 19.25 的 RU 补丁,README 中提示需要更新 OPatch,那就直接下载最新版本的 OPatch 进行更新。
OPatch 发布的周期和 PSU/RU 补丁发布的周期基本一致。
OPatch 常用命令
我们可以通过 opatch -help
命令查看 OPatch 命令的所有可用选项:
[oraprod@rac01:~]$ opatch -help
Oracle Interim Patch Installer version 12.2.0.1.45
Copyright (c) 2025, Oracle Corporation. All rights reserved.
Usage: opatch [ -help ] [ -report ] [ command ]
command := apply
compare
lsinventory
lspatches
napply
nrollback
rollback
query
version
prereq
util
<global_arguments> := -help Displays the help message for the command.
-report Print the actions without executing.
example:
'opatch -help'
'opatch -help -fmw'
'opatch apply -help'
'opatch compare -help'
'opatch lsinventory -help'
'opatch lspatches -help'
'opatch napply -help'
'opatch nrollback -help'
'opatch rollback -help'
'opatch prereq -help'
'opatch util -help'
OPatch succeeded.
这里我列举一些日常使用中比较常用的命令:
## 查看 opatch 版本
opatch version
## 查看已安装补丁
opatch lspatches
## 查看已安装补丁明细
opatch lsinventory
opatch lsinventory -all
## 当前的补丁历史会自动包含在 Oracle Central Inventory 中,可以通过命令 "opatch lsinventory -detail" 来查看
opatch lsinventory -detail -oh $ORACLE_HOME
## 安装补丁前检查
opatch prereq CheckConflictAgainstOHWithDetail -ph ./
opatch prereq CheckConflictAgainstOHWithDetail -phBaseDir <补丁解压目录>
## 安装补丁
opatch apply
## 静默安装补丁,使用 OPatch 参数 -silent 以非交互模式运行,不需要输入 Y/N
opatch apply -silent
## 回退补丁
opatch rollback -id <补丁编号>
OPatch 常见问题
1、运行 OPatch 工具的前提条件是什么?
- OPatch 在安装补丁过程中会执行 relink 操作,因此必须确保链接命令,如
ld
、make
、ar
等能够正常工作。 - 检查 JDK/JRE 是否在 ORACLE_HOME 中正确安装,OPatch 使用 JDK 中的 jar 工具来执行其 jar、war 和 ear 操作。OPatch 将在指定的 Oracle Home 中查找 JDK。如果默认的 Oracle Home 中的 JDK 损坏,用户必须使用 OPatch 中的 -jre 选项提供备用位置。
- 检查 /tmp 目录和 $ORACLE_HOME 是否有足够的可用空间。当 OPatch 处理补丁安装脚本时,它会同时生成回滚脚本,并保存每个在补丁过程中编辑或删除的文件副本。OPatch 还会备份 inventory 信息。因此,Oracle 建议您有足够的系统空间来容纳补丁和备份信息。
- 检查 Oracle Universal Installer 和 OPatch 版本的兼容性。例如:OPatch 10.2 需要 Oracle Universal Installer 10.2 或更高版本才能正常工作。如果 Oracle Universal Installer 版本低于 OPatch 所需版本,则 OPatch 会报错。
2、如何确认补丁是否已正确安装?
- 每个补丁附带的 README 文件包含了具体补丁的安装说明。通常,这些说明要求以 Oracle 账户身份,从解压缩后的补丁子目录中运行 “opatch apply” 命令。opatch 工具将补丁安装到指定并设置为 $ORACLE_HOME 的 Oracle Home。
- 要验证补丁是否已成功安装,可以使用命令
opatch inventory
检查 ,确认补丁是否已成功注册。如果补丁已在 inventory 中注册,命令结果将列出补丁号码。检查 OPatch 日志文件,查看是否有错误。如果没有发现问题,则说明补丁已成功安装。
3、如何在不关闭数据库实例的情况下在线安装补丁?什么是在线补丁?
- 常规的 RDBMS 补丁由一个或多个对象文件(.o 文件)、库文件(.a 文件)组成。安装常规补丁需要关闭 RDBMS 实例、重新链接 Oracle 二进制文件并重新启动实例;卸载常规补丁也需要执行相同的步骤。
- 在线补丁是一种特殊类型的补丁,可以安装在正在运行的 RDBMS 实例。在线补丁包含一个单独的共享库;安装在线补丁不需要关闭实例或重新链接 Oracle 二进制文件。可以使用 OPatch 安装/卸载在线补丁(OPatch 使用 oradebug 命令来安装/卸载补丁)。目前,在线补丁仅支持 RDBMS,即 Oracle 二进制文件。
4、如何在静默模式下运行 OPatch?
我们可以使用 OPatch 参数 -silent
以非交互模式运行 opatch apply、napply、rollback 和 nrollback
命令。
opatch <option> -silent
执行以下操作:
- 不会有任何用户交互,即不会显示任何 OPatch 提示以要求用户输入的内容。
- 自动通过采用默认选项作为输入回答所有 OPatch 提示并继续执行。
5、$ORACLE_HOME/.patch_storage
目录的作用是什么?如果不小心被删除了怎么办?
- 当向 Oracle Home 安装临时补丁时,OPatch 会将补丁信息存储在
$ORACLE_HOME/.patch_storage
目录中。 - 在此目录内,会为每个安装到 Oracle Home 的补丁创建单独的子目录。在安装过程中,可能会遇到补丁冲突,并希望移除冲突的补丁,这个过程被称为补丁回滚。
- 在安装补丁期间,OPatch 会在加载新版本之前,将所有被新补丁替换的文件的副本保存下来,并存储在
$ORACLE_HOME/.patch_storage/patch ID/
目录中。这些保存的文件称为回滚文件,它们是实现补丁回滚的关键。 - 每次安装补丁时,都会对 inventory 进行更改。有时,这些更改可能会导致 inventory 损坏。
- 从 Oracle RDBMS 10.2.0.X.X 开始,当安装补丁时,OPatch 会创建 inventory 的快照,并将其存储在 $ORACLE_HOME/.patch_storage/<patch-id_timestamp> 中。
$ORACLE_HOME/.patch_storage/<patch-id_timestamp>/restore.sh
脚本随 OPatch 一起提供,用于移除安装补丁后对 inventory 所做的任何更改。
因此,如果 $ORACLE_HOME/.patch_storage
被不小心删除,您需要从备份中恢复它,或者重新安装 Oracle Home。
6、如果 OPatch 在安装补丁过程中中断了,接下来会怎么处理?
- Opatch 的编写方式使得命令具有幂等性,运行一次与运行多次效果相同。所以,当补丁安装发生中断时,可以重新执行。
- 目前无法删除部分安装的临时补丁,补丁过程必须完成。补丁过程完成后,可以使用回滚删除补丁。
- 如果由于某个问题(例如找不到库文件且未应用到其中一个目标文件)而中止此过程,则可以在库文件可用后重新启动补丁安装程序,但只会安装最后剩余的目标文件。
- 其他导致补丁安装中止的异常情况包括由于补丁损坏导致的
make
失败,或在使用ld
创建新可执行文件时设备空间不足等问题。
所有这些情况都可以重新执行。
7、运行 OPatch 时遇到错误,提示 fuser 不可用,应该怎么办?
- 运行 OPatch 时,它会检查是否有 Oracle 进程正在运行。如果有,它会在补丁安装开始之前警告用户。这个检查是通过
fuser
命令完成的,在大多数操作系统中,fuser 命令位于/sbin
或/usr/sbin
目录下,通常这些目录没有包含在用户的 PATH 变量中。
解决方法是将 /sbin:/usr/sbin
添加到 PATH 变量中。
8、当在RAC(Real Application Clusters)中安装补丁时,是否可以以Rolling方式安装?如果可以,应该如安装?
对于 RAC(Real Application Clusters),补丁安装有两种方式:
- 第一种方式是,如果补丁被标记为可滚动(Rolling)升级,即在
<patch>/etc/config/inventory
的 <online_rac_installable>false</online_rac_installable> 中标记为 true。- 此类补丁可以以级联方式安装于各节点,允许不同实例运行不同版本的代码(补丁会引入代码差异)。这种情况适用于不会影响 SGA 结构和堆的特定补丁。
- 这种方式的一个优势是可以先在某个节点上测试补丁,在确认没有引发应用程序意外行为后再推广到其他节点。
- 如果补丁在测试节点上导致了问题,还可以从该节点回滚。目前只有一部分补丁会被标记为可滚动升级。
- 第二种方式是使用 minimize_downtime 选项来安装补丁。
写在最后
关于 OPatch 管理工具就先介绍这么多了,够用!