Logo Oracle Deutschland September 2016
Datenbank Version & Patch Level mit SQL ermitteln
von Sebastian Solbach

Wenn Entwickler in der heutigen Zeit Zugriff auf eine Datenbank beantragen, bekommen Sie von der IT Abteilung meist einen Benutzer, Passwort und einen fertigen Connect String mit dem man sich direkt an der "aktuellen" Datenbank anmeldet. Dabei ist es aber auch für den Entwickler wichtig zu wissen, welche Version und häufig auch welchen genauen Patch Level die Datenbank hat, mit der er sich verbindet. Schließlich sind bestimmte Funktionen erst mit aktuellen Patch Set Updates verfügbar. So wie zum Beispiel bei der mit 12.1.0.2 eingefürten JSON Unterstützung. Diese wurde mit jedem PSU der 12.1.0.2 Datenbank erheblich verbessert, so dass jeder Entwickler, der mit Oracle 12c und JSON arbeiten möchte zumindest auf 12.1.0.2.BP:160719 sein sollte. Auch für Testzwecke, Datenübertragung und Client Kompatibilität ist es wichtig möglichst die gleiche Versions zu verwenden. Damit stellt sich die Frage, wie man am einfachsten an diese Informationen herankommt - am Besten mit einem SQL Befehl.

Für den Datenbankadministrator hingegen ist es im Normalfall sehr einfach diese Informationen zu bekommen, hat er doch direkten Zugriff auf das Betriebssystem und kann damit leicht über das OPATCH Utility den genauen Stand der Software in Erfahrung bringen. Näheres dazu finden Sie auch in den Community Artikeln zu OPatch.

Allerdings hat durch die zur Zeit stattfindenden Entwicklung selbst der DBA nur noch bedingt Zugriff auf das Betriebssystem und damit direkt auf OPATCH. Gerade im Zuge von Database as a Service in der Cloud bekommt auch der DBA nur noch einen Datenbank Service und die Wartung übernimmt der Cloud Betreiber. Um so wichtiger genau zu wissen, welche Oracle Version und welcher Patch Level vorliegt. Denn wenn Datenbanken via Backup/Restore oder anderen Mechanismen in die Cloud kopiert werden sollen, ist es am einfachsten, wenn die Releases und Patchstände übereinstimmen. In der zum Zeitpunkt des Tipps vorliegenden DBaaS Version von Oracle ist zum Beispiel der genaue Patch Level aus der DBaaS Console leider nicht ersichtlich oder nur indirekt, wenn neuere PSUs zum Patch angeboten werden.

Noch deutlicher wird dieses Thema des fehlenden Zugriff auf das Betriebssystem mit Oracle Multitenant: Ein Datenbank Administrator einer Pluggable Datenbank hat aus sicherheitstechnischen Gründen nur selten einen Zugriff auf die darunterliegende Container Datenbank. Auf der anderen Seite gibt es einfache Transport und Upgrade Mölichkeiten einer PDB zwischen CDBs. Beides zusammen macht es notwendig, die genaue Datenbank Version und Patch Level mit Hilfe von SQL abfragen zu können.

Der neue Oracle Exadata Express Cloud Service kombiniert dann Cloud und Multitenant: Kunden, die diesen Service nutzen, bekommen einen DBA Zugang für eine PDB in der Cloud, aber keinen Zugriff auf das OS und CDB. Außerdem übernimmt Oracle die Wartung komplett vom Benutzer unabhängig.

Datenbank Version und Funktionen in SQL und PL/SQL

Bevor wir uns um den genauen Patch Level kümmern, erst einmal die Abfragen zu generellen Informationen der Datenbank. Hierbei werden die beiden interessantesten Views ALL_BANNERS und DBA_REGISTRY jeweils beide von der Tabelle registry$ gespeist und zeigen die installierten Datenbankfunktionen an. In 12.1 gibt es aber den Unterschied, dass ALL_BANNERS nur die aktiven Funktionen, DBA_REGISTRY aber auch ausgeschaltete Funktionen mit anzeigt:

