Menu Close

Oracle 19c 单实例 RU 从19.3 升级到19.15

郑重提醒:升级前必须备份数据库,备份Oracle家目录。并且仔细研读升级包中的README.html 文件!!!

1. 查询Oracle PSU

通过文档 ID: 2118136.2 在my oracle support中搜索Oracle每季度最新的PSU等补丁。

file

2. 从MOS下载 19.15 的RU 补丁

2.1. 什么是RU

参考:https://www.cnblogs.com/dbapro/p/13587070.html

以前 Oracle的周期是约5年升级一个大版本,在这个大版本上做小的升级(PSU与BP),在12c发布以后,oracle数据库产品的新版本发布改为每年一次。随着版本的变化,oracle的升级也发生了变化。
12.2以后,主要是通过 RURelease Updates)与 RURRelease Update Revisions)升级,那么什么是 RU(Release Updates)与 RUR(Release Update Revisions),该怎么选择呢?

  • RU(Release Updates)是每一个季度的版本升级。包括:
    最新的BUG修复
    最新的安全漏洞补丁
    最新添加的功能
    以19c为例,对应的升级版本升级路线是(19.1.0.0.0->19.2.0.0.0->19.3.0.0.0 ..... )到现在是19.15.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)

  • RU与RUR是可以相互转换的,oracle也提供了判断条件

客户是否可以在 Updates 和 Revisions 之间来回切换?

A: 是的。   只要客户选择的版本是另一个的累积,那么就可以在 Updates 和 Revisions 之间切换。一个简单的公式就是在相同的年度发布的情况下,
把目标以及源库的版本号的后两个部分相加。如果目标版本号的后两个部分相加大于源库版本号的后两个部分相加,那么就可以应用目标版本;否则安装会失败。

例 1:
    源版本 - 18.2.2     <<<<< 第二部分和第三部分的和是 "4"
    目标版本 - 18.5.0     <<<<< 第二部分和第三部分的和是 "5"
    结论: 目标版本 "5" 比源版本 "4" 大,所以可以应用目标版本

例 2:
    源版本 - 18.2.2     <<<<< 第二部分和第三部分的和是 "4"
    目标版本 - 18.3.0     <<<<< 第二部分和第三部分的和是"3"
    结论: 目标版本 "3" 比源版本 "4" 小所以不能安装目标版本,会出错

2.2. 下载补丁包

file
下载到的文件名为:p33806152_190000_Linux-x86-64.zip(仅数据库),将下载的文件存放到 /home/oracle/software/

3. 补丁-p33806152

总体步骤也很简单,备份家目录,替换 opatch,oracleinventory 验证、空间检测,补丁冲突检测,补丁分析,应用补丁等七大步骤。

  • 实验环境操作系统版本
~]# cat /etc/redhat-release
CentOS Linux release 7.8.2003 (Core)
  • 实验环境数据库版本
ContainerID :  0
Banner      :  Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Banner Full :  Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
               Version 19.3.0.0.0
Banner Legacy: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production

3.1. 停止数据库

这里有几点注意事项:

如果是物理DG,那么主备库都需要安装Patch,可以先在备库安装,再安装主库,操作步骤可以参考:Document 278641.1。
对于RAC 环境,可以使用OPatch rolling 方式来安装,这样没有停机时间,具体操作可以参考:Document 244241.1。
对于单实例,必须关闭待升级ORACLE HOME关联的所有实例和监听,并且包括退出所有的sqlplus窗口。
关闭实例和监听,并退出sqlplus

# 使用 oracle 用户执行以下命令
~]$ lsnrctl stop
~]$ sqlplus / as sysdba
SQL> shu immediate;
SQL> exit;

3.2. 备份家目录(ORACLE_HOME)

因为补丁安装针对的是 Oracle 家目录下文件的替换,故需要将家目录文件做一个备份。为了保证备份的文件可用,建议将数据库停止后做备份,RAC 集群时建议停止集群组件备份,当出现不能解决的问题时可以将备份的 ORACLE_HOME 目录还原,可正常启动集群。

