Zugriffe von Oracle auf PostgreSQL

By | 28. Mai 2018

Dass in Unternehmen neben Oracle auch andere Datenbanksysteme betrieben werden, ist eher die Regel als eine Ausnahme. Gründe gibt es dafür viele. Nicht selten besteht der Wunsch, dass man von Oracle aus über einen Datenbanklink auf diese Fremddatenbanken zugreifen möchte. Für diesen Zweck wurden die Heterogeneous Services (HS) von Oracle entwickelt. Im nachfolgenden Artikel werde ich die Verwendung der Oracle Heterogeneous Services erläutern und insbesondere die Einrichtung des Zugriffs auf ein PostgreSQL-System zeigen.

Oracle to PostgreSQL

Heterogeneous Services

Die Heterogeneous Services sind Bestandteil jeder Oracle Datenbank und sorgen dafür, dass man gewöhnliches Oracle SQL verwenden kann, um auf Daten in nicht-Oracle Systemen zuzugreifen, als lägen sie in einer Oracle Datenbank. Der Heterogeneous Service Agent ist der Prozess mit dessen Hilfe eine Oracle Datenbank auf ein nicht-Oracle System zugreift und wird auch Database Gateway genannt. Das Database Gateway wird typerischweise auf dem Oracle System eingerichtet, kann aber auch auf dem Fremdsystem oder einem dritten System eingerichtet werden. Es gibt zwei Typen von Heterogeneous Service Agenten. Datenbankspezifische Database Gateways und Database Gateway for ODBC (DG4ODBC).

Die datenbankspezifischen Gateways sind für den Zugriff auf bestimmte nicht-Oracle Systeme wie z.B. SQL+Server, Sybase Teradata und Informix gedacht. Diese sind für die jeweiligen Datenbanksysteme optimiert und erfordern eine extra Oracle Lizenz.

Das Database Gateway for ODBC wurde ursprünglich für Datenbanksysteme entwickelt, für die keine spezifischen Gateways existieren. Der Zugriff auf die nicht-Oracle Systeme erfolgt generisch und unterliegt einigen funktionalen Einschränkungen. Es wird aber keine extra Oracle Lizenz benötigt, da das Database Gateway for ODBC Bestandteil der vorhandenen Datenbanklizenz ist. Allerdings wird zusätzlich ein Third-Party ODBC Treiber benötigt, der unter Umständen erworben werden muss. Der Third-Party ODBC Treiber muss zwingend auf dem Server installiert werden, auf dem auch das Database Gateway läuft.

PostgreSQL und DG4ODBC

Nachfolgend wird die Einrichtung einer Verbindung zu einer PostgreSQL-Datenbank unter Linux erläutert. Da es für den Zugriff auf PostgreSQL kein spezifisches Database Gateway gibt, muss das generische Database Gateway für ODBC (DG4ODBC) verwendet werden. Daraus folgt, dass auch ein ODBC-Treiber für PostgreSQL notwendig ist, der frei verfügbar und der GNU Lesser General Public Lizenz (GLPL) unterliegt.

DG4ODBC

Installation PostgreSQL ODBC-Treiber

Der offizielle ODBC-Treiber für PostgreSQL heißt psqlODBC und steht für verschiedenste Plattformen zur Verfügung. Unter der URL //odbc.postgresql.org findet man die Online Dokumentation, Sources und entsprechende Binary Packages. Unter Linux wird zusätzlich noch der ODBC-Treiber-Manager unixODBC benötigt, um den ODBC-Treiber verwalten zu können. Die Dokumentation dazu findet man unter //www.unixodbc.org.

Da ich in meinem Beispiel Oracle Linux nutze, kann ich einfach, über den mir zur Verfügung stehenden Package Manager YUM, den ODBC-Treiber und den ODBC-Treiber Manager wie folgt installieren.

yum install unixODBC
yum install postgresql-odbc

Der ODBC-Treiber-Manager unixODBC legt bei der Installation die Konfigurationsdatei /etc/odbcinst.ini an und stellt Tools zur Verwaltung zur Verfügung.

Der PostgreSQL ODBC-Treiber ist übrigens nach der Installation standardmäßig bereits in der Konfigurationsdatei des ODBC-Treiber Managers angelegt.

/etc/odbcinst.ini

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

Einrichtung ODBC-Treiber

