如何在运行 Oracle 19c 的 Amazon RDS 实例上使用 DBMS_QOPATCH?

4 分钟阅读
0

我有一个运行 Oracle 19c 的 Amazon Relational Database Service (Amazon RDS) 实例。我应如何在 Amazon RDS for Oracle 上使用可查询补丁清单 (DBMS_QOPATCH) 功能?

简短描述

Oracle 19c 包含可查询补丁清单功能。该功能允许用户使用 DBMS_QOPATCH 程序包从数据库中检索 Oracle 软件清单信息。有关更多信息,请参阅适用于 DBMS_QOPATCH 的 Oracle 文档。

在早期版本的 Oracle 中,用户只能使用 Oracle OPatch 实用程序检索软件清单的信息。由于 Amazon RDS 限制对底层操作系统 (OS) 的访问,因此先前的版本无法运行 OPatch 实用程序。在带有 Amazon RDS 的 Oracle 19c 中,任何具有运行 DBMS_QOPATCH 包权限的用户都可以检索 Oracle 软件库存信息。

**注意:**Amazon RDS 现在包含一项功能,允许您从日志文件访问 OPatch 文件。对于 2020 年或之后发布的 Oracle 实例,此功能已启用。如果您的 Oracle 实例是在 2020 年或之后发布的,那么使用此功能是最佳实践。有关更多信息,请参阅访问 OPatch 文件

解决方法

可查询补丁清单使用现有功能,例如 XML 支持和外部表。这些示例显示了可查询补丁清单的工作原理。

在此例中,对三个新目录对象运行 OPATCH 查询:

SQL> select owner,directory_name,directory_path from dba_directories where directory_name like 'OPATCH%'

这是从查询获得的输出示例:

OWNER      DIRECTORY_NAME       DIRECTORY_PATH
---------- -------------------- --------------------------------------------------
SYS        OPATCH_SCRIPT_DIR    /rdsdbbin/oracle/QOpatch
SYS        OPATCH_LOG_DIR       /rdsdbbin/oracle/QOpatch
SYS        OPATCH_INST_DIR      /rdsdbbin/oracle/OPatch

在此例中,对四个新系统表运行 OPATCH 查询:

SQL> select owner,table_name from dba_tables where table_name like 'OPATCH%';

这是从查询获得的输出示例:

OWNER           TABLE_NAME
--------------- ------------------------------
SYS             OPATCH_XML_INV
SYS             OPATCH_XINV_TAB
SYS             OPATCH_INST_PATCH
SYS             OPATCH_SQL_PATCHES
SYS             OPATCH_INST_JOB

主表是 OPATCH_XML_INV,它是从 XML 格式的清单提取的完整信息。该表作为从清单读取的外部表来实施:

SQL> select dbms_metadata.get_ddl('TABLE','OPATCH_XML_INV','SYS') from dual;

这是从查询获得的输出示例:

DBMS_METADATA.GET_DDL('TABLE','OPATCH_XML_INV','SYS')
--------------------------------------------------------------------------------

  CREATE TABLE "SYS"."OPATCH_XML_INV"
   (    "XML_INVENTORY" CLOB
   )
   ORGANIZATION EXTERNAL
    ( TYPE ORACLE_LOADER
      DEFAULT DIRECTORY "OPATCH_SCRIPT_DIR"
      ACCESS PARAMETERS
      ( RECORDS DELIMITED BY NEWLINE CHARACTERSET UTF8
      DISABLE_DIRECTORY_LINK_CHECK
      READSIZE 8388608
      preprocessor opatch_script_dir:'qopiprep.bat'
      BADFILE opatch_script_dir:'qopatch_bad.bad'
      LOGFILE opatch_log_dir:'qopatch_log.log'
      FIELDS TERMINATED BY 'UIJSVTBOEIZBEFFQBL'
      MISSING FIELD VALUES ARE NULL
      REJECT ROWS WITH ALL NULL FIELDS
      (
    xml_inventory     CHAR(100000000)
      )
    )
      LOCATION
       ( "OPATCH_SCRIPT_DIR":'qopiprep.bat'
       )
    )
   REJECT LIMIT UNLIMITED

该实施由 PREPROCESSOR 脚本 qopiprep.bat 完成。此脚本位于 OPATCH_SCRIPT_DIR 所指向的目录中。有关更多信息,请参阅适用于 PREPROCESSOR 的 Oracle 文档。请参阅以下使用 OPATCH_SCRIPT_DIR 的查询示例:

SQL> select owner,directory_name,directory_path from dba_directories where directory_name='OPATCH_SCRIPT_DIR';

这是从查询获得的输出示例:

OWNER           DIRECTORY_NAME                     DIRECTORY_PATH
--------------- ---------------------------------  ----------------------------------------
SYS             OPATCH_SCRIPT_DIR                  /rdsdbbin/oracle/QOpatch

