Oracle 12c Datenbank Patchstand abfragen

01.
Februar
2016
Veröffentlicht von: Christian Klose

Ab Oracle 12c gibt es das neue Utility datapatch (unter $ORACLE_HOME/OPatch) und die dazugehörigen Datenbankobjekte

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. 

 

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 Opens window for sending emailConsulting-Team gerne zur Verfügung.

Patchstand OPatch Analyse

Jede Menge Know-how für Sie!

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.