本篇介绍了Oracle 19C (19.17)升级RU(升级至19.19)的详细过程。
Oracle在每年的1月,4月,7月和10月每个季度发布一个RU。为了使客户能够在其环境稳定之后即刻获得最新的安全相关修复,将在每年的1月,4月,7月,10月为最近的两个RU提供RUR。
RU(Release Updates)是每一个季度的版本升级。包括:最新的BUG修复、最新的安全漏洞补丁、最新添加的功能。 以19c为例,对应的升级版本升级路线是(19.1.0.0.0->19.2.0.0.0->19.3.0.0.0 ..... )。
RUR是对RU的修订版本,包括:最新的BUG修复、最新的安全漏洞补丁,这里并没有添加最新的功能。并且只有对应RU版本的修订版。比如,在2020年7月,除了会发布RU(19.8.0.0.0)回会发布上个季度的.1补丁(19.7.1.0)和上上个季度的.2补丁(19.6.2.0)。
创建工作目录,将补丁上传至该目录,以备后续升级。
mkdir -p /backup/upgrade
chown grid:oinstall -R /backup/upgrade
Patch 35037840 - GI Release Update 19.19.0.0.230418
Patch 35042068 - Database Release Update 19.19.0.0.230418
[oracle@rac01:/home/oracle]$ cat /etc/os-release
NAME="Oracle Linux Server"
VERSION="7.6"
ID="ol"
VARIANT="Server"
VARIANT_ID="server"
VERSION_ID="7.6"
PRETTY_NAME="Oracle Linux Server 7.6"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:oracle:linux:7:6:server"
HOME_URL="https://linux.oracle.com/"
BUG_REPORT_URL="https://bugzilla.oracle.com/"
ORACLE_BUGZILLA_PRODUCT="Oracle Linux 7"
ORACLE_BUGZILLA_PRODUCT_VERSION=7.6
ORACLE_SUPPORT_PRODUCT="Oracle Linux"
ORACLE_SUPPORT_PRODUCT_VERSION=7.6
[oracle@rac01:/home/oracle]$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Fri Jul 21 14:30:39 2023
Version 19.17.0.0.0
Copyright (c) 1982, 2022, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.17.0.0.0
SQL> set linesize 300
SQL> select comp_id,status,version from dba_registry;
COMP_ID STATUS VERSION
------------------------------ -------------------------------------------- ------------------------------
CATALOG VALID 19.0.0.0.0
CATPROC VALID 19.0.0.0.0
RAC VALID 19.0.0.0.0
JAVAVM VALID 19.0.0.0.0
XML VALID 19.0.0.0.0
CATJAVA VALID 19.0.0.0.0
APS VALID 19.0.0.0.0
XDB VALID 19.0.0.0.0
OWM VALID 19.0.0.0.0
CONTEXT VALID 19.0.0.0.0
ORDIM VALID 19.0.0.0.0
COMP_ID STATUS VERSION
------------------------------ -------------------------------------------- ------------------------------
SDO VALID 19.0.0.0.0
XOQ VALID 19.0.0.0.0
OLS VALID 19.0.0.0.0
DV VALID 19.0.0.0.0
15 rows selected.
# grid用户通过如下命令收集当前GI补丁信息:
$ORACLE_HOME/OPatch/opatch lsinventory > /tmp/grid_patch.txt
$ORACLE_HOME/OPatch/opatch lsinv -detail -oh $ORACLE_HOME >> /tmp/grid_patch.txt
$ORACLE_HOME/OPatch/opatch lspatches >> /tmp/grid_patch.txt
# oracle用户通过如下命令收集当前DB补丁信息:
$ORACLE_HOME/OPatch/opatch lsinventory > /tmp/oracle_patch.txt
$ORACLE_HOME/OPatch/opatch lsinv -detail -oh $ORACLE_HOME >> /tmp/oracle_patch.txt
$ORACLE_HOME/OPatch/opatch lspatches >> /tmp/oracle_patch.txt
获取组件信息,无效对象信息:
sqlplus / as sysdba
spool /tmp/database_invalid.sql
set linesize 300
select comp_id,status,version from dba_registry;
select owner,object_type,object_name from dba_objects where status<>'VALID';
select PATCH_ID,ACTION,STATUS,ACTION_TIME from dba_registry_sqlpatch order by ACTION_TIME;
spool off;
grid用户获取集群进程,资源状态:
crsctl check crs
crsctl check cluster -all
crsctl status res -t
grid用户各个节点获取:
lsnrctl status
因为补丁安装针对的是oracle安装目录下文件的替换,故需要将安装目录文件做一个备份。为了保证备份的文件可用,建议将数据库停止后做备份,RAC 集群时建议停止集群件备份,当出现不能解决的问题时可以将备份的ORACLE_HOME目录还原,可正常启动集群件。
备份时,建议使用root用户以下命令带权限备份,备份完成后,启动集群和数据库
# 备份前,使用grid用户停止所有database
srvctl stop database -d orcl
# 备份前,使用root用户停止所有集群服务
crsctl stop cluster -all
# 使用root用户带权限打包备份
# 所有节点分别备份
tar -czvpf u01_bak.tar.gz /u01/app/
# 启动集群
crsctl start cluster -all
# 启动数据库
srvctl start database -d orcl
获取grid,oracle当前opatch版本信息:
$ORACLE_HOME/OPatch/opatch version
当前opatch版本信息如果不满足当前打补丁的要求(可查看要更打补丁集中的readme来确认opatch版本的要求),需要从mos网站下载符合当前数据库版本最新的opatch包将旧版本的opatch目录替换掉,GI和DB都需要替换升级。
su - grid
cd $ORACLE_HOME
mv OPatch OPatch_bak
cd /backup/upgrade
# 解压后注意权限
unzip p6880880_190000_Linux-x86-64.zip -d $ORACLE_HOME
$ORACLE_HOME/OPatch/opatch version
su - oracle
cd $ORACLE_HOME
mv OPatch OPatch_bak
cd /backup/upgrade
# 解压后注意权限
unzip p6880880_190000_Linux-x86-64.zip -d $ORACLE_HOME
$ORACLE_HOME/OPatch/opatch version
GI:包含多个包,在grid用户下逐个检查:
$ORACLE_HOME/OPatch/opatch prereq CheckConflictAgainstOHWithDetail -phBaseDir /backup/upgrade/35037840/35042068
$ORACLE_HOME/OPatch/opatch prereq CheckConflictAgainstOHWithDetail -phBaseDir /backup/upgrade/35037840/35050331
$ORACLE_HOME/OPatch/opatch prereq CheckConflictAgainstOHWithDetail -phBaseDir /backup/upgrade/35037840/35050325
$ORACLE_HOME/OPatch/opatch prereq CheckConflictAgainstOHWithDetail -phBaseDir /backup/upgrade/35037840/35107512
$ORACLE_HOME/OPatch/opatch prereq CheckConflictAgainstOHWithDetail -phBaseDir /backup/upgrade/35037840/33575402
DB:在oracle用户下
$ORACLE_HOME/OPatch/opatch prereq CheckConflictAgainstOHWithDetail -phBaseDir /backup/upgrade/35037840/35042068
$ORACLE_HOME/OPatch/opatch prereq CheckConflictAgainstOHWithDetail -phBaseDir /backup/upgrade/35037840/35050331
>>>>使用grid用户检查空间是否满足GIRU部署
$ vi /tmp/patch_list_gihome.txt
/backup/upgrade/35037840/33575402
/backup/upgrade/35037840/35042068
/backup/upgrade/35037840/35050325
/backup/upgrade/35037840/35050331
/backup/upgrade/35037840/35107512
$ORACLE_HOME/OPatch/opatch prereq CheckSystemSpace -phBaseFile /tmp/patch_list_gihome.txt
>>>>使用oracle用户检查系统空间是否满足DBRU的部署
$ vi /tmp/patch_list_dbhome.txt
/backup/upgrade/35037840/35042068
/backup/upgrade/35037840/35050331
$ORACLE_HOME/OPatch/opatch prereq CheckSystemSpace -phBaseFile /tmp/patch_list_dbhome.txt
使用root用户,通过以下命令一次性补丁冲突检测和解决,如果one-off补丁冲突,可考虑现将该补丁回滚掉,待PSU/RU更新后,再考虑将该补丁更新上去。
/u01/app/19.3.0/grid/OPatch/opatchauto apply /backup/upgrade/35037840/ -analyze
/u01/app/19.3.0/grid/OPatch/opatchauto rollback /backup/upgrade/35037840/ -analyze
注意:
升级过程会自动关闭和启动集群。
先升级节点1的grid,再升级节点2的grid。
# 使用root用户安装部署GIRU补丁,各个节点依次更新
/u01/app/19.3.0/grid/OPatch/opatchauto apply /backup/upgrade/35037840/ -oh /u01/app/19.3.0/grid
# 部署成功之后进行验证
su - grid
$ORACLE_HOME/OPatch/opatch lspatches
$ORACLE_HOME/OPatch/opatch lsinventory
$ORACLE_HOME/OPatch/opatch lspatches -id 33575402 -verify
$ORACLE_HOME/OPatch/opatch lspatches -id 35042068 -verify
$ORACLE_HOME/OPatch/opatch lspatches -id 35050325 -verify
$ORACLE_HOME/OPatch/opatch lspatches -id 35050331 -verify
$ORACLE_HOME/OPatch/opatch lspatches -id 35107512 -verify
由于 GI RU 包含 DB RU,所以 RAC 环境升级 DB 时,还将使用此 Patch 即可。
注意:
升级过程会自动关闭和启动集群。
先升级节点1的database,再升级节点2的database。
# 安装ORACLE RDBMS补丁[使用root用户]
# 使用root用户操作,部署DBRU,各节点依次更新
/u01/app/oracle/product/19.3.0/db_1/OPatch/opatchauto apply /backup/upgrade/35037840/ -oh /u01/app/oracle/product/19.3.0/db_1
# 补丁验证[使用oracle用户]
su - oracle
$ORACLE_HOME/OPatch/opatch lspatches
$ORACLE_HOME/OPatch/opatch lsinventory
$ORACLE_HOME/OPatch/opatch lspatches -id 35042068 -verify
上面说了依次更新补丁可以减少停机时间,但是停机时间还是需要的,就是在这里的运行datapatch的时间。这个步骤是升级数据字典,针对整个database的数据字典,因此只需在一个节点上跑就可以了。主要注意的是,如果是cdb模式,需要 alter pluggable database all open,打开所有的pdb之后,再运行datapatch。
非CDB模式:
% sqlplus /nolog
SQL> Connect / as sysdba
SQL> startup
SQL> quit
% cd $ORACLE_HOME/OPatch
% ./datapatch -verbose
CDB模式:
% sqlplus /nolog
SQL> Connect / as sysdba
SQL> startup
SQL> alter pluggable database all open;
SQL> quit
% cd $ORACLE_HOME/OPatch
% ./datapatch -verbose
su - oracle
cd $ORACLE_HOME/rdbms/admin
sqlplus / as sysdba
SQL> @utlrp.sql
SQL> select * from product_component_version;
PRODUCT VERSION VERSION_FULL STATUS
---------------------------------------- ---------------------------------------- ---------------------------------------- ------------------------------------------------------------
Oracle Database 19c Enterprise Edition 19.0.0.0.0 19.19.0.0.0 Production
如果您使用的是Oracle恢复管理器,则需要升级目录。输入以下命令进行升级。必须输入两次升级目录命令才能确认升级。
$ rman catalog username/password@alias
RMAN> UPGRADE CATALOG;
RMAN> UPGRADE CATALOG;
RMAN> EXIT;
crsctl check crs
crsctl check cluster -all
crsctl status res -t