Focus On Oracle

Installing, Backup & Recovery, Performance Tuning,
Troubleshooting, Upgrading, Patching

Oracle Engineered System


当前位置: 首页 » 技术文章 » Oracle

How to Apply Oracle Database Patch?

在Oracle Database中,主要有两大类patch:
A. 可以通过opatch去应用的补丁(iterim patch/one-off patch,CPU,SPU,PSU等),适用于小版本中补丁的应用,数据库的版本不会发生变化
B. 通过runInstaller的方式去安装补丁,一般用于大版本的升级,数据库的版本会发生变化

在Oracle EBS 12.2之前用adpatch去应用Middle Tier的补丁,12.2开始可以使用adop
在Exadata中可以使用patchmgr应用Cell Node、IB Switch的Patch,数据库可以使用dbnodeupdate.sh

Opatch的用途
    Applying the patch(应用补丁)    
    Rollback the patch(回滚补丁)
    Conflict check(补丁冲突检查)
    Report the installed components and patches(查看安装的补丁和组件)

下载OPatch
Opatch的patch号是固定的6880880,在12c还可以通过OPatch Automation Tool(opatchauto)
https://updates.oracle.com/download/<patch number>.html
https://updates.oracle.com/download/6880880.html

OPatch帮助
如果没有把OPatch加入环境变量,可以使用$ORACLE_HOME/OPatch/opatch
export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$PATH
[oracle@ohs1 ~]$ opatch -help
Oracle Interim Patch Installer version 12.1.0.1.3 #注意这里是Interim
Copyright (c) 2016, 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.
[oracle@ohs1 ~]$ 
-help    
提供opatch的帮助信息
version

用于查询某个ORACLE_HOME下opatch的版本

lsinventory
列出某一个$ORACLE_HOME下所有安装的组件和补丁

apply    
在当前目录下应用interim patch补丁,也可指定目录,加上参数patch_location
napply
用于一次应用一系列补丁,可以使用-silent
rollback
用于回滚指定的补丁
$ORACLE_HOME/OPatch/opatch rollback -id 7319922 -invPtrLoc $ORACLE_HOME/oraInst.loc
nrollback
用于一次回滚一系列补丁,可以使用-silent
prereq
用于事前检查,比如检查patch冲突

inventory.xml文件
[oracle@ohs1 121]$ cd $ORACLE_HOME
[oracle@ohs1 121]$ cat oraInst.loc
inventory_loc=/pgold/oraInventory
inst_group=oinstall
[oracle@ohs1 121]$ cd /pgold/oraInventory/ContentsXML/
[oracle@ohs1 ContentsXML]$ ls -l
total 12
-rw-rw----. 1 orgrid oinstall  329 Dec  3 06:12 comps.xml
-rw-rw----. 1 orgrid oinstall 1101 Dec  3 06:12 inventory.xml
-rw-rw----. 1 orgrid oinstall  292 Dec  3 06:12 libs.xml
[oracle@ohs1 ContentsXML]$ cat inventory.xml
<?xml version="1.0" standalone="yes" ?>
<!-- Copyright (c) 1999, 2014, Oracle and/or its affiliates.
All rights reserved. -->
<!-- Do not modify the contents of this file by hand. -->
<INVENTORY>
<VERSION_INFO>
   <SAVED_WITH>12.1.0.2.0</SAVED_WITH>
   <MINIMUM_VER>2.1.0.6.0</MINIMUM_VER>
</VERSION_INFO>
<HOME_LIST>
<HOME NAME="Ora11g_gridinfrahome1" LOC="/pgold/orgrid/oracle/product/112" TYPE="O" IDX="1">
   <NODE_LIST>
      <NODE NAME="ohs1"/>
      <NODE NAME="ohs2"/>
   </NODE_LIST>
</HOME>
<HOME NAME="OraDb11g_home1" LOC="/pgold/ordb/oracle/product/112" TYPE="O" IDX="2">
   <NODE_LIST>
      <NODE NAME="ohs1"/>
      <NODE NAME="ohs2"/>
   </NODE_LIST>
</HOME>
<HOME NAME="OraGI12Home1" LOC="/pgold/orgrid/oracle/product/121" TYPE="O" IDX="3" CRS="true">
   <NODE_LIST>
      <NODE NAME="ohs1"/>
      <NODE NAME="ohs2"/>
   </NODE_LIST>
