资讯专栏INFORMATION COLUMN

Oracle补丁就该这么打

IT那活儿 / 3368人阅读
Oracle补丁就该这么打
[
补丁集下载
]


oracle打补丁最常见原因为bug修复或安全迎检漏洞修复需要打到最新的补丁版本。下文的经验之谈是基于rac环境,19c版本的最新补丁集的过程分享。

可以参考《Assistant:Download Reference for Oracle Database/GI Update, Revision, PSU,SPU(CPU), Bundle Patches, Patchsets and Base Releases (Doc ID2118136.2)》来下载补丁集,打开的页面中,我们可以选择下载db的基础版本,db补丁集和ojvm的补丁集等。



下图是基于19c版本今年7月份发布的19.8的补丁集。DatabaseUpdate只包含db补丁包,GIUpdate则既包含GI的补丁包也包含db的补丁包,具体的可以按需来进行下载。


[
关于备份
]


软件的备份:备份重于一切,这是我们做变更的基础,一定要给自己留后路。在做补丁更新前,我们必须需对oracle软件进行备份(GI和DB)。


以下给出命令示例:

--关闭集群CRS,各个节点依次关闭

su – oracle

srvctl stop database -d xxxx ==>手工停所有节点实例

su - root

crsctl stop crs

crsctl start crs ==》该步骤选做,验证crs能否正常启动

crsctl stop crs

ps -ef | grep grid ==> 有进程kill掉

ps -ef | grep oracle ==> 有进程kill掉


--备份各节点软件目录

su - root

