1 说明
Oracle的PSU(Patch Set Update)补丁是Oracle公司为了其数据库产品定期发布的更新包,通常每季度发布一次。PSU包含了该季度内收集的一系列安全更新(CPU:Critical Patch Update)以及一些重要的错误修复。PSU旨在提供一个简单的方法来应用一系列已经被验证过的、重要的更新,从而减少单独安装多个补丁所带来的复杂性和潜在风险。
此次打的补丁集是201020,步骤大致如下:
- 备份 ORACLE_HOME
- 更新OPatch
- 冲突检查
- 应用GI PSU
- 应用DB PSU
- 应用OJVM PSU
- SQL文件加载
2 准备阶段
2.1 收集环境信息
参数 | 参数值 |
---|---|
数据库版本 | 11.2.0.4.0 - 64bit |
GI home | /u01/app/11.2.0/grid |
DB home | /u01/app/oracle/product/11.2/db_1 |
One-off Patch | 无 |
PSU | 无 |
2.2 PSU补丁下载
从MOS上下载所需的PSU补丁文件。
一、登录MOS网站 My Oracle Support
二、查找文档 Oracle Support Document 2118136.2
三、选择下载类型
四、版本号
五、下载最新的PSU补丁
可以看到,11gR2最新的补丁于2020年10月发布的,可以将数据库升级到11.2.0.4.201020
版本,后续已经没有更新。
2.3 备份数据库
打PSU补丁之前最好备份一下GI home和DB home。防止打补丁失败,没有备份的话,就需要重建集群了。
一、备份DB home
$ cd /u01/app/oracle/product/11.2
$ tar -pcvf oracle_home_bkup.tar db_1
恢复操作(参考 Note 565017.1):
$ cd /u01/app/oracle/product/11.2
$ mv db_1 db_1_bkup
$ tar -pxvf oracle_home_bkup.tar
二、备份GI home
$ cd /u01/app/11.2.0
$ tar -pcvf gi_home_bkup.tar grid
恢复参考db home。
2.4 熟悉升级步骤
打补丁前,应该先看一遍补丁包里的README.html文件,熟悉操作过程和步骤。
3 更新OPatch
OPatch工具是一个补丁的应用程序,主要用于安装、移除或回滚补丁包。
3.1 下载
当前PSU补丁要求OPatch版本在11.2.0.3.23或更高才能被应用。当前版本不满足要求:
在MOS中下载最新版本的OPatch工具:Patch 6880880
3.2 GI更新OPatch
在集群的每个节点上,滚动进行以下操作,完成GI更新OPatch。
一、移除$ORACLE_HOME/OPatch
root用户执行,也相当于做了备份。
[root@r11gn1 patchs]# cd /u01/app/11.2.0/grid/
[root@r11gn1 grid]# mv OPatch OPatch.240911.bak
[root@r11gn1 grid]# ll | grep OPatch
drwxr-xr-x 8 grid oinstall 4096 Apr 3 00:33 OPatch.240911.bak
二、解压缩并赋权
[root@r11gn1 patchs]# unzip -q p6880880_112000_Linux-x86-64.zip -d /u01/app/11.2.0/grid/
[root@r11gn1 patchs]# cd /u01/app/11.2.0/grid
[root@r11gn1 grid]# chown -R grid:oinstall OPatch
三、版本检查
3.3 DB更新OPatch
与刚刚的操作类似,在集群的每个节点上,滚动进行以下操作,完成DB更新OPatch。
一、移除$ORACLE_HOME/OPatch
root用户执行,也相当于做了备份。
[root@r11gn1 grid]# su - oracle
[oracle@r11gn1 ~]$ cd $ORACLE_HOME
[oracle@r11gn1 db_1]$ mv OPatch OPatch.240911.bak
二、解压缩并赋权
[root@r11gn1 patchs]# unzip -q p6880880_112000_Linux-x86-64.zip -d /u01/app/oracle/product/11.2/db_1/
[root@r11gn1 patchs]# cd /u01/app/oracle/product/11.2/db_1/
[root@r11gn1 db_1]# chown -R oracle:oinstall OPatch
三、版本检查
4 检查Inventory信息
在开始补丁应用程序之前,检查GI和DB的Inventory信息的一致性。
一、GI检查Inventory信息
[root@r11gn1 db_1]# su - grid
[grid@r11gn1 ~]$ $ORACLE_HOME/OPatch/opatch lsinventory -detail -oh $ORACLE_HOME
二、DB检查Inventory信息
[root@r11gn1 db_1]# su - oracle
[oracle@r11gn1 ~]$ $ORACLE_HOME/OPatch/opatch lsinventory -detail -oh $ORACLE_HOME
如果成功,会列出安装在主目录下的Oracle组件。可以将输出结果保存下来,做应用补丁之前的状态的留存。
5 应用补丁
以下操作,每个节点不要并行执行,采用轮询的方式执行。
5.1 解压缩补丁包
官方建议,解压缩的目录必须为空,不能为/tmp,具有oinstall组的读权限。使用grid用户unzip解压:
[grid@r11gn1 ~]$ cd /u01/app/patchs
[grid@r11gn1 patchs]$ ls
lost+found p31718723_112040_Linux-x86-64(GI).zip p6880880_112000_Linux-x86-64.zip
[grid@r11gn1 patchs]$ unzip -q p31718723_112040_Linux-x86-64\(GI\).zip
5.2 停止EM Agent进程
在打补丁前和回滚补丁前停止EM Agent进程。oracle用户执行:
$ $ORACLE_HOME/bin/emctl stop dbconsolename.
5.3 一次性补丁冲突检测
检查要安装的补丁和已经安装的一次性补丁是否存在冲突。
[grid@r11gn2 patchs]$ /u01/app/11.2.0/grid/OPatch/opatch prereq CheckConflictAgainstOHWithDetail -phBaseDir /u01/app/patchs/31718723/
Oracle Interim Patch Installer version 11.2.0.3.47
Copyright (c) 2024, Oracle Corporation. All rights reserved.
PREREQ session
Oracle Home : /u01/app/11.2.0/grid
Central Inventory : /u01/app/oraInventory
from : /u01/app/11.2.0/grid/oraInst.loc
OPatch version : 11.2.0.3.47
OUI version : 11.2.0.4.0
Log file location : /u01/app/11.2.0/grid/cfgtoollogs/opatch/opatch2024-09-11_01-59-15AM_1.log
Invoking prereq "checkconflictagainstohwithdetail"
Prereq "checkConflictAgainstOHWithDetail" passed.
OPatch succeeded.
5.4 打GI补丁
在其中一个节点,用root用户执行下列命令,使用GI home的OPatch:
[root@r11gn1 ~]# /u01/app/11.2.0/grid/OPatch/opatch auto /u01/app/patchs/31718723 -oh /u01/app/11.2.0/grid
5.5 检查GI补丁应用情况
节点1的GI补丁已经打上。其他节点重复5.1 - 5.5操作。
5.6 打DB补丁
用root用户轮询执行此命令,使用DB home的OPatch:
[root@r11gn1 ~]# /u01/app/oracle/product/11.2/db_1/OPatch/opatch auto /u01/app/patchs/31718723 -oh /u01/app/oracle/product/11.2/db_1
5.7 检查DB补丁应用情况
成功应用,其他节点滚动执行5.6和5.7操作打DB补丁。
6 打OJVM PSU
6.1 说明
在2014年10月之前,OJVM包含在PSU里面,用于防止9.2.0.8以后任何数据库版本中的Oracle JavaVM漏洞。在2014年10月后,独立出去,需要各自打补丁,依赖于同版本的DB PSU。如果只装了PSU,漏洞扫描就会出现警告。
6.2 下载
下载响应版本的OJVM PSU。
6.3 上传解压并赋权
[root@r11gn2 patchs]# unzip -q p31668908_112040_Linux-x86-64\(OJVM\).zip
[root@r11gn2 patchs]# chown -R oracle:oinstall 31668908
6.4 冲突检查
[oracle@r11gn2 ~]$ $ORACLE_HOME/OPatch/opatch prereq CheckConflictAgainstOHWithDetail -ph /u01/app/patchs/31668908
Oracle Interim Patch Installer version 11.2.0.3.47
Copyright (c) 2024, Oracle Corporation. All rights reserved.
PREREQ session
Oracle Home : /u01/app/oracle/product/11.2/db_1
Central Inventory : /u01/app/oraInventory
from : /u01/app/oracle/product/11.2/db_1/oraInst.loc
OPatch version : 11.2.0.3.47
OUI version : 11.2.0.4.0
Log file location : /u01/app/oracle/product/11.2/db_1/cfgtoollogs/opatch/opatch2024-09-11_09-16-38AM_1.log
Invoking prereq "checkconflictagainstohwithdetail"
Prereq "checkConflictAgainstOHWithDetail" passed.
OPatch succeeded.
6.5 应用OJVM补丁
2017以后的OJVM PSU包含以下情况,可以滚动升级:
6.5.1 停库和服务
关闭当前节点的实例和服务,rong用户执行停当前节点crs:
[root@r11gn1 patchs]# /u01/app/11.2.0/grid/bin/crsctl stop crs
6.5.2 应用
oracle用户执行,输入2次“y”:
[root@r11gn1 ~]# su - oracle
[oracle@r11gn1 ~]$ $ORACLE_HOME/OPatch/opatch apply /u01/app/patchs/31668908
6.5.3 检查补丁
[oracle@r11gn1 ~]$ $ORACLE_HOME/OPatch/opatch lspatches | grep 31668908
31668908;OJVM PATCH SET UPDATE 11.2.0.4.201020
6.5.4 启动集群
[root@r11gn1 ~]# /u01/app/11.2.0/grid/bin/crsctl start crs
检查服务状态:
其他节点重复以上操作。
7 SQL文件加载
一、以下步骤将修改后的SQL文件加载到数据库中。在Oracle RAC环境中,仅在一个节点上执行这些步骤就行。
cd $ORACLE_HOME/rdbms/admin
sqlplus /nolog
SQL> CONNECT / AS SYSDBA
SQL> @catbundle.sql psu apply
SQL> QUIT
二、关闭所有实例后(如果其他实例未关闭,则STARTUP UPGRADE不成功),在其中一个节点用oracle用户执行:
$ srvctl stop instance -d rac
$ cd $ORACLE_HOME/sqlpatch/31668908
sqlplus /nolog
SQL> CONNECT / AS SYSDBA
SQL> STARTUP
SQL> alter system set cluster_database=false scope=spfile;
SQL> SHUTDOWN
SQL> STARTUP UPGRADE
SQL> @postinstall.sql
SQL> alter system set cluster_database=true scope=spfile;
SQL> SHUTDOWN
SQL> STARTUP
三、在安装补丁的SQL部分之后,一些包可能会变为INVALID。这将在访问时重新编译,或者您可以运行utlrp。sql将它们恢复到VALID状态。oracle用户执行:
$ cd $ORACLE_HOME/rdbms/admin
$ sqlplus /nolog
SQL> CONNECT / AS SYSDBA
SQL> @utlrp.sql
将其他实例启动,至此所有补丁已经应用完成。
8 检查补丁版本
所有节点都检查,确保一致。
OPatch查看:
视图查看:
SQL>
col ACTION_TIME for a40
col comments for a40
select ACTION_TIME,version,COMMENTS from registry$history;
9 总结
打PSU过程是比较多的,比较容易出现错误,需要比较细心。必须要做好相应的备份(ORACLE_HOME),打补丁失败后,可以恢复ORACLE_HOME,不至于要重建集群。采用滚动升级,确保就算出现问题,也有节点可以用。