Ab Oracle 12c gibt es das neue Utility datapatch (unter $ORACLE_HOME/OPatch) und die dazugehörigen Datenbankobjekte:
- View DBA_REGISTRY_SQLPATCH
- externe Tabelle OPATCH_XML_INV
- Package DBMS_QOPATCH
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.
In Version 18c in der Express Edition funktioniert die Vorgensweise leider nicht mehr.
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.