Die angelegten und erwarteten Konfigurationsdateien lassen sich mit dem ODBC-Treiber Manager anzeigen. Dies sollte als Eigentümer der Datenbank geschehen (oracle).

su - oracle
odbcinst -j

Output:

unixODBC 2.3.1
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
USER DATA SOURCES..: /home/oracle/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8

Einrichtung ODBC-Datenquelle

In der Datei odbc.ini des Benutzers oracle muss nun die ODBC-Datenquelle der PostgreSQL Datenbank, auf die man zugreifen möchte, konfiguriert werden.
In meinem Beispiel ist PostgresDVD der ODBC Data Source Name (DNS).

/home/oracle/.odbc.ini

Beispiel:

[PostgresDVD]   <-- Name der Datenquelle (DNS)
Description         = Postgres DVD Rental DB
Driver              = PostgreSQL
Trace               = No
TraceFile           =
Database            = dvdrental        <-- PostgreSQL Database Name
Servername          = postgres-srv1.vbox.de   <-- PostgreSQL Server
UserName            = dvdrental         <-- PostgreSQL User (tempörar für isql-Test)
Password            = mysecretpassword  <-- PostgreSQL Password (tempörar für isql-Test)
Port                = 5432
Protocol            = 6.4
ReadOnly            = No
RowVersioning       = No
ShowSystemTables    = No
ShowOidColumn       = No
FakeOidIndex        = No
ConnSettings        =

Anschließend sollte man einen generischen Verbindungstest zur eingerichteten Datenquelle mit dem unixODBC Tool „isql“ durchführen.

isql PostgresDVD

Output:

+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+

Wenn der Verbindungstest mit dem unixODBC Tool „isql“ erfolgreich war, dann können die Verbindungsinformationen zum Usernamen und Password aus der .odbc.ini entfernt werden.
Die Authentifizierungsinformationen werden sind hier nicht mehr nötig, da diese beim Anlegen des Datenbanklinks definiert und anschließend für Zugriffe über den Datenbanklink genutzt werden.

Einrichtung Database Gateway

Funktioniert die generische ODBC-Verbindung mit der PostgreSQL-Datenbank, kann nun das Database Gateway for ODBC auf dem Oracle Server eingerichtet werden.
Im Verzeichnis der Oracle Datenbanksoftware unter $ORACLE_HOME/hs/admin liegen die notwendigen Konfigurations-Templates.

cd /u01/app/oracle/product/12.2.0/dbhome_1/hs/admin
ls -ltr
-rw-r--r--. 1 oracle oinstall  489 Jan 26  2017 initdg4odbc.ora
-rw-r--r--. 1 oracle oinstall 1170 Jan 26  2017 extproc.ora
-rw-r--r--. 1 oracle oinstall  411 Feb 22 15:40 listener.ora.sample
-rw-r--r--. 1 oracle oinstall  244 Feb 22 15:40 tnsnames.ora.sample

Zunächst muss die Database Gateway Initialisierungsparameterdatei eingerichtet werden. Dabei wird eine Kopie aus dem Template generiert (init<Gateway SID>.sid) und diese anschließend editiert.

Beispiel:

cp initdg4odbc.ora initPostgresDVD.ora

/u01/app/oracle/product/12.2.0/dbhome_1/hs/admin/initPostgresDVD.ora

#
# HS init parameters
#
HS_FDS_CONNECT_INFO = PostgresDVD  <-- Gateway SID
HS_FDS_SHAREABLE_NAME = /usr/lib64/libodbc.so  <-- Pfad zum ODBC-Treiber-Manager (unixODBC)

#
# ODBC specific environment variables
#
set ODBCINI=/home/oracle/.odbc.ini  <-- ODBC-Treiber Konfigurationsdatei

Einrichtung Oracle*Net Database Gateway

Zur SID-Liste der listener.ora auf dem Datenbankserver, wird ein entsprechender statischer Eintrag für das Database Gateway for ODBC (DG4ODBC) hinzugefügt, der das Gateway beschreibt.

/u01/app/oracle/product/12.2.0/dbhome_1/network/admin/listener.ora

Beispiel listener.ora:

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = orahost122.vbox.de)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