mkdir -p /data/oraBackup/
tar zcvf /data/oraBackup/oracle_before_upgrade.tar.gz /u01/app/oracle/

3.3. 替换 OPatch

升级到19.14版本,OPatch 工具的版本必须大于 12.2.0.1.28。
使用oracle用户执行下列脚本。

(1)查看当前 OPatch 版本

cd $ORACLE_HOME/OPatch/
./opatch version

输出内容如下:

OPatch Version: 12.2.0.1.17

OPatch succeeded.

file

(2)下载最新的 OPatch 版本
从patch 6880880 下载最新的OPatch。下载地址为:https://updates.oracle.com/download/6880880.html
我们下载到 OPatch 12.2.0.1.30 for DB 19.0.0.0.0 (Apr 2022),文件名为: p6880880_190000_Linux-x86-64.zip
一定要注意数据库的版本,别选择错了!!!

file

(3)替换当前 OPatch

unzip p6880880_190000_Linux-x86-64.zip -d $ORACLE_HOME

输出内容如下:

Archive:  p6880880_190000_Linux-x86-64.zip
replace /u01/app/oracle/product/19c/db_1/OPatch/README.txt? [y]es, [n]o, [A]ll, [N]one, [r]ename: A  #A表示覆盖文件
...

(4)再次确认 OPatch 版本
file

3.4. 验证 Oracle Inventory

在开始打补丁之前,检查 GI home 和每个要打补丁的数据库home的库存信息的一致性。 以各自的 Oracle 主目录所有者身份运行以下命令以检查一致性。

$ORACLE_HOME/OPatch/opatch lsinventory -detail -oh $ORACLE_HOME

输出信息如下:

Oracle Interim Patch Installer version 12.2.0.1.30
Copyright (c) 2022, Oracle Corporation.  All rights reserved.

Oracle Home       : /u01/app/oracle/product/19c/db_1
Central Inventory : /u01/app/oraInventory
   from           : /u01/app/oracle/product/19c/db_1/oraInst.loc
OPatch version    : 12.2.0.1.30
OUI version       : 12.2.0.7.0
Log file location : /u01/app/oracle/product/19c/db_1/cfgtoollogs/opatch/opatch2022-05-16_16-59-35PM_1.log

Lsinventory Output file location : /u01/app/oracle/product/19c/db_1/cfgtoollogs/opatch/lsinv/lsinventory2022-05-16_16-59-35PM.txt
--------------------------------------------------------------------------------
Local Machine Information::
Hostname: dbteam
ARU platform id: 226
ARU platform description:: Linux x86-64

Installed Top-level Products (1):

Oracle Database 19c                                                  19.0.0.0.0
There are 1 products installed in this Oracle Home.

Installed Products (128):

Assistant Common Files                                               19.0.0.0.0
BLASLAPACK Component                                                 19.0.0.0.0
Buildtools Common Files                                              19.0.0.0.0
...

3.5. 检查Patch 是否冲突

确定 Oracle 主目录中是否有与数据库版本更新 19.15.0.0.220419 冲突的临时补丁并获得必要的冲突解决补丁的最快和最简单的方法是使用补丁上的补丁建议和补丁计划功能和 My Oracle Support 中的更新选项卡。这些功能与 My Oracle Support 配置管理器结合使用。有关这些功能的记录培训课程可在文档 603505.1 中找到。

cd /home/oracle/software/
unzip p33806152_190000_Linux-x86-64.zip
cd p33806152/
$ORACLE_HOME/OPatch/opatch prereq CheckConflictAgainstOHWithDetail -ph ./

输出内容如下:

Oracle Interim Patch Installer version 12.2.0.1.30
Copyright (c) 2022, Oracle Corporation.  All rights reserved.

PREREQ session

Oracle Home       : /u01/app/oracle/product/19c/db_1
Central Inventory : /u01/app/oraInventory
   from           : /u01/app/oracle/product/19c/db_1/oraInst.loc