</HOME>
<HOME NAME="OraDB12Home1" LOC="/pgold/ordb/oracle/product/121" TYPE="O" IDX="4">
   <NODE_LIST>
      <NODE NAME="ohs1"/>
      <NODE NAME="ohs2"/>
   </NODE_LIST>
</HOME>
</HOME_LIST>
<COMPOSITEHOME_LIST>
</COMPOSITEHOME_LIST>
</INVENTORY>
[oracle@ohs1 ContentsXML]$ 
这个文件很重要,如果文件内容有误或格式错误,Opatch查看或应用补丁时会出错,比如OPatch failed with error code 73

查看Patch冲突
$ORACLE_HOME/OPatch/opatch prereq -h
       CheckConflictAgainstOH
              Check if there are any conflicts between the patch(es)
              to be applied and the patch(es) in the OH.

       CheckConflictAgainstOHWithDetail
              Check if there are any conflicts between the patch(es)
              to be applied and the patch(es) in the OH, by giving
              out the detailed information about the
              conflicts/supersets.

       CheckConflictAmongPatches
              Check if there are any conflicts among the patch(es)
              to be applied.

       CheckConflictAmongPatchesWithDetail
              Check if there are any conflicts among the patch(es)
              to be applied, by giving out the detailed information
              about the conflicts/supersets.            
下面的命令用于检测要应用的补丁中有没有冲突的
opatch prereq CheckConflictAmongPatchesWithDetail -phBaseDir <path to base dir where all the patches to be applied are kept>


下面的命令可用于检测,要应用的补丁和现在ORACLE_HOME中的补丁有没有冲突

opatch prereq CheckConflictAgainstOHWithDetail -phBaseDir <path to base dir where all the patches to be applied are kept>
$ORACLE_HOME/OPatch/opatch prereq -invPtrLoc $ORACLE_HOME/oraInst.loc CheckConflictAgainstOHWithDetail -phBaseDir /patches/13923804


通过opatch apply -report查看

我们还可以使用opatch apply -report来模拟Patch应用,可以发现潜在的问题(比如Patch冲突)。这个命令不会真正地应用patch,也不需要停止数据库和监听。


Patch的应用
根据是否可以宕机,又可以分为Online Patch(在无需关闭数据库、监听的情况下直接应用,Aka hot patch)和Offline Patch(必须关闭监听、数据库等)。

Patch应用流程及注意事项
 A.Pre-requisites
   仔细查看readme,然后做以下的事情
   检查opatch的版本(一般需要下载最新的opatch版本)
   检查Perl的版本
   检查前置条件(数据库的版本,Patch的前置条件是否满足)
   检查补丁是否冲突(如果冲突,最好提交SR)
   查看Known Issue
   准备应用patch的操作手册(Pre-steps,applying patch,post steps),包括回退方案
 B.Apply Patch
   根据实际情况,比如是否有宕机时间,选择在线应用或离线应用
   如果是RAC + DG,要现在备库上应用
   不管怎样,一定要做测试库上应用
 C.Post steps
   如果测试,仍有问题,提交/更新SR(Service Request)
   如果没有问题,安排时间在生产库上应用
   如果应用的是Online Patch,在下次宕机时,回滚online patch,用正常方式(Offline mode)应用Patch 
应用Offline Patch
$ cd /patches/7319922
$ opatch apply --如果是RAC,会把所有节点都应用
$ opatch apply --local,只在当前节点应用,一般用这个的会多点

回滚Offline Patch

$ORACLE_HOME/OPatch/opatch rollback -id 7319922 -invPtrLoc $ORACLE_HOME/oraInst.loc 
应用Online Patch
适应于OPatch版本11.1.0.6以上 -connectString格式为"SID:User:Passwd:Node"
opatch apply online -connectString <SID>:<USERNAME>:<PASSWORD>:<NODE> --单实例
opatch apply online -connectString <SID>:<USERNAME>:<PASSWORD>:<NODE1>,<SID2>:<USERNAME>:<PASSWORD>:<NODE2> --RAC环境
回滚Online Patch
适应于OPatch版本11.1.0.6以上
opatch rollback -id 10188727 -connectString db12c:sys:oracle -invPtrLoc /pgold/ordb/oracle/product/121/oraInst.loc --单实例
opatch rollback -id <patchID> -connectString <SID1>:<USERNAME>:<PASSWORD>:<NODE1>,<SID2>:<USERNAME>:<PASSWORD>:<NODE2> --RAC环境
通过下面的方法也可以,但不推荐使用
    1. Using "oradebug" to disable the patch
    SQL> oradebug patch disable <patch_id>.pch

    2. Shutting the instance down and removing the orapatch*.cfg file. After stopping the instance do the following:
    cd $ORACLE_HOME/hpatch
    rm orapatch$ORACLE_SID.cfg
