Datenbank Link zwischen Oracle und MySQL herstellen

Ziel

In diesem Blogeintrag wird gezeigt wie Sie mithilfe des Oracle Database Gatesways 11g Release 2 eine Verbindung zwischen einer Oracle und einer MySQL Datenbank mithilfe eines Datenbank Links herstellen können.

Vorausetzungen

Um die hier gezeigten Schritte durchführen zu können müssen die folgenden Voraussetzungen erfüllt sein:

  • Funktionstüchtige Oracle Datenbank (z.B. Oracle Database 11g Release 2)
  • Funktionstüchtige MySQL Datenbank (z.B. MySQL 5.5)

In meiner Testumgebung setze ich die folgenden Datenbank Versionen ein.

Oracle (Hostname: oradb)

SQL> select * from v$version;  
BANNER 
---------------------------------------------------------------------
Personal Oracle Database 11g Release 11.2.0.2.0 - 64bit Production 
PL/SQL Release 11.2.0.2.0 - Production 
CORE    11.2.0.2.0      Production 
TNS for 64-bit Windows: Version 11.2.0.2.0 - Production 
NLSRTL Version 11.2.0.2.0 - Production

MySQL (Hostname: mysql)

mysql> select @@version Version; 
+---------+ 
| Version | 
+---------+ 
| 5.5.13  | 
+---------+

Installation Oracle Database Gateway 11g Release 2

Ich habe das Oracle Database Gateway als Standalone Installation auf einem seperaten Server installiert. Für weitere Informationen siehe den Oracle Database Gateway for ODBC User’s Guide.

Die Software selbst kann entweder über das Oracle Technology Network oder über E-Delivery bezogen werden.

Auf die Installation gehe in an dieser Stelle zum jetzigen Zeitpunkt nicht ein und verweise auf die Oracle Dokumentation.

Installation MySQL ODBC Connector

Für den Zugriff auf die MySQL Datenbank muss auf dem Server mit dem Oracle Database Gateway der MySQL ODBC Connector installiert werden. Dieser kann hier heruntergeladen werden.

Ich zeige die Installation des Connectors anhand des 64-bit RPM Paketes (Dateiname: mysql-connector-odbc-5.1.10-1.x86_64.rpm).

$> rpm -ivh mysql-connector-odbc-5.1.10-1.x86_64.rpm

Nach der Installation findet sich die Library für den ODBC Treiber im Verzeichnis /usr/lib64.

Vorbereitung MySQL Datenbank

Für die Demonstration des Datenbank Links wird eine Testdatenbank inklusive dedizierten Benutzer angelegt.

$> mysql -u root -p 
MYSQL> CREATE DATABASE test; 
MYSQL> GRANT ALL PRIVILEGES ON test.* ON 'rmt'@'%' IDENTIFIED BY 'rmt';
MYSQL> USE test; 
MYSQL> CREATE TABLE t1 (id int, name text); 
MYSQL> INSERT INTO t1 VALUES (1, 'Oracle'); 
MYSQL> INSERT INTO t1 VALUES (2, 'MySQL'); 
MYSQL> COMMIT; 

Hinweis: Aus Sicherheitsgründen sollte in Produktivumgebungen der Platzhalter % nicht verwendet werden. Stattdessen sollte an dieser Stelle die IP-Adresse des Servers mit dem Oracle Database Gateway angegeben werden.

Anlegen eines ODBC DSN (Data Source Name) für die MySQL Datenbank

Der ODBC DSN muss auf dem Server auf dem das Oracle Database Gateway installiert wurde angelegt werden. 

$> vi ~/.mysql-odbc.ini 
[ODBC Data Sources] 
test= MySQL ODBC Driver 5.1  

[test] 
Driver      = /usr/lib64/libmyodbc5.so 
DATABASE    = test 
DESCRIPTION = MySQL Verbindung zur TEST Datenbank 
PORT        = 3306 
SERVER      = 192.168.200.211 
UID         = rmt 
PWD         = rmt 
CHARSET     = latin1 
TRACEFILE   = /tmp/mysql-odbc-test.trc 
TRACE       = OFF

