一、准备工作
1、确认数据库版本
使用sys用户登录数据库,查询数据库的当前版本信息:
2、查询补丁安装信息
SQL> select * from dba_registry_history;
没有任何记录一般是未安装补丁,也可以在环境设置以后用opatch lsinventory opatch 命令查询当前补丁安装情况。
3、查询数据库失效对象,并作相关记录
SQL> SELECT sum(OBJECT_NAME)N1 FROM DBA_OBJECTS WHERE STATUS= 'INVALID';
如果存在失效对象最好先编译一遍 :
SQL>@?/rdbms/admin/utlrp.sql
编译完成后,再次查询,以便确认最终失效对象;
4、补丁类型
相关概念:
Oracle数据库补丁一般分为两种CPU和PSU补丁。
Oracle PSU的全称是Patch Set Update,oracle对于其产品每个季度发行一次的补丁包,包含了bug的修复。Oracle选取被用户下载数量多,且被验证过具有较低风险的补丁放入到每个季度的PSU中。在每个PSU中不但包含Bug的修复而且还包含了最新的CPU。PSU通常随CPU一起发布。PSU通常是增量的,大部分PSU可以直接安装,但有些PSU则必须要求安装了上一 个版本的PSU之后才能继续安装,要仔细看各个PSU的Readme文档。
Oracle CPU的全称是Critical Patch Update, Oracle对于其产品每个季度发行一次安全补丁包,通常是为了修复产品中的安全隐患。CPU是累积的(Cumulative),即最新的CPU补丁已经包含以往的CPU补丁,所以只要安装最新的CPU补丁即可。
安全漏洞整改时我们要安装的是CPU补丁。
注意:
CPU,是Critical Patch Update的缩写,意为紧急补丁更新。每季度发布一次,是用来修复安全方面的一些补丁,是累积型的。自2012年10月已经更名为Security Patch Update (SPU)
PSU,是Patch Set Update的缩写,意为补丁集更新。Oracle 选取在每个季度用户下载数量最多,并且得到验证具有较低风险的补丁放入到每个季度的PSU中,修复比较严重的一些问题,包含每个季度的CPU,是累积型的。
Interim Patch/One-Off Patch,是我们常说的小补丁,为了修复某(几)个Bug而发布的补丁。这种补丁推荐在测试库上测试无误后再安装在生产库上。
以上三类补丁,除PSU外,安装时要使用OPatch来安装补丁。而PSU则可以直接安装。BP在Windows平台上的Oracle没有小补丁,只有称为Bundle Patch的补丁集。 这种累积型的补丁集会周期性的发布(至少每季度一次),也就是每个Bundle Patch会包含之前所有的Bundle Patch。比如Windows Bundle Patch 16,它会包含之前所有15个Bundle Patch,所以我们总是推荐安装最新的Bundle Patch。Oracle的集群软件和数据库软件的Window Bundle Patch是同一个,比如Windows Bundle Patch 16(补丁号16167942,既可以打在集群上,也可以打在数据库上) 。
注:命名规则变化
熟悉Oracle Database PSU、Bundle Patch的DBA一定知道,一般来讲,这些patch的命名规则一般是按照推出的先后顺序,比如在2015年10月推出的对11.2.0.4 的第8个DB PSU就命名为:DB PSU 11.2.0.4.8。 从2016年1月份推出对PSU、SPU、Bundle Patch新的命名规则。
新的命名规则为(以11.2.0.4为例):
11.2.0.4.YYMMDD
此处的YYMMDD为主要patch (PSU、SPU、Bundle)release的具体日期的年份后两位加上两位的月份以及两位的日期。
比如对11.2.0.4推出的第9个 DB PSU (本来应该命名为: 11.2.0.4.9),在新的命名规则下,这个patch被命名为:
11.2.0.4.160119 这也表示这11.2.0.4的PSU 是在16年1月19日推出的patch。
从2017年7月开始,Oracle 对数据库和GI(Grid Infrastructure) 12.2及之后版本的主动修补程序进行了更改。传统的“Patchset Update”和“Database Proactive Bundle Patch”对于12.2数据库将不再发布。将采用新的发布方式RU (Release Updates)和RUR(Release Update Revisions)。更改只适用于数据库和GI(Grid Infrastructure) 12.2及之后版本。数据库12.1和11.2版本仍然使用传统的PSU/BP 流程以及版本编号系统。
RU是主动,高度测试,捆绑了许多重要修复,能够使客户避免许多已知问题。
RUR包含对RU的安全性和回退修复,将RU的生命周期延长两个季度。每个RUR只针对特定的RU。
传统术语“Patchset”,“Patchset Update”和“Database Bundle Patch”对于12.2数据库将不再适用。
Release Update (RU) - Database Release Update 12.2.0.1.<build-date>
Release Update Revision (RUR) - Database <Quarter> Release Update Revision 12.2.0.1.<build-date>
<Quarter> is 'MMM YYYY'
<build-date> is YYMMDD
注:RU/RUR的安装方法是仍然使用现有的Opatch技术来安装RU/RUR。
5、查询补丁信息
登陆oracle官网安全专题http://www.oracle.com/technetwork/topics/security点击learn More,找到Critical Path Update Advisory:
打开以后可以看到oracle发布的补丁的列表,里面包含了oracle产品发布的补丁:
6、补丁下载
例如我们当前的oracle的版本为10.2.0.5,该版本的最后更新补丁为2013年 7月份,点击上图中的对应10.2.0.5的数据库补丁。
注:下载使用MOS账号,依照服务器的类型下载相应版本的补丁即可。
7、数据库的备份
在补丁升级前做好数据库的备份工作,使用rman或者导出数据文件方式进行数据库的全备。条件允许的情况下操作系统最好也进行一次备份。
所有以上操作做完后我们可以进行补丁安装工作了。
二、补丁的安装
1、仔细阅读Readme文件
每个补丁下载后的压缩包均会包含一份README.html 在安装前需要仔细阅读。一般会标明该补丁适用的数据库版本和操作系统版本,修复了哪些BUG等,还会有相关的提示信息,有两点需要特别注意。
一是OPatch的版本,你可以通过opatchversion命令查看Oracle Home当前的OPatch版本,如果低于Readme规定的最低版本,一定要先升级OPatch才能打补丁。Opatch工具升级较简单,见2.3小节。
二是打Patch步骤:基本上所有的CPU都大同小异,具体如本案所示。PSU有时会有前置补丁要求,安装步骤大同小异这里不赘述。
2、环境配置
2.1、Windows环境
进入计算机属性→高级系统设置→系统属性→环境变量:
编辑path在path末尾加上%ORACLE_HOME%\OPatch或者在cmd 下set path=%path%;%ORACLE_HOME%\OPatch;
2.2、Linux或者Unix环境
使用oracle 安装用户,设置ORACLE_HOME以后export PATH=$ORACLE_HOME/OPatch:$PATH。
2.3、OPath配置
在补丁安装的时候有时会提示OPatch failed with error code 73错误,此时有可能是opatch版本过低导致,此时需要从oracle官网https://updates.oracle.com/download/6880880.html下载OPatch工具。下载同样需要使用metalink账号。下载对应版本的OPATCH完解压后,在ORACLE_HOME下把以前的opatch文件夹重命名,将解压的OPATCH复制过去即可。可以使用命令opatch version查询当前opatch的版本。
3、查询补丁安装信息
操作系统下查看当前补丁安装情况opatch lsinventory –patch。
4、停止监听与实例
4.1、Windows平台 :
在服务里关闭Oracle相关服务进程,停掉监听和oracle服务。关闭PLSQL客户端,关闭SQLPLUS界面。
4.2、Linux或Unix平台
shutdown 掉所有实例,关闭监听和oracle 相关进程。如果有安装GI和其他使用Oracle 的应用一并停止,退出SQLPLUS界面。
5、补丁安装
在补丁目录下执行opatch apply。例如我的补丁解压在E:\13460968,那就先CD到该目录,然后执行opatch apply
注意:
windows下有时候会出现所有oracle进程关闭,但是命令执行后依然会出现D:\oracle\product\10.2.0\db_1\bin\oci.dll 占用的错误。
Linux下出现进程占用时一般是sqlplus 进程未关闭,可以用fuser查询是什么用户占用,但是强制kill时候数据库启动的时候可能会报错。
安装过程比较简单,这里省略,有环境的朋友可以自行测试;
6、启动数据库实例
6.1、Windows平台:
Windows先在服务中启动oracle的服务和监听。以sysdba登陆系统。
6.2、Linux或Unix平台:
linux 下正常启动oracle实例和监听。以sysdba登陆系统。
7、更新补丁信息到数据库
执行补丁包中的目录下的脚本,等待脚本运行完毕即可。Linux找到补丁目录执行即可。
SQL>@E:\13460968\files\Bundle\Patch14\catcpu.sql
8、编译无效对象
执行如下脚本:
SQL>@?/rdbms/admin/utlrp.sql
注意:大部分失效对象错误是可以忽略的,具体类型可以用前面的命令去检查,并与开始的记录作对比。
9、查询补丁信息
执行如下命令:
SQL>select * from dba_registry_history;
注:命令行下执行Opatch lsinventory opatch
至此数据库补丁安装完毕,数据库正常;
三、补丁的回滚
一般情况下在不确定问题原因的情况下咨询DBA进行检查,确定问题原因,在无法查证原因的情况下可以回退,具体的回滚操作命令如下:
如果补丁应用后数据库异常或者发生BUG,可以利用Opatch回滚补丁更新的操作。
关闭oracle相关服务,参照第二节2小节设置环境变量,执行如下命令,红色部分为安装补丁的ID。
opatch rollback -id 13460968
执行完毕后 启动oracle相关服务,windows记得恢复重命名的dll文件。
查询数据库是否可以正常启动。
回滚完毕以后使用sysdba用户执行roolback脚本
SQL>@E:\13460968\files\Bundle\Patch14\ catcpu_rollback.sql
检查数据库是否正常。
注意:数据库补丁升级工作需要停应用和相关服务,在升级前一定要进行数据库的备份工作。
如果你觉得有所收获并愿意继续学习的话,请扫码关注:
你也可以赞赏哟