Oracle补丁就该这么打

Oracle补丁就该这么打

原创 金震宇 IT那活儿 今天
[
补丁集下载
]

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版本检查、补丁冲突检查
临时问题解决要依托第一案场“证据”顺藤摸瓜

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值