Blog

 
name
bild
datum
langtext
 
Oracle Anbindung an PostgreSQL mit oracle_fdw
 
Ich hatte mal wieder eine Anfrage ob das Web-GIS <a href="http://kvwmap.de">kvwmap</a> nicht auch mit Oracle zusammenarbeiten kann. Nun dann frage ich immer erst wofür. Wenn lediglich der <a href="http://mapserver.org">MapServer</a> nur lesend auf Oracle Daten zugreifen soll, geht das mit <a href="Oracle Spatial">http://mapserver.org/input/vector/oracle.html</a>. Wenn irgendwelche Daten in andere GIS - Vektorformate konvertiert oder in die PostgreSQL-Datenbank übernommen werden sollen kann man dafür den <a href="http://gdal.org/drv_oci.html">Oracle Driver von OGR</a> verwenden. Der Zugriff auf Oracle Datenbanken geht auch mit ODBC. Eine Beschreibung wie das mit PHP geht gibt es <a href="http://php.net/manual/de/book.uodbc.php">hier</a>. Dazu müsste man aber doch eine ganze Reihe seiner Funktionen, die mit der PostgreSQL-Datenbank im allgemeinen über pg_connect kommunizieren umschreiben, bzw. einen kompletten Datenbank-Wrapper für seine Anwendung bauen, was angesichts der Unterschiede zwischen PostGIS und Oracle Spatial nicht leicht sein dürfte. Da kann man nur hoffen, dass ODBC die Funktionen unterstützt und beide Datenbanken MM-SQL standardmäßig unterstützen, die (st_) Funktionen.<br> Wenn man eine Anwendung hat, die voll auf PostgreSQL aufsetzt, insbesondere auch auf die Funktionen von PostGIS müsste man schon einiges investieren um das umzubauen. Oft steht auch die Frage ob man nicht gleich auf PostgreSQL wechselt. Das ist meistens nicht so einfach, weil in Oracle eine gewachsene Datenbank liegt, die vielleicht noch mit umfangreichen eigenen Funktionen, Regeln und Triggern versehen ist. Die kann man nicht mal eben so schnell nach PostgreSQL migrieren. Die eigene Anwendung auf Oracle erweitern nur damit die dann man abgeschafft werden kann ist einfach zu viel Aufwand. Im Folgenden beschreibe ich eine Möglichkeit wie man auf eine Oracle Datenbank zugreifen kann ohne die eigene Anwendung anpassen zu müssen.</p> <p>Eine Lösung für das Problem ist <a href="https://github.com/laurenz/oracle_fdw">oracle_fdw</a>. Diese Erweiterung für PostgreSQL läßt Oracle Datenbanktabellen in PostgreSQL erscheinen und man kann auf ihnen so arbeiten als wären sie in PostgreSQL.<br> Wie das geht ist auf der Seite von <a href="https://github.com/laurenz">Laurenz Albe</a> beschrieben. Nur wie kann man das Testen?</p> <p>Ich habe mir dazu den docker container oracle-server vom image <a href="https://hub.docker.com/r/alexeiled/docker-oracle-xe-11g/">alexeiled/docker-oracle-xe-11g</a> eingerichtet.<br><code><br> docker run --name oracle-server \\\\<br> --shm-size=2g \\\\<br> -p 1521:1521 \\\\<br> -p 8081:8081 \\\\<br> -d alexeiled/docker-oracle-xe-11g<br></code><br> Diesen container habe ich in den container pgsql-server den kvwmap nutzt reingelinkt. Der Aufruf dazu lautet:<br><code><br> docker run --name pgsql-server \\\\<br> --link oracle-server:oracle \\\\<br> -p 5432:5432 \\\\<br> -d mdillon/postgis<br></code><br> Die Volumes etc., die in kvwmap verwendet werden, habe ich mal weggelassen. Genaueres kann man nachlesen in meinem docker container manager dcm, siehe: <a href="https://github.com/pkorduan/kvwmap-server">git repository pkorduan/kvwmap-server</a>.<br> Im container pgsql-server muss man nun die Verbindung zu Oracle herstellen können. Dazu braucht man im pgsql-server container erstmal den Console Datenbank Client sqlplus. Dazu wird folgendes gemacht.</p> <ul><li>Man lädt folgende Dateien von <a href="http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html">Oracles Download Seite</a> herunter: <ul><li> instantclient-basic-linux.x64-11.2.0.3.0.zip</li> <li> instantclient-jdbc-linux.x64-11.2.0.3.0.zip</li> <li> instantclient-sdk-linux.x64-11.2.0.3.0.zip</li> <li> instantclient-sqlplus-linux.x64-11.2.0.3.0.zip</li> </ul><p>Damit das klappt muss man allerdings sich erst bei Oracle Registrieren, Einlogen und den Lizenzbedingungen zustimmen. Man muss die Dateien also erstmal lokal auf den eigenen Rechner downloaden und dann auf den Server in den pgsql-container transferieren. Ich hab die Dateien auf einen eigenen Webspace gelegt und im pgsql-container mit wget geholt. </p></li> <li>Dann entpackt man die zip files.</li> <li>In das beim Entpacken entstandene Verzeichnis instantclient_11_2/ wechseln</li> <li>Mit Oracle verbinden:<code><br> ./sqlplus system/oracle@//172.17.0.1:1521/xe<br></code>Die IP-Adresse ersetzen durch die Adresse, die beim Befehl env für die Variable ORACLE_PORT_8080_TCP_ADDR angezeigt wird.</li> </ul><p>Damit ist man drin in Oracle.</p> <p>Um das Beispiel für oracle_fdw von <a href="https://github.com/laurenz/oracle_fdw">Laurenz Albe</a> nutzen zu können habe ich in Oracle die Tabelle oratab wie folgt angelegt:<br><code><br> CREATE TABLE oratab (<br> id number(5) NOT NULL,<br> text varchar2(30),<br> floating number(7,2) NOT NULL<br> );<br> INSERT INTO oratab (id, text, floating) VALUES (1, 'test1', 1.2);<br> INSERT INTO oratab (id, text, floating) VALUES (2, 'test2', 2.3);<br> INSERT INTO oratab (id, text, floating) VALUES (3, 'test2', 4.5);<br></code></p> <p>Um von PostgreSQL aus auf die Oracle Datenbank zugreifen zu können, braucht man in Postgres die extension oracle_fdw. Prüfen kann man das in Postgres mit:<br><code><br> SELECT pg_available_extensions() ex ORDER BY ex;<br></code><br> Wenn die nicht da ist, kann sie wie in der <a href="https://github.com/laurenz/oracle_fdw/blob/master/README.oracle_fdw">README</a> von oracle_fdw im Abschnitt 6. Installation beschrieben nachinstalliert werden.<br> Danach folgt man dem Beispiel in ebendieser README.</p> <p>Man beachte noch, dass alle Änderungen, die im pgsql-server container gemacht werden keinen Bestand haben, wenn dieser gelöscht wird. Die Schritte zum Installieren von sqlplus baue ich bestimmt noch in ein eigenes postgis images ein. Dazu erweitere ich das postgis image mdillon/postgis was ich ja sowieso schon immer für kvwmap verwendet habe. Da ist dann der sqlplus client und die oracle_fdw extension schon drin und man kann in Postgres auf die Oracle Tabellen zugreifen. In der Praxis wird dann natürlich nicht mehr der selbst gebaute Oracle Container verwendet, sondern statt dessen die richtige Oracle Datenbank, die in Postgres genutzt werden soll. Hat man also die Oracle Tabellen in Postgres, kann man diese mit kvwmap wie man will bearbeiten und nach und nach die Trigger und Funktionen in Postgres nachbauen. Hat man irgendwann alles in Postgres so wie man es vorher in Oracle hatte, kann man einfach die Oracle Tabellen in richtige Postgres Tabellen übernehmen und den Oracle Server abschalten.</p>
Σ
Blog alle auswählen
  • als Diagramm ausgeben