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.
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.
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 https://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 http://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)