OPatch version    : 12.2.0.1.30
OUI version       : 12.2.0.7.0
Log file location : /u01/app/oracle/product/19c/db_1/cfgtoollogs/opatch/opatch2022-05-16_17-04-32PM_1.log

Invoking prereq "checkconflictagainstohwithdetail"

Prereq "checkConflictAgainstOHWithDetail" passed.

OPatch succeeded.

3.6. 应用patch

跟着这些步骤:

  1. 如果您使用的是 Data Guard 物理备用数据库,则必须在主数据库和物理备用数据库上安装此补丁,如 My Oracle Support Document 278641.1 所述。

  2. 如果这是 RAC 环境,请使用 OPatch 滚动(无停机时间)安装方法安装此补丁,因为此补丁可滚动 RAC 安装。 请参阅 My Oracle Support 文档 244241.1 滚动补丁 - RAC 的 OPatch 支持。

  3. 如果这不是 RAC 环境,请关闭与您正在更新的 Oracle 主目录关联的所有实例和侦听器。 有关详细信息,请参阅 Oracle 数据库管理员指南。

  4. 将当前目录设置为补丁所在的目录,然后通过输入以下命令运行 OPatch 实用程序:

    unzip p33806152_<version>_<platform>.zip
    cd 33806152
    $ORACLE_HOME/OPatch/opatch apply

输出的内容如下:

Oracle Interim Patch Installer version 12.2.0.1.30
Copyright (c) 2022, Oracle Corporation.  All rights reserved.

Oracle Home       : /u01/app/oracle/product/19c/db_1
Central Inventory : /u01/app/oraInventory
   from           : /u01/app/oracle/product/19c/db_1/oraInst.loc
OPatch version    : 12.2.0.1.30
OUI version       : 12.2.0.7.0
Log file location : /u01/app/oracle/product/19c/db_1/cfgtoollogs/opatch/opatch2022-05-16_17-13-40PM_1.log

Verifying environment and performing prerequisite checks...
OPatch continues with these patches:   33806152  

Do you want to proceed? [y|n]
y
User Responded with: Y
All checks passed.

Please shutdown Oracle instances running out of this ORACLE_HOME on the local system.
(Oracle Home = '/u01/app/oracle/product/19c/db_1')

Is the local system ready for patching? [y|n]
y
User Responded with: Y
Backing up files...
Applying interim patch '33806152' to OH '/u01/app/oracle/product/19c/db_1'
ApplySession: Optional component(s) [ oracle.network.gsm, 19.0.0.0.0 ] , [ oracle.rdbms.ic, 19.0.0.0.0 ] , [ oracle.rdbms.tg4db2, 19.0.0.0.0 ] , [ oracle.tfa, 19.0.0.0.0 ] , [ oracle.network.cman, 19.0.0.0.0 ] , [ oracle.options.olap.api, 19.0.0.0.0 ] , [ oracle.ons.cclient, 19.0.0.0.0 ] , [ oracle.rdbms.tg4ifmx, 19.0.0.0.0 ] , [ oracle.rdbms.tg4sybs, 19.0.0.0.0 ] , [ oracle.options.olap, 19.0.0.0.0 ] , [ oracle.xdk.companion, 19.0.0.0.0 ] , [ oracle.net.cman, 19.0.0.0.0 ] , [ oracle.ons.eons.bwcompat, 19.0.0.0.0 ] , [ oracle.oid.client, 19.0.0.0.0 ] , [ oracle.rdbms.tg4tera, 19.0.0.0.0 ] , [ oracle.rdbms.tg4msql, 19.0.0.0.0 ] , [ oracle.jdk, 1.8.0.191.0 ]  not present in the Oracle Home or a higher version is found.

上述组件在 Oracle Home 中不存在 或找到更高版本。

Patching component oracle.bali.ewt, 11.1.1.6.0...

Patching component oracle.help.ohj, 11.1.1.7.0...

Patching component oracle.perlint, 5.28.1.0.0...

Patching component oracle.rdbms.locator, 19.0.0.0.0...

