Ab Oracle 12c gibt es das neue Utility datapatch (unter $ORACLE_HOME/OPatch) und die dazugehörigen Datenbankobjekte:
Hinweis
Sie benötigen SYS-Rechte um mit dem Package DBMS_QOPATCH arbeiten zu können.
Viele Oracle Patche, inclusive PSU's benötigen zwei Schritte zur Implementierung:
Erster Schritt
Mit dem OPatch Utility wird das entsprechende Oracle Home gepatcht.
Zweiter Schritt
Die Patche müssen in allen, von $ORACLE_HOME abhängigen Datenbanken installiert werden.
Bis Oracle 11g wurde der zweite Schritt wie folgt durchgeführt:
SQL> @catbundle.sql psu apply
Ab Oracle 12c wird Schritt zwei folgendermaßen durchgeführt:
cd $ORACLE_HOME/OPatch
./datapatch -verbose
Bei der Erstellung einer 12c Datenbank werden drei Directories erstellt:
set linesize 200
col owner format A6
col directory_name format A20
col directory_path format A40
select owner, directory_name, directory_path
from dba_directories
where directory_name like 'OPATCH%' order by 2;
OWNER DIRECTORY_NAME DIRECTORY_PATH
------ -------------------- ----------------------------------------
SYS OPATCH_INST_DIR /u01/oracle/product/12.1.0/db_1/Opatch
SYS OPATCH_LOG_DIR /u01/oracle/product/12.1.0/db_1/QOpatch
SYS OPATCH_SCRIPT_DIR /u01/oracle/product/12.1.0/db_1/QOpatch
Im Verzeichnis $ORACLE_HOME/QOpatch liegt die Batch-Datei qopiprep.bat und die Logdatei qopatch_log.log. Das OPatch Utility benutzt die Datei qopiprep.bat unter UNIX, Linux und Windows. Mit der Datei qopiprep.bat erstellt Oracle die externe Tabelle OPATCH_XML_INV.
select owner, table_name
from dba_external_tables
where table_name like 'OPATCH%' order by 1,2
;
OWNER TABLE_NAME
------ ------------------------------
SYS OPATCH_XML_INV
Die Abfrage auf die Tabelle OPATCH_XML_INV liefert einen XMLTYP als Ergebnis.
select * from OPATCH_XML_INV;
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <InventoryInstance>
<oracleHome> <UId>OracleHome-650ace1c-2c85-4c42-94c2-e2d25e223f55</UId>
<targetTypeId>oracle_home</targetTypeId> <inventoryLocation>/u01/oraInventory
</inventoryLocation>
.
.
.
(Ausgabe abgeschnitten)
Mit dem Package DBMS_QOPATCH lässt sich die Ausgabe komfortabler gestalten.
Als Beispiel wird abgefragt, ob der Patch 22139235 installiert ist:
select
xmltransform(dbms_qopatch.is_patch_installed('22139235'),
dbms_qopatch.get_opatch_xslt)
from dual;
Patch Information:
22139235: applied on 2016-01-25T17:42:27+01:00
select xmltransform(dbms_qopatch.get_opatch_bugs, dbms_qopatch.get_opatch_xslt) from dual;
Bugs fixed:
18093615 17716305 17257820 17034172 16694728 16042673 18096714
17439871 16320173 14664684 17762256 18002100 18436307 16450169
17006570 17753428 17552800
.
.
.
(Ausgabe abgeschnitten)
Das Equivalent vom Betriebssystem Kommando opatch lsinventory lautet von SQL:
select xmltransform(dbms_qopatch.get_opatch_lsinventory, dbms_qopatch.get_opatch_xslt)
from dual;
Oracle Querayable Patch Interface 1.0
--------------------------------------------------------------------------------
Oracle Home : /u01/oracle/product/12.1.0/db_1
Inventory : /u01/oraInventory
--------------------------------------------------------------------------------
Installed Top-level Products (1): 12.1.0.1.0
Installed Products ( 120)
Oracle Database 12c 12.1.0.1.0
.
.
.
(Ausgabe abgeschnitten)
Abfragen aller installierter PSU's:
col applied_date format A27
col description format A55
col sql_patch format A10
with a as (select dbms_qopatch.get_opatch_lsinventory patch_output from dual)
select x.*
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',
applied_date varchar2(30) path 'appliedDate',
sql_patch varchar2(8) path 'sqlPatch',
rollbackable varchar2(8) path 'rollbackable'
) x
;
PATCH_ID PATCH_UID DESCRIPTION
APPLIED_DATE SQL_PATCH ROLLBACKABLE
---------- ---------- -------------------------------------------------------
--------------------------- ---------- ---------------
22139235 19705919 OJVM PATCH SET UPDATE 12.1.0.1.160119
2016-01-25T17:42:27+01:00 true true
21951844 19567210 Database Patch Set Update : 12.1.0.1.160119 (21951844)
2016-01-25T17:38:39+01:00 true true
21352619 19194200 Database Patch Set Update : 12.1.0.1.9 (21352619)
2016-01-25T17:38:36+01:00 true true
20831107 18888731 Database Patch Set Update : 12.1.0.1.8 (20831107)
2015-07-27T21:15:32+02:00 true true
20299016 18536956 Database Patch Set Update : 12.1.0.1.7 (20299016)
2015-07-27T21:15:26+02:00 true true
19769486 18246488 Database Patch Set Update : 12.1.0.1.6 (19769486)
2015-02-05T07:03:16+01:00 true true
6 rows selected
Hinweis:
Ab 2016 hat sich die Logik der Patchnummern geändert. 12.1.0.1.160119, es wird nun das Datum (YYMMDD, also 19.01.2016) der Veröffentlichung verwendet.
Fazit:
Mit dem Package DBMS_QOPATCH ist die Möglichkeit gegeben, unabhängig vom Betriebssystem, per SQL die Patchstände abzufragen. Weitere Abfragekombinationen (z. B.: ist das $ORACLE_HOME und die dazugehörige Instanz gepatcht) sind möglich. Für weitere Unterstützung steht Ihnen unser Consulting-Team gerne zur Verfügung.
In unserer Know-How Datenbank finden Sie mehr als 300 ausführliche Beiträge zu den
Oracle-Themen wie DBA, SQL, PL/SQL, APEX und vielem mehr.
Hier erhalten Sie Antworten auf Ihre Fragen.