Um grundlegende Erfahrungen mit Oracle’s Vorzeigeprodukt zu sammeln benötigt man – entgegen hartnäckigen Gerüchten – beileibe keine Rechenboliden. Mein Playground-Setup läuft momentan in einer virtuellen Maschine mit schlappen 380MB RAM und 7 GB Festplattenspeicher – auf einem aktuellen Netbook mit gerade mal 1GB RAM! :-)
Wie man die Oracle DB Software in der kostenfreien XE-Variante schmerzfrei unter Debian Squeeze installiert, die notwendigsten Basics konfiguriert und via Python darauf zugreift ist Inhalt dieses Artikels. Er richtet sich an Oracle Newbies (wie mich).
Download der Software
Nachdem man sich in der VM-Software seiner Wahl ein frisches Debian eingerichtet hat, ist noch die Linux kernel AIO access library nachzuinstallieren:
apt-get install libaio1
Anschließend holt man sich die Oracle Software in der sog. “Express Edition” (XE). Diese ist kostenfrei nutzbar, jedoch im Funktionsumfang eingeschränkt (z.B. Datenvolumen <= 4GiB, CPU & RAM Beschränkungen, bla) - für's Lernen von Basics reicht sie allemal aus. :-)
Man achte darauf, Server- und Client-Package zu ziehen, also folgende:
oracle-xe-client_10.2.0.1-1.0_i386.deb oracle-xe-universal_10.2.0.1-1.0_i386.deb
Und wenn wir gerade dabei sind, ziehen wir auch gleich noch das Python-Modul cx_Oracle in der Variante cx_Oracle-5.0.4-10g-unicode-py25-1.i386.rpm.
Installation
Die Installation ist eigentlich idiotensicher. Defaultwerte kann man übernehmen, allerdings sollte man die Frage, ob die DB beim Booten automatisch gestartet werden soll, IMHO unbedingt mit No beantworten. Dies schont zum einen die Ressourcen bei Nichtgebrauch der DB und zum anderen lernt man dadurch etwas hilfreiches (später), also:
dpkg -i oracle-xe-universal_10.2.0.1-1.0_i386.deb dpkg -i oracle-xe-client_10.2.0.1-1.0_i386.deb /etc/init.d/oracle-xe configure
Damit ist die DB einsatzbereit und ein hübsches (nützliches) Webinterface bereits über http://127.0.0.1:8080/apex zu erreichen. Da wir in unserer schlanken VM natürlich keinen X-Server laufen lassen, nützt uns das aber noch nix. ;-)
Console, oder “In the beginning there was the TTY”
Wir werden daher User Oracle
su - oracle
sollten so automatisch im verzeichnis /usr/lib/oracle/xe landen, setzen notwendige Environment-Variablen (ORACLE_HOME etc.)
. /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/bin/oracle_env.sh
und sollten nun das Tool sqlplus nutzen können, um mit der Datenbank zu sprechen.
Um sich als User sys mit dem beim configure-script vergebenen Passwort (hier “password”) anzumelden, tippe man:
oracle@vmora:~$ sqlplus system/password@xe SQL*Plus: Release 10.2.0.1.0 - Production on Tue Mar 8 14:10:13 2011 Copyright (c) 1982, 2005, Oracle. All rights reserved. Connected to: Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production SQL> SQL> SELECT SYSDATE from dual; SYSDATE --------- 08-MAR-11 SQL> SELECT SQRT(2) FROM dual; SQRT(2) ---------- 1.41421356 SQL> quit Disconnected from Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production
Klicki-Bunti Interface
OK. So obiges funktioniert ist es jetzt an der Zeit, dem Webinterface abzugewöhnen nur auf’s Loopback (127.0.0.1) zu lauschen. Googlen fördert eine mitgelieferte PL/SQL-Procedure zu Tage, die man lediglich aufrufen muss.
Also wieder via sqlplus mit der DB verbinden:
oracle@vmora:~$ sqlplus system/password@xe SQL*Plus: Release 10.2.0.1.0 - Production on Tue Mar 8 15:34:30 2011 Copyright (c) 1982, 2005, Oracle. All rights reserved. Connected to: Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production
Die Procedure aufrufen:
SQL> EXEC DBMS_XDB.SETLISTENERLOCALACCESS(FALSE); PL/SQL procedure successfully completed. SQL> quit Disconnected from Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production
Und schon ist das Webinterface über alle im OS konfigurierten NICs erreichbar. Innerhalb einer VM ohne X-Server ist das sehr praktisch (ja, das VM-Netzwerkinterface muss an das des Wirts gebridged sein).
…oder lieber Python
sqlplus geht mangels History, Cmd-Completion etc. ziemlich schnell auf den Senkel, weswegen – zumindest ich – lieber gleich meine momentane Lieblingssprache Python verwenden will. An Bord hat Python IMHO leider keine Oracle-Bindings. Es gibt aber z.B. das Python-Modul cx_Oracle. Für’s Kompilieren dieses Moduls benötigt man noch einige Development-Packages – diese kann man zwar von Oracle frei herunterladen, aber den Aufwand sparen wir uns. Stattdessen haben wir ja schon einen passenden RPM-Build heruntergeldaen. Dieses wandeln wir via alien in ein DEB um und installieren es.
alien cx_Oracle-5.0.4-10g-unicode-py25-1.i386.rpm dpkg -i cx-oracle_5.0.4-2_i386.deb
Fertig. :-) Jetzt können wir – vorausgesetzt die Environment-Variablen sind passend gesetzt (LD_LIBRARY_PATH) so komfortabel wie von anderen DBs (MySQL,SQLLite etc.) gewohnt auf die DB zugreifen:
#!/usr/bin/env python
import cx_Oracle
if __name__ == '__main__':
sSQL = unicode('SELECT SYSDATE FROM dual')
print type(sSQL)
con = cx_Oracle.connect(unicode("system/password@127.0.0.1"))
print con.version
cur = con.cursor()
cur.execute(sSQL)
for result in cur:
print result
cur.close()
con.close()
Falls es hier zu einem “ImportError: libclntsh.so.10.1: cannot open shared object file: ” kommt, hat man höchstwahrscheinlich nicht aufgepasst bzw. vergessen obiger Erwähnung zum LD_LIBRARY_PATH zu folgen. ;-) (siehe cat $ORACLE_HOME/app/oracle/product/10.2.0/server/bin/oracle_env.sh).
Voila! Ein großer Teil des Rattenschwanzes von Oracle-Terminologie liegt nun – empirisch erfahrbar & mobil – vor uns. Jetzt müssten wir uns eigentlich nur noch aufraffen eine hübsche Django-Applikation darauf zu deployen, Backups & Restores zu triggern, das Data Dictionary zu erforschen oder Ähnliches. Happy playing!
Autoboot OFF, reboot und nun???
Achso, wer – wie ich – keine nebulösen Automatismen mag (Kontrollfreak?) und die DB nicht automatisch starten lässt, hat als Oracle Newbie nach einem Reboot ein Problem.
Die DB lässt sich NICHT – wie man naiv erwarten könnte – einfach über das runlevel-script /etc/init.d/oracle-xe start starten! Das wäre zu einfach. :-)
Deshalb:
su - oracle # 1. datenbank starten $ sqlplus /nolog SQL> CONNECT SYS/sys_password as SYSDBA SQL> STARTUP # oder (wenn man 'ne BASH hat) als einzeiler: echo -e "CONNECT SYS/password as SYSDBA\nSTARTUP" | sqlplus /nolog # 2. listener starten lsnrctl start