SQL> select * from all_registry_banners;

BANNER                                                                         
--------------------------------------------------------------------------------
Oracle Database Catalog Views Release 12.1.0.2.0 - 64bit Production             
Oracle Database Packages and Types Release 12.1.0.2.0 - Production              
Oracle XML Database Version 12.1.0.2.0 - Production                             
Oracle Workspace Manager Release 12.1.0.2.0 - Production                        
JServer JAVA Virtual Machine Release 12.1.0.2.0 - Production                    
Oracle XDK Release 12.1.0.2.0 - Production                                      
Oracle Database Java Packages Release 12.1.0.2.0 - Production                   
Oracle Text Release 12.1.0.2.0 - Production                                     
Oracle Multimedia Release 12.1.0.2.0 - Production                               
OLAP Analytic Workspace Release 12.1.0.2.0 - Production                         
Oracle OLAP API Release 12.1.0.2.0 - Production                                 
Spatial Release 12.1.0.2.0 - Production                                         
Oracle Label Security Release 12.1.0.2.0 - Production                           
Oracle Database Vault Release 12.1.0.2.0 - Production                           
Oracle Application Express Release 5.0.0.00.31 - Production                     

SQL> select comp_id,comp_name,version,status,modified,schema from dba_registry;

COMP_ID  COMP_NAME                                VERSION      STATUS      MODIFIED                SCHEMA        
-------- ---------------------------------------- ------------ ----------- ----------------------- ---------------
APEX     Oracle Application Express               5.0.0.00.31  VALID       26-SEP-2016 13:00:20    APEX_050000    
OLS      Oracle Label Security                    12.1.0.2.0   VALID       29-JUN-2016 11:42:18    LBACSYS        
DV       Oracle Database Vault                    12.1.0.2.0   VALID       29-JUN-2016 11:42:19    DVSYS          
ORDIM    Oracle Multimedia                        12.1.0.2.0   VALID       29-JUN-2016 11:42:14    ORDSYS         
CONTEXT  Oracle Text                              12.1.0.2.0   VALID       29-JUN-2016 11:42:13    CTXSYS         
OWM      Oracle Workspace Manager                 12.1.0.2.0   VALID       29-JUN-2016 11:42:11    WMSYS          
SDO      Spatial                                  12.1.0.2.0   VALID       29-JUN-2016 11:42:17    MDSYS          
XDB      Oracle XML Database                      12.1.0.2.0   VALID       29-JUN-2016 11:42:08    XDB            
CATALOG  Oracle Database Catalog Views            12.1.0.2.0   VALID       29-JUN-2016 11:42:05    SYS            
CATPROC  Oracle Database Packages and Types       12.1.0.2.0   VALID       29-JUN-2016 11:42:06    SYS            
JAVAVM   JServer JAVA Virtual Machine             12.1.0.2.0   VALID       29-JUN-2016 11:47:54    SYS            
XML      Oracle XDK                               12.1.0.2.0   VALID       29-JUN-2016 11:42:12    SYS            
CATJAVA  Oracle Database Java Packages            12.1.0.2.0   VALID       29-JUN-2016 11:42:12    SYS            
APS      OLAP Analytic Workspace                  12.1.0.2.0   VALID       29-JUN-2016 11:42:14    SYS            
XOQ      Oracle OLAP API                          12.1.0.2.0   VALID       29-JUN-2016 11:42:16    SYS            
RAC      Oracle Real Application Clusters         12.1.0.2.0   OPTION OFF  07-JUL-2014 06:52:28    SYS            
Beide Views sind auch in 11.2 und älteren Versionen noch zu finden.

Aber auch aus PL/SQL heraus ist es möglich die aktuelle Version zu erfahren. 2 Möglichkeiten sind hier die Packages DBMS_UTILITY oder DBMS_DB_VERSION.
SQL> var version varchar2(20);
SQL> var compatibility varchar2(20);
SQL> exec DBMS_UTILITY.DB_VERSION(:version,:compatibility);
SQL> print version;

