Unterstützung mehrerer JDK Versionen in Oracle 12c Release 1

Oracle unterstützt mit der Einführung von Oracle 12c Release 1 mehrere JDK Versionen. Die Unterstützung umfasst eine Standardversion, bei 12c Release 1 ist dies JDK 6 und die nächst höhere Version des JDKs. Zu jedem Zeitpunkt kann aber nur eine JDK Version in einem Oracle Home aktiv sein. Es kann beliebig zwischen den Versionen hin und her gewechselt werden.

 

Demo-Umgebung

Server

Die in diesem Blogeintrag zur Demonstration verwendete Testumgebung wurde komplett mit der Virtualisierungslösung VirtualBox von Oracle realisiert und besteht aus den folgenden virtuellen Maschinen.

 #   Server   Betriebssystem   Architektur   Aufgabe 
 1   L12CR-R1-N1.dba-blog.local   Oracle Linux 6 Update 4  x86_64  1. RAC Knoten
 2   L12CR-R1-N2.dba-blog.local  Oracle Linux 6 Update 4   x86_64   2. RAC Knoten

Oracle Software

Auf den virtuellen Maschinen wurden bzw. werden die folgenden Oracle Produkte installiert.

 Software   Besitzer   Pfad 
 Grid Infrastructure 12c Release 1  grid  /u01/app/12.1.0/grid
 Oracle Database 12c Release 1  oracle  /u01/app/oracle/product/12.1.0/dbhome_1

Vorbereitung

Um den kompletten Blogeintrag demonstrieren zu können, wird eine Datenbank benötigt. Diese wurde im Vorfeld mit dem Datenbank-Konfigurationsassistenten (DBCA) angelegt. Bei der Konfiguration wurde die Standard JDK Version 6 verwendet. Die aktuelle JDK Version kann wie folgt ausgelesen werden – vorausgesetzt die Java VM Option wurde für die Datenbank installiert.

SQL> SELECT dbms_java.get_jdk_version() FROM dual;  

DBMS_JAVA.GET_JDK_VERSION() 
--------------------------- 
1.6

Für den Besitzer des Oracle Homes der Datenbank wurden die folgenden Umgebungsvariablen gesetzt.

$> export ORACLE_BASE=/u01/app/oracle 
$> export ORACLE_HOME=$ORACLE_BASE/product/12.1.0/dbhome_1 
$> export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH 
$> export PATH=$ORACLE_HOME/bin:$PATH

Konfiguration

Ich werde in diesem Blogeintrag die aktuelle JDK Version 7 aktivieren. Bevor die eigentliche Konfiguration durchgeführt werden kann, müssen alle laufenden Oracle Datenbanken in dem betroffenen Oracle Home gestoppt werden.

$> srvctl stop home -oraclehome $ORACLE_HOME -statefile /tmp/dbhome_state -node L12CR1-R1-NX

Hinweis: Im Falle einer Oracle Restart Umgebung darf der -node Parameter nicht angegeben werden.

Anschließend muss das folgende Perl Skript ausgeführt werden. Als Parameter wird die gewünschte JDK Version angegeben werden.

$> perl $ORACLE_HOME/javavm/install/update_javavm_binaries.pl 7

Hinweis: Für Oracle 12c Release 1 sind zurzeit die Werte 6 und 7 erlaubt.

Im nächsten Schritt muss Oracle neu gelinkt werden.

$> cd $ORACLE_HOME/rdbms/lib
$> make -f ins_rdbms.mk ioracle

Zum Abschluss der Konfiguration werden die Datenbanken wieder gestartet.

$> srvctl start home -oraclehome $ORACLE_HOME -statefile /tmp/dbhome_state -node L12CR1-R1-NX

Hinweis: Wie schon bei dem stop Kommando, muss der -node Parameter im Falle einer Oracle Restart Konfiguration entfernt werden.

Alle oben aufgeführten Schritte müssen auf jedem RAC Knoten wiederholt werden.

Aktualisierung Datenbank

Nach dem Neulinken der Oracle Datenbank, können die bestehenden Datenbanken nicht mehr Java verwenden. Beim Zugriff auf Java Funktionalitäten wird die folgende Fehlermeldung ausgegeben.

ORA-29548: Java-Systemklasse hat Fehler berichtet: release of classes.bin in the database does not match that of the oracle executable

Um dieses Problem zu lösen, muss das SQL Skript update_javavm_db.sql mit SYSDBA Rechten ausgeführt werden.

SQL> @?/javavm/install/update_javavm_db.sql
SQL> SET FEEDBACK 1
SQL> SET NUMWIDTH 10
SQL> SET LINESIZE 80
SQL> SET TRIMSPOOL ON
SQL> SET TAB OFF
SQL> SET PAGESIZE 100
SQL>
SQL> -- If Java is installed, do CJS.
SQL>
SQL> -- If CJS can deal with the SROs inconsistent with the new JDK,
SQL> -- the drop_sros() call here can be removed.
SQL> call initjvmaux.drop_sros();
 
Aufruf wurde abgeschlossen.
 
SQL>
SQL> create or replace java system;
  2  /
 
Java wurde erstellt.
 
SQL>
SQL> update dependency$
  2    set p_timestamp=(select stime from obj$ where obj#=p_obj#)
  3    where (select stime from obj$ where obj#=p_obj#)!=p_timestamp and
  4          (select type# from obj$ where obj#=p_obj#)=29  and
  5          (select owner# from obj$ where obj#=p_obj#)=0;
 
63854 Zeilen aktualisiert.

Hinweis: Im Falle einer RAC Datenbank muss dieses Skript nur einmal ausgeführt werden.

Zur Überprüfung, ob das Update erfolgreich war, wird die aktuelle JDK Version ausgelesen.

SQL> SELECT dbms_java.get_jdk_version() FROM dual;

DBMS_JAVA.GET_JDK_VERSION()
---------------------------
1.7

Fazit

Die Unterstützung mehrerer JDK Versionen macht die Java Entwicklung in der Oracle Datenbank flexibler und einfacher. Ein Nachteil hat das Ganze leider doch und zwar gilt die aktivierte JDK Version für alle Datenbanken des betroffenen Oracle Homes. Das heißt, dass für die Benutzung unterschiedlicher JDK Versionen mehrere Oracle Homes vorhanden sein müssen.

Referenzen

Leave a Reply

Your email address will not be published. Required fields are marked *