tar -zcvf /u01/oracle20200813.tar /u01/app/* -p -P ==>可以多带带对GI和DB的软件目录进行备份。这里为了方便操作对整个目录进行备份。备份前注意清理小文件(audit,trace等)


--还原

--停掉crs服务

--解tar

cd /u01

mv app appbak

tar -xvf  /u01/oracle20200813.tar -C /u01/


DB信息的备份

>>>>使用grid用户检查当前GI的补丁情况,监听状态

crsctl status res -t > /home/grid/crs.txt

$ORACLE_HOME/OPatch/opatch lsinventory >> /home/grid/grid_patch.txt

$ORACLE_HOME/OPatch/opatch lsinv -detail -oh $ORACLE_HOME >> /home/grid/grid_patch.txt

$ORACLE_HOME/OPatch/opatch lspatches >> /home/grid/grid_patch.txt

lsnrctl status >> /home/grid/crs.txt



>>>>使用oracle用户检查当前oracle的补丁情况

su - oracle

$ORACLE_HOME/OPatch/opatch lsinventory > /home/oracle/oracle_patch.txt

$ORACLE_HOME/OPatch/opatch lsinv -detail -oh $ORACLE_HOME >> /home/oracle/oracle_patch.txt

$ORACLE_HOME/OPatch/opatch lspatches >> /home/oracle/oracle_patch.txt


>>>>使用oracle用户,在其中一个节点登录到所有实例当中进行查询,记录补丁、无效对象相关信息

sqlplus / as sysdba

spool /home/oracle/db0813.txt

set lines 200 pages 2000;

show parameter name;

col comp_id for a20;

col version for a20;

col status for a30;

select comp_id,version,status from dba_registry;

select owner,object_type,object_name from dba_objects where status<>VALID;

select patch_id,patch_uid,status,action_time from dba_registry_sqlpatch;

spool off


[
关于OPtach工具
]


主要调用该工具OPatchAuto和Datapatch这2个命令。简单的可以理解为OPatchAuto更新软件相关文件,Datapatch用于更新数据库字典(dba_registry_sqlpatch)。


详细的信息我们可以参考如下文章:

Datapatch:Database 12c or later Post Patch SQL Automation (Doc ID 1585822.1)

DatapatchUser Guide (Doc ID 2680521.1)


[
关于readme
]


该文件为补丁说明书,必读项。可以在下载补丁包或者在下载页面的ReadMe的按钮(如下图)里找到。



下面提取今年7月份发布的19.8的GI补丁集的readme中的关键主题来分析下:


ADG是否可以先更打

readme中会有明确的字眼提示adg是否可以先更打,如下图:



补丁集信息

下图中有4个patchnumber,其中GI_HOME都要更打,DB_HOME只要更打2个。从这里大致应该就能估算出打GI补丁的时间要比DB补丁多一半,可以估算出要停机的时间。


OPatch 工具信息

Readme中会有明确的字眼要求OPatch的最低版本,如下图:

参考该文章来下载需要的opatch工具:MasterNote For OPatch (Doc ID 293369.1)


补丁冲突检测

Readme中给出具体命令,如下图,我们补全拿到环境中执行就行。


我们主要关注跑出来的结果,如果提示成功没报错,那这一环节就可以不做处理。如果有报错,那就需要提前准备解决方案,比如下面这个示例:

注:运行该命令对现有环境不影响,需要提前执行,以便有报错提前准备解决方案,避免和维护窗口时间冲突。


空间检测

提前检查空间是否足够,如下图,我们补全拿到环境中执行就行。


冲突检查解决方案

这里的冲突可以是小补丁和小补丁之间的冲突,也可以是小补丁和补丁集之间的冲突。有2个解决思路,一个是提SR申请冲突小补丁的merge补丁,这个等待时间可能比较久。另外一个思路,就是更打较新的补丁集,一般最新发布的补丁集都会包含之前小补丁,那这块就需要拿补丁集去确认了。


小补丁和补丁集之间的冲突:这块处理起来比较方便,比如说当前安装的是4月份补丁集,我们现在要更打到7月份的补丁集。那现在可以将4月份补丁集上的小补丁先回滚掉,待7月份的补丁集更打完成后,再更打基于7月份补丁集的这个小补丁。


Opatchauto

使用opatchauto命令去更打补丁,一般GI和DB都分开更打。可以根据readme中提供命令进行补全(如下图),整合出适合自己环境的命令。


以下给出命令示例:

>>>GI各个节点依次执行打补丁命令

# /u01/app/19.0.3/grid/OPatch/opatchauto apply /u01/software/patch2020/31305339 -oh /u01/app/19.0.3/grid

>>>DB各个节点依次执行打补丁命令

#/u01/app/oracle/product/19.0.3/dbhome_1/OPatch/opatchauto apply /u01/software/patch2020/31305339  -oh /u01/app/oracle/product/19.0.3/dbhome_1


Loading Modified SQL Files into the Database

关于数据字典更新操作,根据补丁的readme中提供的命令补全即可:


下图是补丁集更打后的操作:


下图是OJVM补丁更打后的操作:


以下命令是补丁集+OJVM的数据字典更新(也是说只跑一次datapatch)的示例(adg端不跑),更参考:

####Loading Modified SQL Files Into the Database

sqlplus /nolog

SQL> CONNECT / AS SYSDBA

SQL> STARTUP nomount

SQL> alter system set cluster_database=false scope=spfile;

SQL> shutdown immediate


sqlplus /nolog

SQL> CONNECT / AS SYSDBA

SQL> STARTUP UPGRADE

SQL> exit


$ cd $ORACLE_HOME/OPatch

$ ./datapatch -verbose


sqlplus /nolog

SQL> CONNECT / AS SYSDBA

SQL> alter system set cluster_database=true scope=spfile;

SQL> SHUTDOWN immedite


$srvctl start database -db xxx


[
关于troubleshotting
]


其实做好前期准备工作,基本是成功的几率就很高了,如果还有报错,可能就是遇到bug或者其他问题了。那就只能临时去找解决方案了,如果最终拖的时间比较长,维护窗口时间有限,最后也就只能回退了。分享2个简单报错示例:下图是一个进程占用报错的示例,可以通过fuser命令来确认占用进程,kill掉就行:


下图是一个节点间互信问题的报错示例:


[
总结
]


做好打补丁前准备工作,工作量就已完成了大半。这里粗略做以下总结:

  • 备份重于一切,一定要对软件进行备份。

  • 集群间通信检查,确认命令为:crsctl check cluster -all

  • grid、oracle节点间互信检查

  • 补丁包权限检查、opatch版本检查、补丁冲突检查

  • 临时问题解决要依托第一案场“证据”顺藤摸瓜

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/130146.html

相关文章

  • 集成安装之Oracle12C补丁升级数据字典更新报错处理

    集成安装之Oracle12C补丁升级数据字典更新报错处理 img{ display:block; margin:0 auto !important; width:100%; } body{ width:75%; ...

    IT那活儿 评论0 收藏795
  • RAC补丁日常更新成功反遇异常处理

    RAC补丁日常更新成功反遇异常处理 img{ display:block; margin:0 auto !important; width:100%; } body{ width:75%; m...

    IT那活儿 评论0 收藏2488
  • 除了Oracle JDK,我们还有哪些选择?

    摘要:就在昨天,发布了新版的我相信很多开发人员沉溺在编码的乐趣中,还没注意到相关消息。 就在昨天,Oracle发布了新版的JDK 11,我相信很多Java开发人员沉溺在编码的乐趣中,还没注意到相关消息。 在2017年9月份,Oracle官网发布了一则博客https://blogs.oracle.com/java... 总结来说,主要内容涉及到: 调整JAVA SE的版本发布计划节奏;从JAV...

    李世赞 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<