VERSION
-------
12.1.0.2.0

SQL> print compatibility;

COMPATIBILITY
-------------
12.1.0.2.0
Leider kann man damit aber auch nur die Version, nicht jedoch den PSU Stand auslesen.

Installierte Patches und Patch Set Updates

Reine Software Only Patches sind in der Datenbank direkt leider nicht sichtbar. Allerdings haben Patch Set Updates und Bundle Patches immer die Notwendigkeit an einigen Datenbank Objekten oder Daten Änderungen vorzunehmen. Dem einen oder anderen wird der Umstand, dass nach einem Patch Set Update der 12c Datenbank immer "datapatch.pl" aufgerufen werden muss, bekannt sein: "Datapatch.pl" muss manchmal manuell nachgeholt werden, wie hier im Oracle Upgrade Blog beschrieben. Auch in 11.2 gab es damals ein ähnliches Skript: catpatch.sql.

Das Ausführen dieser SQLs wird dabei von der Datenbank protokolliert. In 12c verlässlich in der View "DBA_REGISTRY_SQLPATCH" während in 11.2 noch "DBA_REGISTRY_HISTORY" zum Einsatz kam. Allerdings protokollierte DBA_REGISTRY_HISTORY dabei nur kritische Patches und Upgrades, nicht jedes SQLPatch, wie dies die bei der neuen View in 12c der Fall ist. Dies kann man in einer 12c Datenbank auch beobachten, da nur der OJVM Patch als "kritisch" in Bezug auf DBA_REGISTRY_HISTORY eingestuft wird, während andere PSUs nicht zu finden sind:

SQL> select PATCH_ID, PATCH_UID, VERSION, STATUS, BUNDLE_SERIES, BUNDLE_ID, DESCRIPTION from DBA_REGISTRY_SQLPATCH;

  PATCH_ID  PATCH_UID VERSION    STATUS   BUNDLE_SERIES  BUNDLE_ID DESCRIPTION                                                          
---------- ---------- ---------- -------- ------------- ---------- ------------------------------------------------------
  22674709   20057886 12.1.0.2   SUCCESS                           Database PSU 12.1.0.2.160419, Oracle JavaVM Component        
  22291127   19694308 12.1.0.2   SUCCESS  PSU               160419 Database Patch Set Update : 12.1.0.2.160419 (22291127)                
  23617395   20319266 12.1.0.2   SUCCESS                                                                                                        


SQL> select action_time, action, version, comments from dba_registry_history;

ACTION_TIME       ACTION                         VERSION                   COMMENTS           
----------------- ------------------------------ ------------------------- --------------------
29.06.16 11:40:48 jvmpsu.sql                     12.1.0.2.160419OJVMPSU    RAN jvmpsu.sql      
In 11.2 gibt die View mehr Auskünfte auch über PSUs:
SQL> select action_time, action, version, comments from dba_registry_history

ACTION_TIME            ACTION  VERSION      COMMENTS
--------------------- ------- ------------ --------------------
24-AUG-13 12.03.45 PM   APPLY   11.2.0.4     Patchset 11.2.0.2.0
28-NOV-13 06.01.43 PM   APPLY   11.2.0.4     Patchset 11.2.0.2.0

Zugriff auf OPatch aus der Datenbank

Da in beiden Views, wie oben schon beschrieben, leider keine reinen Software Patches auftauchen, bietet 12.1 die Möglichkeit aus der Datenbank heraus OPatch aufzurufen. Dies geschieht über das Package dbms_qopatch vom Benutzer SYS. Daher hat leider auch nur ein SYSDBA auf dieses Package Zugriff. Über die Prozedur GET_SQLPATCH_STATUS des Packages können die gleichen Informationen von OPatch abgefragt werden, die oben in DBA_REGISTRY_SQLPATCH zu sehen waren:

SQL> set serveroutput on;
SQL> exec dbms_qopatch.get_sqlpatch_status;