SID_LIST_LISTENER=
  (SID_LIST=
     (SID_DESC=
       (SID_NAME=PostgresDVD) <-- Gateway SID   
       (ORACLE_HOME=/u01/app/oracle/product/12.2.0/dbhome_1)
       (PROGRAM=dg4odbc) <-- Database Gateway Executable for ODBC in $ORACLEHOME/bin 
       (ENV="LD_LIBRARY_PATH=/usr/lib64:/u01/app/oracle/product/11.2.0.3/dbhome_1/lib")
       (LD_LIBRARY_PATH: Pfad Directory ODBC-Treiber und $ORACLE_HOME/lib)
     )
  )

Anschließend muss der Listener neu geladen werden, damit die Änderungen aktiv sind.

Für die Verbindungsbeschreibung zur PostgreSQL-Datenbank fehlt dann noch ein entsprechender Eintrag in der tnsnames.ora.

/u01/app/oracle/product/12.2.0/dbhome_1/network/admin/tnsnames.ora

Beispiel tnsnames.ora:

PostgresDVD  =
(DESCRIPTION=
  (ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))
  (CONNECT_DATA=(SID=PostgresDVD)) <-- Gateway SID
  (HS=OK) <-- Connect Descriptor connects to Non-Oracle System
)

Oracle Datenbanklink anlegen

Um von der Oracle Datenbank aus auf die entfernten Tabellen der PostgreSQL-Datenbank zugreifen zu können, muss ein Datenbanklink angelegt werden. Vorzugsweise sollte dieser vom Typ Privat sein und in dem Schema angelegt werden, aus dem er genutzt werden soll.

Beispiel Datenbanklink:

CREATE DATABASE LINK PostgresDVD
CONNECT TO "dvdrental" <-- PostgreSQL Username
IDENTIFIED BY "mysecretpassword" <-- PostgreSQL
Password USING 'PostgresDVD'; <-- Aliasname für Connect Descriptor in tnsnames.ora

Zugriff auf die PostgreSQL-Datenbank testen

Wenn der Datenbanklink im entsprechenden Oracle Schema angelegt wurde, kann dieser getestet werden, indem Daten aus einer vorhandenen Tabelle in der PostgreSQL-Datenbank abgefragt werden.

Beispiel Abfrage Tabelle City:

select count(*) from "city"@PostgresDVD;

Anmerkung: Bei der Angabe der Objektnamen ist auf exakte Groß- und Kleinschreibung zu achten! Aus diesem Grund sollten diese in doppelte Anführungszeichen gesetzt werden („Tabelle“).

Einschränkungen

Der Zugriff auf die PostgreSQL-Datenbank unterliegt einigen Einschränkungen. So werden z.B Rowids und Stored Procedures nicht unterstützt.
Der genaue Umfang der Einschränkungen kann der Online Dokumentation entnommen werden:

Link Online Dokumentation: Oracle Database Gateway Features and Restrictions 12.2

Troubleshooting

Wenn der Zugriff auf die PostgreSQL-Datenbank nicht funktioniert, sollte zunächst versucht werden, den Fehler einzuschränken. Dabei sollte man sich folgende Fragen stellen:
Funktioniert der generische ODBC-Test mit isql? Ist das Database Gateway richtig in der listener.ora und tnsnames.ora konfiguriert? Stimmen alle eingetragenen Namen und Pfade?
Sind die erforderlichen Berechtigungen des verwendeten PostgreSQL-User vorhanden, um auf die gewünschten Tabellen zuzugreifen?

Für eine weitere Analyse kann es hilfreich sein, das Tracing des Gateways in der Database Gateway Initialisierungsparameterdatei mit folgenden Parameter zu aktivieren. Die Tracefiles werden im Verzeichnis $ORACLE_HOME/hs/log angelegt.

HS_FDS_TRACE_LEVEL = DEBUG

Referenzen und weitere Informationen

Link Online Dokumentation: Oracle Database Gateway for ODBC 12.2
Link Online Dokumentation: Installing Oracle Database Gateway for ODBC 12.2
Link Online Dokumentation: Configurierung Oracle Database Gatway for ODBC 12.2

MOS Note: Database Gateway and Generic Connectivity (DG4ODBC) Licensing Considerations 232482.1
MOS Note: How to Resolve Common Errors Encountered while using Database Gateways (DG4IFMX, dg4msql, DG4SYBS), DG4ODBC or Generic Connectivity (Doc ID 234517.1)
MOS Note: Problems Configuring Database Gateway For ODBC (DG4ODBC) to Connect To Postgres(Doc ID 881667.1)

Verwandte Themen

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.