暂无图片
暂无图片
12
暂无图片
暂无图片
暂无图片

一文掌握 Oracle OPatch 实用技巧

原创 Lucifer三思而后行 2025-02-13
704

大家好,这里是公众号 DBA学习之路,分享一些学习国产数据库路上的知识和经验。

目录

前言

OPatch 是什么? 对于 Oracle DBAers 来说,这是常识(),但许多不太熟悉 Oracle 数据库的人会经常问我,为什么安装补丁时要上传一个以 p6880880 开头的 zip 文件?它到底有什么作用呢?

为此,我打算写一篇关于 OPatch 的文章科普一下,以后直接发就行!

OPatch

OPatch 是 Oracle 提供的一个命令行工具,用于管理和应用补丁(Patch)到 Oracle 数据库、中间件(如 WebLogic)等 Oracle 产品。它是 Oracle 补丁管理流程的核心工具,帮助用户维护系统的稳定性、安全性和功能更新。

Oracle 数据库初始安装后,在 $ORACLE_HOME 目录下会包含一个 OPatch 文件夹,这个就是 OPatch 管理工具。

OPatch 的主要功能

  1. 安装补丁
  2. 回滚补丁
  3. 冲突检测
  4. 显示已安装的组件和补丁信息

通常我们会将 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 操作,因此必须确保链接命令,如 ldmakear 等能够正常工作。
  • 检查 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 管理工具就先介绍这么多了,够用!

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
1人已赞赏
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论