1. Start
  2. Unternehmen
  3. Blog
  4. Zugriff von Oracle auf PostgreSQL

Zugriff von Oracle auf PostgreSQL

Noch vor wenigen Jahren waren Enterprise-Datenbanken, wie Oracle, SQL Server, oder IBM DB/2, die einzigen Datenbank-Systeme, die in Firmen und Konzernen eingesetzt wurden. Allerdings haben sich in letzter Zeit einige Open Source Datenbanken etabliert, die den Platzhirschen in mancher Hinsicht durchaus das Wasser reichen können.

Eins dieser Datenbank-Systeme ist PostgreSQL.

Laufen alle Datenbanken unter Oracle, ist der Zugriff zwischen ihnen relativ einfach - mittels Datenbank Link. Der Zugriff von einer Oracle-Datenbank auf PostgreSQL ist nicht ganz so einfach. Das tun wir hier: mittels Oracle HS ("Heterogenous Services").

 

Installation

Als erstes benötigen wir Pakete für UnixODBC - sowohl das generische, als auch das spezielle für PostgreSQL:

 

yum install unixODBC
yum install postgresql-18-odbc

 

Konfiguration

Als nächstes müssen wir ODBC konfigurieren.

Konfiguration der Datenbank-Treiber

In der Datei /etc/odbcinst.ini müssen die Datenbank-Treiber konfiguriert werden:

 

[PostgreSQL]
Description=ODBC for PostgreSQL
Driver=/usr/pgsql-18/lib/psqlodbca.so
Setup=/usr/lib64/libodbcpsqlS.so
Driver64=/usr/pgsql-18/lib/psqlodbca.so
Setup64=/usr/lib64/libodbcpsqlS.so
FileUsage=1

 

Konfiguration der Datenbanken

In der Datei /etc/odbc.ini konfigurieren wir den Zugriff auf jede Datenbank über einen eindeutigen Namen:

 

[pgdb]
Description = PostgreSQL pgdb
Driver = PostgreSQL
Servername = <Server-Name>
Database = dvdrental
Port = 5432
Trace = yes
TraceFile = /tmp/odbctrace.txt

 

Konfiguration in Oracle

Als nächstes wird der Zugriff auf PostgreSQL in Oracle konfiguriert:

Listener

Jetzt muss der Oracle TNS Listener konfiguriert werden, der den Zugriff auf die PostgreSQL-Datenbank ermöglicht. Wir können dafür entweder einen neuen Listener erstellen, oder einen bestehenden nutzen (LISTENER). Dafür ändern wir die Datei $ORACLE_HOME/network/admin/listener.ora:

 

SID_LIST_LISTENER =
(SID_LIST =
 (SID_DESC=
  (SID_NAME=pgdb)
  (ORACLE_HOME=/u01/app/oracle/product/19c)
  (PROGRAM=dg4odbc)(ENVS="LD_LIBRARY_PATH=/usr/lib64:/u01/app/oracle/product/19c/lib")))
 

 

Danach muss der Listener neu gestartet werden:

 

# lsnrctl stop
# lsnrctl start

 

HS Konfiguration

Damit der Zugriff auf PostgreSQL gelingt, “fälschen” wir eine Oracle-Datenbank, die dann in Richtung ODBC weiterleitet. Dazu müssen wir die Datei $ORACLE_HOME/hs/admin/initpgdb.ora erstellen:

 

HS_FDS_CONNECT_INFO = pgdb
HS_FDS_TRACE_LEVEL = ON
HS_FDS_SHAREABLE_NAME = /usr/lib64/libodbc.so
HS_LANGUAGE = AMERICAN_AMERICA.WE8ISO8859P15
set ODBCINI=/etc

 

TNSNAMES anpassen

As last step, we need TNS entries in $ORACLE_HOME/network/admin/tnsnames.ora:

 

pgdb = 
 (DESCRIPTION=
   (ADDRESS=
     (PROTOCOL=tcp)
     (HOST=localhost)
     (PORT=1521)
   )
    (CONNECT_DATA=(SID=pgdb))
    (HS=OK)
 )

 

Datenbank-Link erstellen

Dann müssen wir noch einen Datenbank-Link erstellen:

 

SQL> create database link pgdb connect to "postgres" identified by "P4ssw0rd" using 'pgdb';

 

Konfiguration testen

Beim Zugriff auf eine Oracle-Datenbank würden wir einfach gegen DUAL testen; dieses Objekt existiert aber nur unter Oracle:

 

SQL> select 1 from dual@pgdb;

 

select count(*) from dual@pgdb
                    *
ERROR at line 1:
ORA-28500: connection from ORACLE to a non-Oracle system returned this message:
ERROR: relation “DUAL" does not exist;
No query has been executed with that handle {42P01,NativeErr = 1}
ORA-02063: preceding 3 lines from PGDB
 

 

Genauso wenig funktionieren Views wie DBA_TABLES oder DBA_VIEWS, weil diese unter PostgreSQL nicht existieren. Somit müssen wir den Inhalt der PostgreSQL-Datenbank kennen, wenn wir datauf zugreifen wollen.

Da ich in PostgreSQL die Tabelle “actor” kenne, nehme ich diese zum Testen:

 

SQL> DESCRIBE actor@pgdb
 

 

Name                                      Null?    Type
----------------------------------------- -------- ----------------------------
actor_id                                  NOT NULL NUMBER(10)
first_name                                NOT NULL VARCHAR2(540)
last_name                                 NOT NULL VARCHAR2(540)
last_update                               NOT NULL DATE

 

Ok, der Zugriff scheint zu funktionieren. Können wir auch auf Daten zugreifen?

 

SQL> select first_name,last_name from actor@pgdb;

 

select first_name,last_name from actor@pgdb
                 *
ERROR at line 1:
ORA-00904: "LAST_NAME": invalid identifier

 

Das funktioniert leider nicht. Der Grund dafür ist, dass Objekte in Oracle immer in Großbuchstaben erstellt werden, sofern nicht anders gewünscht. Da die Tabelle “actors” in PostgreSQL in Kleinbuchstaben angelegt ist, werden Anführungszeichen benötigt:

 

SQL> select "first_name","last_name" from "actor"@pgdb;

 

first_name
--------------------------------------------------------------------------------
last_name
--------------------------------------------------------------------------------
Penelope
Guiness

 

Zusammenfassung

Wir sehen: nach ein wenig Konfiguration gibt es einen Weg, von Oracle aus auf PostgreSQL zuzugreifen.

Ein paar Dinge müssen wir aber beachten:

  • ODBC ist nicht die performanteste Art, auf Datenbanken zuzugreifen. Abhängig von der jeweiligen Datenmenge können Zugriffe lange dauern
  • Da Oracle und PostgreSQL unterschiedliche Datenbank-Systeme sind, können Daten-Konvertierungen passieren. Bevor man diese Lösung in Produktion einsetzt, sollte man genau prüfen, ob alle Daten wie gewünscht ankommen, und ob spezielle Inhalte - besonders Umlaute wie ä, ö, ü oder ß - richtig übertragen und dargestellt werden. Ist dies nicht der Fall, kann der Parameter HS_LANGUAGE entsprechend angepasst werden

Kommentare

Keine Kommentare

Kommentar schreiben

* Diese Felder sind erforderlich