Patching component oracle.perlint.expat, 2.0.1.0.4...

Patching component oracle.rdbms.rsf, 19.0.0.0.0...

Patching component oracle.rdbms.util, 19.0.0.0.0...

Patching component oracle.rdbms, 19.0.0.0.0...

Patching component oracle.assistants.acf, 19.0.0.0.0...

Patching component oracle.assistants.deconfig, 19.0.0.0.0...

Patching component oracle.assistants.server, 19.0.0.0.0...

Patching component oracle.buildtools.rsf, 19.0.0.0.0...

Patching component oracle.ctx, 19.0.0.0.0...

Patching component oracle.dbdev, 19.0.0.0.0...

Patching component oracle.dbjava.ic, 19.0.0.0.0...

Patching component oracle.dbjava.jdbc, 19.0.0.0.0...

Patching component oracle.dbjava.ucp, 19.0.0.0.0...

Patching component oracle.duma, 19.0.0.0.0...

Patching component oracle.javavm.client, 19.0.0.0.0...

Patching component oracle.ldap.owm, 19.0.0.0.0...

Patching component oracle.ldap.rsf, 19.0.0.0.0...

Patching component oracle.ldap.security.osdt, 19.0.0.0.0...

Patching component oracle.marvel, 19.0.0.0.0...

Patching component oracle.network.rsf, 19.0.0.0.0...

Patching component oracle.odbc.ic, 19.0.0.0.0...

Patching component oracle.oracore.rsf, 19.0.0.0.0...

Patching component oracle.precomp.common.core, 19.0.0.0.0...

Patching component oracle.rdbms.crs, 19.0.0.0.0...

Patching component oracle.rdbms.dbscripts, 19.0.0.0.0...

Patching component oracle.rdbms.deconfig, 19.0.0.0.0...

Patching component oracle.rdbms.oci, 19.0.0.0.0...

Patching component oracle.rhp.db, 19.0.0.0.0...

Patching component oracle.sdo, 19.0.0.0.0...

Patching component oracle.sdo.locator.jrf, 19.0.0.0.0...

Patching component oracle.sqlplus, 19.0.0.0.0...

Patching component oracle.sqlplus.ic, 19.0.0.0.0...

Patching component oracle.wwg.plsql, 19.0.0.0.0...

Patching component oracle.rdbms.rman, 19.0.0.0.0...

Patching component oracle.dbtoolslistener, 19.0.0.0.0...

Patching component oracle.rdbms.scheduler, 19.0.0.0.0...

Patching component oracle.oraolap, 19.0.0.0.0...

Patching component oracle.oraolap.api, 19.0.0.0.0...

Patching component oracle.precomp.rsf, 19.0.0.0.0...

Patching component oracle.rdbms.hs_common, 19.0.0.0.0...

Patching component oracle.xdk.parser.java, 19.0.0.0.0...

Patching component oracle.xdk.xquery, 19.0.0.0.0...

Patching component oracle.rdbms.install.common, 19.0.0.0.0...

Patching component oracle.mgw.common, 19.0.0.0.0...

Patching component oracle.rdbms.drdaas, 19.0.0.0.0...

Patching component oracle.install.deinstalltool, 19.0.0.0.0...

Patching component oracle.network.client, 19.0.0.0.0...

Patching component oracle.odbc, 19.0.0.0.0...

Patching component oracle.ons.ic, 19.0.0.0.0...

Patching component oracle.xdk.rsf, 19.0.0.0.0...

Patching component oracle.rdbms.hsodbc, 19.0.0.0.0...

Patching component oracle.oraolap.dbscripts, 19.0.0.0.0...

Patching component oracle.rdbms.lbac, 19.0.0.0.0...

Patching component oracle.nlsrtl.rsf, 19.0.0.0.0...

Patching component oracle.ctx.atg, 19.0.0.0.0...

Patching component oracle.network.listener, 19.0.0.0.0...

Patching component oracle.ldap.ssl, 19.0.0.0.0...

