Skip to Main Content

 

Auswahl  

Oracle 12c Datenbank Patchstand abfragen 

Oracle
DBA
RDBMS 12.2
25.06.18 (MP)
07.07.23(NN)
DBA, Oracle Neuerungen 12C Release 1

Passende Schulungen zum Thema

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.