Hinweis: Der Name und Pfad für die Datei kann an dieser Stelle frei gewählt werden.

Konfiguration des dg4odbc Gateways

Die Einstellungen für das Gateway werden in einer init<SID>.ora Datei, ähnlich wie das Parameterfile einer Datenbank, gespeichert. Die Konfigurationsdatei muss im Verzeichnis $ORACLE_HOME/hs/admin abgelegt werden.

[oracle@gateway ~]$ vi $ORACLE_HOME/hs/admin/inittest.ora 
# # HS init parameters #
# HINWEIS: Name des DSN muss hier angegeben werden 
HS_FDS_CONNECT_INFO=test 
HS_FDS_TRACE_LEVEL=0 
HS_FDS_SHAREABLE_NAME=/usr/lib64/libmyodbc5.so 
HS_LANGUAGE=GERMAN_GERMANY.WE8ISO8859P15 

# # ODBC specific environment variables #
# HINWEIS: Pfad und Name muss ggf. angepasst werden. 
set ODBCINI=/home/oracle/.mysql-odbc.ini  

# # Environment variables required for the non-Oracle system # 
set HOME=/u01/app/oracle/product/11.2.0/tg_1

Hinweis: Als Grundlage für die Datei kann die Beispieldatei initdg4odbc.ora verwendet werden.

Listener Konfiguration anpassen

Im nächsten Schritt muss der Listener auf dem Oracle Database Gateway angepasst werden. 

$> vi $ORACLE_HOME/network/admin/listener.ora 
SID_LIST_LISTENER =
   (SID_LIST =
     (SID_DESC =
       (ORACLE_HOME = /u01/app/oracle/product/11.2.0/tg_1)
       (SID_NAME = test)
       (PROGRAM = dg4odbc)
      )
   )

Hinweis: Als SID_NAME muss der Wert aus dem vorherigen Schritt (in diesem Fall test) verwendet werden.

Verbindung von der Oracle Datenbank zur MySQL Datenbank herstellen

Für den Datenbank Link wird ein TNS Alias benötigt. Dieser wird nun zu der tnsnames.ora auf dem Oracle Datenbankserver hinzugefügt.

$> vi $ORACLE_HOME/network/admin/tnsnames.ora 
TEST =
 (DESCRIPTION =
     (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.200.208)(PORT = 1521))     
     (CONNECT_DATA =
        (SID = test)
     )
     (HS = OK)
 )

Anschließend kann der Datenbank Link angelegt werden.

$> sqlplus / as sysdba 
SQL> CREATE DATABASE LINK testlink CONNECT TO "rmt" IDENTIFIED BY "rmt"
     USING 'test';

Zum Anmelden an der MySQL Datenbank wird der dafür angelegt Benutzer rmt verwendet. Als Wert für den USING Parameter wird der zuvor hinzugefügte TNS Name verwendet.

Überprüfung

Zum Abschluss wird der Datenbank Link überprüft. Beim Abrufen von Informationen aus der MySQL Datenbank muss darauf geachtet werden, dass Spalten und Tabellenname in Anführungszeichen stehen. Dies liegt an der unterschiedlichen Case Policy der beiden Systeme.

SQL> SELECT * FROM "t1"@testlink
        id name 
---------- -----------------
         1 Oracle
         2 MySQL

Das Abrufen der Daten war erfolgreich. Der Datenbank Link zwischen der MySQL und der Oracle Datenbank wurde erfolgreich konfiguriert.

2 comments

  1. Guten Tag und vielen Dank für diese Anleitung. Mich würde interessieren, ob darüber auch umgekehrt ein Zugriff von MySQL auf Oracle möglich ist?
    Vielen Dank

    1. Hallo Manuel,

      leider funktioniert das über diesem Wege nicht in die andere Richtung. Soweit ich weiß, unterstützt MySQL auch keine direkte Verbindung zu anderen Datenbanken.

      Viele Grüße
      Christian

Leave a Reply

Your email address will not be published. Required fields are marked *