Patching component oracle.ovm, 19.0.0.0.0...

Patching component oracle.rdbms.install.plugins, 19.0.0.0.0...

Patching component oracle.ctx.rsf, 19.0.0.0.0...

Patching component oracle.rdbms.dv, 19.0.0.0.0...

Patching component oracle.ons, 19.0.0.0.0...

Patching component oracle.javavm.server, 19.0.0.0.0...

Patching component oracle.ldap.client, 19.0.0.0.0...

Patching component oracle.ldap.rsf.ic, 19.0.0.0.0...

Patching component oracle.xdk, 19.0.0.0.0...

Patching component oracle.sdo.locator, 19.0.0.0.0...

Patching component oracle.rdbms.rsf.ic, 19.0.0.0.0...

Patching component oracle.precomp.common, 19.0.0.0.0...

Patching component oracle.precomp.lang, 19.0.0.0.0...

Patching component oracle.jdk, 1.8.0.201.0...
Patch 33806152 successfully applied.
Sub-set patch [29517242] has become inactive due to the application of a super-set patch [33806152].
Please refer to Doc ID 2161861.1 for any possible further required actions.
Log file location: /u01/app/oracle/product/19c/db_1/cfgtoollogs/opatch/opatch2022-05-16_17-13-40PM_1.log

OPatch succeeded.
  1. 如果有错误,请参阅README.html

3.7. 加载变化的SQL到数据库

OPatchAuto 自动调用 datapatch 完成安装数据库的二进制补丁并自动开始 post patch 的操作。
安装前仔细阅读 README.html,以下步骤执行的时间依据数据库的大小不同而有所差异。
安装补丁之后,还需要将有变化的SQL加载到数据库中,这里可以直接运行Datapatch工具将这些修改的SQL重新加载到数据库中,如果是RAC环境,只需要在一个节点执行就可以了。
根据readme的说明,操作步骤如下:

~]$ sqlplus /nolog
SQL> connect / as sysdba
SQL> startup
SQL> alter pluggable database all open;
SQL> quit
~]$ cd $ORACLE_HOME/OPatch
~]$ ./datapatch -verbose

输出内容如下:

SQL Patching tool version 19.15.0.0.0 Production on Mon May 16 17:27:38 2022
Copyright (c) 2012, 2022, Oracle.  All rights reserved.

Log file for this invocation: /u01/app/oracle/cfgtoollogs/sqlpatch/sqlpatch_19342_2022_05_16_17_27_39/sqlpatch_invocation.log

Connecting to database...OK
Gathering database info...done

Note:  Datapatch will only apply or rollback SQL fixes for PDBs
       that are in an open state, no patches will be applied to closed PDBs.
       Please refer to Note: Datapatch: Database 12c Post Patch SQL Automation
       (Doc ID 1585822.1)

Bootstrapping registry and package to current versions...done
Determining current state...done

Current state of interim SQL patches:
  No interim patches found

Current state of release update SQL patches:
  Binary registry:
    19.15.0.0.0 Release_Update 220331125408: Installed
  PDB CDB$ROOT:
    Applied 19.3.0.0.0 Release_Update 190410122720 successfully on 04-APR-22 04.21.43.927999 PM
  PDB ETDB1:
    Applied 19.3.0.0.0 Release_Update 190410122720 successfully on 04-APR-22 04.28.11.473105 PM
  PDB PDB$SEED:
    Applied 19.3.0.0.0 Release_Update 190410122720 successfully on 04-APR-22 04.28.11.473105 PM
  PDB STUDY:
    Applied 19.3.0.0.0 Release_Update 190410122720 successfully on 04-APR-22 04.28.11.473105 PM

Adding patches to installation queue and performing prereq checks...done
Installation queue:
  For the following PDBs: CDB$ROOT PDB$SEED STUDY ETDB1
    No interim patches need to be rolled back
    Patch 33806152 (Database Release Update : 19.15.0.0.220419 (33806152)):
      Apply from 19.3.0.0.0 Release_Update 190410122720 to 19.15.0.0.0 Release_Update 220331125408
    No interim patches need to be applied

