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.
Table of Contents
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
rm -f /u01/app/oracle/product/12.1.0/dbhome_1/rdbms/lib/oracle /u01/app/oracle/product/12.1.0/dbhome_1/bin/orald -o /u01/app/oracle/product/12.1.0/dbhome_1/rdbms/lib/oracle -m64 -z noexecstack -Wl,--disable-new-dtags -L/u01/app/oracle/product/12.1.0/dbhome_1/rdbms/lib/ -L/u01/app/oracle/product/12.1.0/dbhome_1/lib/ -L/u01/app/oracle/product/12.1.0/dbhome_1/lib/stubs/ -Wl,-E /u01/app/oracle/product/12.1.0/dbhome_1/rdbms/lib/opimai.o /u01/app/oracle/product/12.1.0/dbhome_1/rdbms/lib/ssoraed.o /u01/app/oracle/product/12.1.0/dbhome_1/rdbms/lib/ttcsoi.o -Wl,--whole-archive -lperfsrv12 -Wl,--no-whole-archive /u01/app/oracle/product/12.1.0/dbhome_1/lib/nautab.o /u01/app/oracle/product/12.1.0/dbhome_1/lib/naeet.o /u01/app/oracle/product/12.1.0/dbhome_1/lib/naect.o /u01/app/oracle/product/12.1.0/dbhome_1/lib/naedhs.o /u01/app/oracle/product/12.1.0/dbhome_1/rdbms/lib/config.o -lserver12 -lodm12 -lcell12 -lnnet12 -lskgxp12 -lsnls12 -lnls12 -lcore12 -lsnls12 -lnls12 -lcore12 -lsnls12 -lnls12 -lxml12 -lcore12 -lunls12 -lsnls12 -lnls12 -lcore12 -lnls12 -lclient12 -lvsn12 -lcommon12 -lgeneric12 -lknlopt `if /usr/bin/ar tv /u01/app/oracle/product/12.1.0/dbhome_1/rdbms/lib/libknlopt.a | grep xsyeolap.o > /dev/null 2>&1 ; then echo "-loraolap12" ; fi` -lskjcx12 -lslax12 -lpls12 -lrt -lplp12 -lserver12 -lclient12 -lvsn12 -lcommon12 -lgeneric12 `if [ -f /u01/app/oracle/product/12.1.0/dbhome_1/lib/libavserver12.a ] ; then echo "-lavserver12" ; else echo "-lavstub12"; fi` `if [ -f /u01/app/oracle/product/12.1.0/dbhome_1/lib/libavclient12.a ] ; then echo "-lavclient12" ; fi` -lknlopt -lslax12 -lpls12 -lrt -lplp12 -ljavavm12 -lserver12 -lwwg `cat /u01/app/oracle/product/12.1.0/dbhome_1/lib/ldflags` -lncrypt12 -lnsgr12 -lnzjs12 -ln12 -lnl12 -lnro12 `cat /u01/app/oracle/product/12.1.0/dbhome_1/lib/ldflags` -lncrypt12 -lnsgr12 -lnzjs12 -ln12 -lnl12 -lnnzst12 -lzt12 -lztkg12 -lmm -lsnls12 -lnls12 -lcore12 -lsnls12 -lnls12 -lcore12 -lsnls12 -lnls12 -lxml12 -lcore12 -lunls12 -lsnls12 -lnls12 -lcore12 -lnls12 -lztkg12 `cat /u01/app/oracle/product/12.1.0/dbhome_1/lib/ldflags` -lncrypt12 -lnsgr12 -lnzjs12 -ln12 -lnl12 -lnro12 `cat /u01/app/oracle/product/12.1.0/dbhome_1/lib/ldflags` -lncrypt12 -lnsgr12 -lnzjs12 -ln12 -lnl12 -lnnzst12 -lzt12 -lztkg12 -lsnls12 -lnls12 -lcore12 -lsnls12 -lnls12 -lcore12 -lsnls12 -lnls12 -lxml12 -lcore12 -lunls12 -lsnls12 -lnls12 -lcore12 -lnls12 `if /usr/bin/ar tv /u01/app/oracle/product/12.1.0/dbhome_1/rdbms/lib/libknlopt.a | grep "kxmnsd.o" > /dev/null 2>&1 ; then echo " " ; else echo "-lordsdo12"; fi` -L/u01/app/oracle/product/12.1.0/dbhome_1/ctx/lib/ -lctxc12 -lctx12 -lzx12 -lgx12 -lctx12 -lzx12 -lgx12 -lordimt12 -lclsra12 -ldbcfg12 -lhasgen12 -lskgxn2 -lnnzst12 -lzt12 -lxml12 -locr12 -locrb12 -locrutl12 -lhasgen12 -lskgxn2 -lnnzst12 -lzt12 -lxml12 -lgeneric12 -loraz -llzopro -lorabz2 -lipp_z -lipp_bz2 -lippdcemerged -lippsemerged -lippdcmerged -lippsmerged -lippcore -lippcpemerged -lippcpmerged -lsnls12 -lnls12 -lcore12 -lsnls12 -lnls12 -lcore12 -lsnls12 -lnls12 -lxml12 -lcore12 -lunls12 -lsnls12 -lnls12 -lcore12 -lnls12 -lsnls12 -lunls12 -lsnls12 -lnls12 -lcore12 -lsnls12 -lnls12 -lcore12 -lsnls12 -lnls12 -lxml12 -lcore12 -lunls12 -lsnls12 -lnls12 -lcore12 -lnls12 -lasmclnt12 -lcommon12 -lcore12 -laio -lons `cat /u01/app/oracle/product/12.1.0/dbhome_1/lib/sysliblist` -Wl,-rpath,/u01/app/oracle/product/12.1.0/dbhome_1/lib -lm `cat /u01/app/oracle/product/12.1.0/dbhome_1/lib/sysliblist` -ldl -lm -L/u01/app/oracle/product/12.1.0/dbhome_1/lib test ! -f /u01/app/oracle/product/12.1.0/dbhome_1/bin/oracle ||\ mv -f /u01/app/oracle/product/12.1.0/dbhome_1/bin/oracle /u01/app/oracle/product/12.1.0/dbhome_1/bin/oracleO mv /u01/app/oracle/product/12.1.0/dbhome_1/rdbms/lib/oracle /u01/app/oracle/product/12.1.0/dbhome_1/bin/oracle chmod 6751 /u01/app/oracle/product/12.1.0/dbhome_1/bin/oracle
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.