Patch Id : 22674709
	Action : APPLY
	Action Time : 29-JUN-2016 11:48:34
	Description : Database PSU 12.1.0.2.160419, Oracle JavaVM Component (Apr2016)
	Logfile : /u01/app/oracle/cfgtoollogs/sqlpatch/22674709/20057886/22674709_apply_ORCL_CDBROOT_2016Jun29_11_47_52.log
	Status : SUCCESS

Patch Id : 22291127
	Action : APPLY
	Action Time : 29-JUN-2016 11:48:34
	Description : Database Patch Set Update : 12.1.0.2.160419 (22291127)
	Logfile : /u01/app/oracle/cfgtoollogs/sqlpatch/22291127/19694308/22291127_apply_ORCL_CDBROOT_2016Jun29_11_47_54.log
	Status : SUCCESS

Patch Id : 23617395
	Action : APPLY
	Action Time : 29-JUN-2016 11:48:35
	Description : 
	Logfile : /u01/app/oracle/cfgtoollogs/sqlpatch/23617395/20319266/23617395_apply_ORCL_CDBROOT_2016Jun29_11_48_15.log
	Status : SUCCESS
Eine Auflistung aller installierten Patches, auch der Software only, erhält man dabei über GET_OPATCH_LIST:
SQL> set long 10000
SQL> set pages 1000
SQL> select xmltransform(dbms_qopatch.get_opatch_list, dbms_qopatch.get_opatch_xslt) from dual; 

XMLTRANSFORM(DBMS_QOPATCH.GET_OPATCH_LIST,DBMS_QOPATCH.GET_OPATCH_XSLT)
----------------------------------------------------------------------------------------

Patch Details:
         
Patch(sqlpatch) 23617395:   applied on 2016-07-06T19:20:48Z
Unique Patch ID: 20319266
  Patch Description: 
  Created on     : 28 Jun 2016, 07:09:21 hrs PST8PDT
  Bugs fixed:
...

Patch(sqlpatch) 22674709:   applied on 2016-05-06T17:34:29Z
Unique Patch ID: 20057886
  Patch Description: Database PSU 12.1.0.2.160419, Oracle JavaVM Component (Apr2016)
  Created on     : 5 Apr 2016, 08:56:18 hrs PST8PDT
  Bugs fixed:
...

Patch(sqlpatch) 22291127:   applied on 2016-05-06T17:33:25Z
Unique Patch ID: 19694308
  Patch Description: Database Patch Set Update : 12.1.0.2.160419 (22291127)
  Created on     : 6 Apr 2016, 03:46:21 hrs PST8PDT
  Bugs fixed:
...
Der Umstand, dass die genaue Auflistung der Software Only Patches nur mit Hilfe des SYSDBA funktioniert, hat Security technische Aspekte. Dies ist insoweit aber auch nur teilweise ein Nachteil, da die meisten Software Only Patches RAC Rolling Upgradable und Standby First Patchable sind. Dies bedeutet, das zwischen den Patches eine gewisse Kompatibilität herrscht, ansonsten dürfte man in RAC und Data Guard Umgebungen nicht mit unterschiedlichen Patchständen fahren.

Fazit

Heutzutage kann in der Cloud ein Service, der vor einer Woche erstellt wurde, eine ältere Version besitzen, als der aktuell beantrage Service. Dies zu Wissen ist insbesondere wichtig, wenn Daten zwischen den Services bewegt werden sollen. Aber nicht nur bei Cloud Umgebungen ist das Wissen des genauen Versionsstandes unerlässlich, auch wenn gerade kein Zugriff auf das Betriebssystem besteht.

Es ist also sehr hilfreich, dass es SQL-Kommandos gibt, die den genauen Patchstand einer Datenbank angeben. Die Ermittlung der exakten Software Only Informationen (OPatch) obliegt weiterhin dem DBA, da dies SYSDBA Rechte benögt. Aber zumindest kann auch dieses direkt in der Datenbank abgefragt werden.

Weitere Informationen

 

Zurück zum Anfang des Artikels

Zurück zur Community-Seite