WARNING: Following components are NOT in a valid state.
         This could cause patching failure. If it does, consider
         running utlrp.sql to bring components to VALID state.
         Then, re-run datapatch.

         ETDB1 : SDO [INVALID]
         PDB$SEED : SDO [INVALID]

Installing patches...
Patch installation complete.  Total patches installed: 4

Validating logfiles...done
Patch 33806152 apply (pdb CDB$ROOT): SUCCESS
  logfile: /u01/app/oracle/cfgtoollogs/sqlpatch/33806152/24713297/33806152_apply_ZYZH_CDBROOT_2022May16_17_28_21.log (no errors)
Patch 33806152 apply (pdb PDB$SEED): SUCCESS
  logfile: /u01/app/oracle/cfgtoollogs/sqlpatch/33806152/24713297/33806152_apply_ZYZH_PDBSEED_2022May16_17_34_44.log (no errors)
Patch 33806152 apply (pdb STUDY): SUCCESS
  logfile: /u01/app/oracle/cfgtoollogs/sqlpatch/33806152/24713297/33806152_apply_ZYZH_STUDY_2022May16_17_34_44.log (no errors)
Patch 33806152 apply (pdb ETDB1): SUCCESS
  logfile: /u01/app/oracle/cfgtoollogs/sqlpatch/33806152/24713297/33806152_apply_ZYZH_ETDB1_2022May16_17_34_44.log (no errors)

Automatic recompilation incomplete; run utlrp.sql to revalidate.
  PDBs: CDB$ROOT ETDB1 PDB$SEED STUDY
自动重新编译 incomplete ; 运行 utlrp.sql 重新验证。

SQL Patching tool complete on Mon May 16 17:40:03 2022

datapatch 命令只对打开的数据库生效,所有Oracle建议在执行该命令之前将CDB和所有的PDB都打开,一次更新掉。 但如果有部分PDB没有打开,也可以在打开之后,重新运行 datapatch 命令并制定pdb实例名,比如: ./datapatch -pdbs catpdb

检查 $ORACLE_HOME/sqlpatch/33806152/ 中的以下日志文件是否有错误

33806152_apply_<database SID>_<CDB name>_<timestamp>.log
# 其中,database SID是数据库 SID,CDBname 是多租户容器数据库的名称,时间戳是 YYYYMMMDD_HH_MM_SS 形式。

3.8. 处理无效对象

任何在执行datapatch后有无效对象的数据库都应该运行utlrp.sql来重新验证这些对象。 例如:

~]$ cd $ORACLE_HOME/rdbms/admin
~]$ sqlplus /nolog
SQL> CONNECT / AS SYSDBA
SQL> @utlrp.sql

输出内容如下:

ERRORS DURING RECOMPILATION
---------------------------
              0

Function created.

PL/SQL procedure successfully completed.

Function dropped.

PL/SQL procedure successfully completed.

3.9. Upgrade Oracle Recovery Manager Catalog

如果您使用的是 Oracle Recovery Manager,则需要升级目录。 输入以下命令进行升级。 UPGRADE CATALOG 命令必须输入两次以确认升级。

~]$ rman catalog username/password@alias
RMAN> UPGRADE CATALOG;
RMAN> UPGRADE CATALOG;
RMAN> EXIT;

3.10. 最后检查升级后的数据库版本

SET LINES 120 PAGES 999 HEADING OFF
COL con_id            FORMAT 999   HEADING "ContainerID"    NEWLINE
COL banner            FORMAT a120  HEADING "Banner"         NEWLINE
COL banner_full       FORMAT a120  HEADING "Banner Full"    NEWLINE
COL banner_legacy     FORMAT a20   HEADING "Banner Legacy"  NEWLINE

SELECT 'ContainerID :  '  || con_id,
       'Banner      :  '  || banner,
       'Banner Full :  '  || banner_full,
       'Banner Legacy: '  || banner_legacy
  FROM v$version;

file