如何在运行 Oracle 12c 的 Amazon RDS 实例上使用 DBMS_QOPATCH?
上次更新时间:2019 年 6 月 18 日
我有一个运行 Oracle 12c 的 Amazon Relational Database Service (Amazon RDS) 实例。我应如何在 Amazon RDS for Oracle 上使用可查询修补程序清单 (DBMS_QOPATCH) 功能?
简短描述
Oracle 12c 包含可查询修补程序清单功能,可供用户使用 DBMS_QOPATCH 程序包从数据库中检索 Oracle 软件清单信息。有关更多信息,请参阅适用于 DBMS_QOPATCH 的 Oracle 文档。在早期版本的 Oracle 中,用户只能使用 Oracle OPatch 实用程序检索软件清单的信息。由于 Amazon RDS 限制对底层操作系统 (OS) 的访问,因此用户无法运行 OPatch 实用程序。当您将 Oracle 12c 用于 Amazon RDS 时,任何有权执行 DBMS_QOPATCH 程序包的用户都可以检索 Oracle 软件清单信息。
解决方法
可查询修补程序清单使用现有功能,例如 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_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
---------- ---------- ------------------------------------------------------------------------
17969866 20266857
18307021 17688457
22873666 20307375
22873635 20173886
22037014 19477445
20875898 18862169
19396455 18018276
18759211 18703381
17432124 16852639
16799735 18509762
23177536 20400035 Database PSU 12.1.0.2.160719, Oracle JavaVM Component (JUL2016)
23054246 20464632 Database Patch Set Update : 12.1.0.2.160719 (23054246)
22291127 19694308 Database Patch Set Update : 12.1.0.2.160419 (22291127)
21948354 19553095 Database Patch Set Update : 12.1.0.2.160119 (21948354)
21359755 19194568 Database Patch Set Update : 12.1.0.2.5 (21359755)
20831110 18977826 Database Patch Set Update : 12.1.0.2.4 (20831110)
20299023 18703022 Database Patch Set Update : 12.1.0.2.3 (20299023)
19769480 18350083 Database Patch Set Update : 12.1.0.2.2 (19769480)
要获取格式与 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):
Oracle Database 12c 12.1.0.2.0
Installed Products ( 135)
Oracle Database 12c 12.1.0.2.0
Java Development Kit 1.6.0.75.0
oracle.swd.oui.core.min 12.1.0.2.0
Installer SDK Component 12.1.0.2.0
Oracle One-Off Patch Installer 12.1.0.1.2
Oracle Universal Installer 12.1.0.2.0
Oracle USM Deconfiguration 12.1.0.2.0
Oracle Configuration Manager Deconfiguration 10.3.1.0.0
Oracle RAC Deconfiguration 12.1.0.2.0
Oracle DBCA Deconfiguration 12.1.0.2.0
...
...
Oracle OLAP 12.1.0.2.0
Oracle Spatial and Graph 12.1.0.2.0
Oracle Partitioning 12.1.0.2.0
Enterprise Edition Options 12.1.0.2.0
Interim patches:
Patch 17969866: applied on 2016-08-12T08:33:09Z
Unique Patch ID: 20266857
Patch Description:
Created on : 9 Jun 2016, 10:44:53 hrs PST8PDT
Bugs fixed:
17969866
Files Touched:
/qctox.o
/qmxtgx.o
/qmxtxa.o
/qmudx.o
ins_net_client.mk
/koks2.o
/qmxstr.o
ins_rdbms.mk
ins_rdbms.mk
...
...
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;