qopiprep.bat 脚本运行可查询补丁清单。然后,它以 XML 格式生成输出,以便该输出可用作外部表 OPATCH_XML_INV 的输入。然后,DBMS_QOPATCH 提供的程序包和功能可用于从表中提取 Oracle 清单信息。要查看 DBMS_QOPATCH 程序包提供的功能和程序,请参阅适用于 DBMS_QOPATCH 子程序摘要的 Oracle 文档。

运行以下查询以列出所有已安装的补丁:

with a as (select dbms_qopatch.get_opatch_lsinventory patch_output from dual) 
select x.patch_id, x.patch_uid, x.description from a, 
xmltable('InventoryInstance/patches/*' passing a.patch_output columns 
patch_id number path 'patchID', 
patch_uid number path 'uniquePatchID', 
description varchar2(80) path 'patchDescription') x;

这是从查询获得的输出示例:

PATCH_ID     PATCH_UID  DESCRIPTION
----------   ---------- ---------------------------------------------------------------
33613833     24537804   DSTV37 UPDATE - TZDATA2021E - NEED OJVM FIX
33613829     24529874   RDBMS - DSTV37 UPDATE - TZDATA2021E
32327201     24049836   RDBMS - DSTV36 UPDATE - TZDATA2020E
31335037     23600477   RDBMS - DSTV35 UPDATE - TZDATA2020A
29997937     23062124   RDBMS - DSTV34 UPDATE - TZDATA2019B
28852325     23061696   RDBMS - DSTV33 UPDATE - TZDATA2018G
29213893     24595383   DBMS_STATS FAILING WITH ERROR ORA-01422 WHEN GATHERING STATS FOR USER$ TABLE
28730253     23062304   SUPPORT NEW ERA REIWA FOR JAPANESE IMPERIAL CALENDAR
33561310     24538862   OJVM RELEASE UPDATE: 19.14.0.0.220118 (33561310)
33515361     24589353   Database Release Update : 19.14.0.0.220118 (33515361)
29585399     22840393   OCW RELEASE UPDATE 19.3.0.0.0 (29585399)

要获取格式与 opatch lsinventory -detail 相似的更详细的输出,请运行以下命令:

set long 200000 pages 0 lines 200
select xmltransform(DBMS_QOPATCH.GET_OPATCH_LSINVENTORY, DBMS_QOPATCH.GET_OPATCH_XSLT) from dual;

这是从查询获得的输出示例:

Oracle Querayable Patch Interface 1.0
--------------------------------------------------------------------------------
Oracle Home : /rdsdbbin/oracle
Inventory : /rdsdbbin/oraInventory
--------------------------------------------------------------------------------Installed Top-level Products (1):
19.0.0.0.0
Installed Products ( 128)
Oracle Database 19c 19.0.0.0.0
Java Development Kit 1.8.0.201.0
oracle.swd.oui.core.min 12.2.0.7.0
Installer SDK Component 12.2.0.7.0
Oracle One-Off Patch Installer 12.2.0.1.15
Oracle Universal Installer 12.2.0.7.0
oracle.swd.commonlogging 13.3.0.0.0
Trace File Analyzer for DB 19.0.0.0.0
Oracle USM Deconfiguration 19.0.0.0.0
Oracle DBCA Deconfiguration 19.0.0.0.0
...
...
Oracle Advanced Security 19.0.0.0.0
Oracle Internet Directory Client 19.0.0.0.0
Oracle Net Listener 19.0.0.0.0
HAS Files for DB 19.0.0.0.0
Oracle Database Provider for DRDA 19.0.0.0.0
Oracle Text 19.0.0.0.0
Oracle Net Services 19.0.0.0.0
Oracle Database 19c 19.0.0.0.0
Oracle OLAP 19.0.0.0.0
Oracle Spatial and Graph 19.0.0.0.0
Oracle Partitioning 19.0.0.0.0
Enterprise Edition Options 19.0.0.0.0

Interim patches:

Patch 33613833: applied on 2022-02-07T08:53:35Z
Unique Patch ID: 24537804
Patch Description: DSTV37 UPDATE - TZDATA2021E - NEED OJVM FIX
Created on : 9 Dec 2021, 01:32:48 hrs PST8PDT
Bugs fixed:
33613833 
Files Touched:

tzdb.dat
fixTZa.sql
fixTZb.sql

... 
...

DBMS_QOPATCH 程序包还提供了以下程序和功能。运行以下命令以验证是否安装了特定的补丁:

select xmltransform(dbms_qopatch.is_patch_installed('<patch number>'), dbms_qopatch.get_opatch_xslt) from dual;

运行以下命令以获取已安装补丁修复的错误列表:

select xmltransform(dbms_qopatch.get_opatch_bugs, dbms_qopatch.get_opatch_xslt) from dual;

运行以下命令列出由特定补丁号修复的错误:

select xmltransform(dbms_qopatch.get_opatch_bugs(<patch number>), dbms_qopatch.get_opatch_xslt) from dual;

相关信息

管理您的 Oracle 数据库实例

AWS 官方
AWS 官方已更新 1 年前