Online Patch的最佳实践
A. 在下次实例关闭的时候,强烈建议你回滚所有的在线patch,使用正常的方式去(Offline mode)打补丁
B. Online Patch应当只用于紧急时候,比如在某一时候不能宕机,切情况危急
C. 一次只在一个实例上应用
D. 回滚时,确认所有的实例都包含在内
E. 永远不要移除$ORACLE_HOME/hpatch
注意:Online Patch需要额外的内容,算法为
Unix : memory overhead = ( # of processes +1) x size of ( .pch file)
          processes的值可以从v$parameter获得
Windows: memory overhead = size of ( .pch file)

如何查看某一个patch是否可以在线安装
A. 通过patch的目录,一般来说,在线补丁,会包含online的文件夹。
$ cd <PATCH_TOP>/10188727
$ ls
etc/ files/ online/ README.txt
$ tree online
online
|-- [embde 4096] etc
| |-- [embde 4096] config
| | |-- [embde 290] actions.xml
| | |-- [embde 22] deploy.xml
| | `-- [embde 1326] inventory.xml
| `-- [embde 4096] xml
| |-- [embde 5376] GenericActions.xml
| `-- [embde 1663] ShiphomeDirectoryStructure.xml
`-- [embde 4096] files
`-- [embde 4096] hpatch
`-- [embde 177874] bug10188727.pch
B.通过opatch命令
$ cd <PATCH_TOP>/10188727
$ opatch query -all online/opatch query -is_online_patch 10188727
C.通过readme.txt readme.html文件查看

静默方式安装

我们可以在非交互模式下执行下面的命令,只需在后面加上-silent
opatch <option> -silent
Option :
    apply
    napply
    rollback
    nrollback
常用的命令
$ORACLE_HOME/OPatch/opatch lsinventory -invPtrLoc $ORACLE_HOME/oraInst.loc

$ORACLE_HOME/OPatch/opatch lsinventory -detail -invPtrLoc $ORACLE_HOME/oraInst.loc | egrep 'Oracle Application Server 10g|Patch of Oracle Application Server 10g'

opatch lsinventory -bugs_fixed -invptrloc $ORACLE_HOME/oraInst.loc | egrep -i 'PSU|PATCH SET UPDATE'

$ORACLE_HOME/OPatch/opatch prereq -invPtrLoc $ORACLE_HOME/oraInst.loc CheckConflictAgainstOHWithDetail -phBaseDir /patches/13923804

$ORACLE_HOME/OPatch/opatch napply -skip_subset -skip_duplicate -invPtrLoc $ORACLE_HOME/oraInst.loc

$ORACLE_HOME/OPatch/opatch rollback -id 7319922 -invPtrLoc $ORACLE_HOME/oraInst.loc 

常用的Note
Quick Reference to Patch Numbers for Database/GI PSU, SPU(CPU), Bundle Patches and Patchsets (Doc ID 1454618.1)
Oracle Recommended Patches -- Oracle Database (Doc ID 756671.1)

Master Note For OPatch (Doc ID 293369.1)


Reference

http://docs.oracle.com/database/122/TDPRC/managing-oracle-software-and-applying-patches.htm

http://docs.oracle.com/database/122/LADBI/downloading-and-installing-patch-updates.htm

http://docs.oracle.com/cd/E11882_01/em.112/e12255/oui7_opatch.htm#CEGCJGJD



关键词:oracle patch 

相关文章

基于PDB的Active Data Guard(Oracle 21.7+)
在Oracle数据库中使用REST
OGG from MySQL to Oracle
Oracle数据库容灾之两地三中心实践
低代码开发用Oracle Apex,看这篇就够了
Oracle Database 20c之SQL宏
Java beginner for Oracle DBA
Oracle Database 20c之区块链表
Oracle Database 20c的一些微妙变化
关于Oracle的Sequence,你需要知道的
Oracle数据库优化方面资料
Oracle Database 19c在优化方面有哪些新特性
Top