Oracle 11g : Database link vers MySQL et exploitation avec les PHP PDO

J’écrivais il y a plusieurs semaines un article sur la connexion entre PHP et Oracle avec les PDO. Les PDO permettant de se connecter à de nombreux types de SGBD, leur utilisation permet de créer des applications de synchronisation de bases de données (ETL – Extract Transform Load) en PHP.

Nous allons ici nous affranchir de PHP en créant un database link depuis Oracle 11g hébergé sur Windows Server 2008 vers une base MySQL distante.

Database Link vers MySQL !?

Il est possible avec Oracle de se connecter à d’autres bases de données Oracle via des database links (liens de bases de données). La base de données locale se connecte au processus d’écoute (listener) de la base distante.

La base distante peut alors être interrogée de cette façon :

SELECT * FROM TABLE@BASE_DISTANCE

L’arobase indique à Oracle l’instance distante à interroger. Entre deux bases Oracle, tout se passe au niveau des processus d’écoute et du tnsnames.ora.

Schema dblink oracle oracle

En revanche, le database link vers une base MySQL se fait en utilisant les pilotes ODBC (description rapidedescription détaillée) de Windows.
La configuration du tnsnames.ora ne pointe pas vers une instance distante (puisque MySQL ne possède pas cette notion de listener) mais vers un programme local (dg4odbc) qui utilise le lien ODBC précédemment créé.

 Schema dblink oracle mysql

Création du database link

Afin de créer le connecteur ODBC, il faut installer le pilote MySQL pour ODBC.

Warning_iconDans le cas d’un processeur 64 bits et pour assurer le bon fonctionnement du lien ODBC, toutes les manipulations suivantes seront à faire en 32 bits et en 64 bits.

Sur le site de MySQL, téléchargez et installez le connecteur ODBC, en version x86 et x64 :

  • Windows (x86, 64-bit), MSI Installer Connector-ODBC
  • Windows (x86, 32-bit), MSI Installer Connector-ODBC

Lorsque le pilote est installé en 32 bits et en 64 bits, il est nécessaire de créer une source de données ODBC pointant vers la base MySQL. Nous simulerons ici les informations de connexion suivantes :

  • Hôte : 192.168.1.1
  • Identifiant : scott
  • Mot de passe : tiger
  • Base de données : labase

La source de données doit aussi être créée en 32 bits et en 64 bits, sur l’utilisateur courant et pour le système (4 fois en tout). Cette situation est certes bizarre, mais fonctionnelle dans mon cas.

Ouvrez l’Administrateur de sources de données ODBC (manipulations à faire deux fois si processeur 64 bits) :

  • 64 bits (par défaut) : Démarrer > Programmes > Outils d’administration > Sources de données (ODBC)
  • 32 bits : C:\windows\syswow64\odbcad32.exe

odbc add 1

Dans les onglets « Sources de données utilisateur » et « Sources de données système », cliquez sur « Ajouter… ».
La boite de dialogue vous demande quel type de connecteur il faut utiliser. Si tout s’est bien passé, vous devriez retrouver « MySQL ODBC 5.2 ANSI DRIVER » et « MySQL ODBC 5.2 UNICODE DRIVER ». Sélectionnez l’un ou l’autre selon l’encodage de votre base de données (ANSI sur une installation de MySQL par défaut).

Renseignez les informations de connexion à la base MySQL :

odbc add 2

Si le test ne fonctionne pas, vérifiez que l’accès distant est activé sur le serveur MySQL.

Le lien étant créé, il est nécessaire de créer ou modifier 3 fichiers d’Oracle :

initXXX.ora

Remplacez XXX par le nom de votre lien ODBC et placez ce fichier dans le dossier %ORACLE_HOME%/hs/admin/.

Warning_iconSi vous ne connaissez pas le répertoire d’Oracle, ouvrez une fenêtre de commande et tapez echo %ORACLE_HOME%.

Complétez le fichier comme ceci :

HS_FDS_CONNECT_INFO = XXX

Encore une fois, remplacez XXX par le nom de votre lien ODBC (labase dans notre cas).

listener.ora

Ce fichier se trouve dans le répertoire %ORACLE_HOME%/NETWORK/ADMIN/. La liste des listeners est contenu dans la balise suivante :

SID_LIST_LISTENER =
	(SID_LIST =

	[...]

	)

Ajoutez-y le listener suivant :

    (SID_DESC =
      (SID_NAME = labase)
      (ORACLE_HOME = D:\oracle\administrateur\product\11.2.0\dbhome_1)
      (PROGRAM = dg4odbc)
    )

Remplacez SID_NAME et ORACLE_HOME selon votre configuration. N’hésitez pas à tester la commande dg4odbc dans une invite de commande.

tnsnames.ora

Ce fichier se trouve dans le même dossier que listener.ora. Ajoutez-y ces lignes :

LABASE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA =
      (SID = labase)
    )
	(HS=OK)
  )

Remplacez le nom du lien ODBC selon votre configuration (attention, il est en majuscule à la première ligne).

A la fin de l’édition de ces 3 fichiers, redémarrez les services de votre base Oracle (le listener et la base concernée) et créez le database link avec sqlplus (ou sqldeveloper au besoin) :

create database link labase connect to "scott" identified by "tiger" using 'LABASE';

Votre database link de MySQL vers Oracle fonctionne ! Testez une requête :

SELECT COUNT(*) FROM table@LABASE

Aller plus loin…

L’intérêt d’un database link est de pouvoir éxecuter des transactions du type INSERT SELECT. Il y a quelques précautions à prendre lorsque vous utilisez un database link vers MySQL.

Par défaut les champs de type TEXT de MySQL ne sont pas reconnus en tant que tel par Oracle, mais comme des champs de type LONG, qui ne permettent pas manipulations avancées.

Il est nécessaire de stocker les chaines de caractères au format VARCHAR2. Oracle refuse les transactions de type INSERT SELECT si les structures des deux tables ne sont pas identiques.

Utilisation avec les PHP PDO

Comme je l’expliquais dans l’article Connexion entre Oracle 10g ou 11g et PHP avec les PDO, il est possible d’utiliser les PDO de PHP avec Oracle et MySQL.

Nous avons donc deux modes de connexion à la base MySQL depuis PHP :

  • Connexion directe avec la PDO MySQL
  • En « passant » par la base Oracle

Le « passage » par la base Oracle est beaucoup plus lourd, mais présente l’avantage de faciliter les bascules entre les deux SGBD (à l’aide des INSERT SELECT).

schema dblink ora mysql pdo

Il y a cependant quelques prérequis à l’utilisation de cette configuration (qui ne sont pas détaillés dans l’article sur PHP & Oracle). Par défaut, les PDO avec Oracle n’imposent pas le commit d’une transaction. Cela devient obligatoire lors de l’utilisation d’un database link vers MySQL.

Il faut entourer les requêtes avec les instructions suivantes :

$pdo->beginTransaction();
$pdo->query("requete...");
$pdo->commit();

Mot de la fin

La puissance d’outils tels qu’Oracle, MySQL et PHP permettent de consolider des données provenant de sources hétérogènes.

Utilisez-vous ce genre de bascules ? Quels problèmes rencontrez-vous ?

Article écrit avec l’aide de Julien TAUBENHAUS.

4 pensées sur “Oracle 11g : Database link vers MySQL et exploitation avec les PHP PDO

  • 11 juin 2014 à 19:13
    Permalink

    bonjour,
    es ce qu’il est possible de synchroniser automatiquement une base données Oracle 11gr2 et une base de donnes Mysql avec un connecteur odbc?
    si non pourquoi?
    si oui comment?

    merci

    Répondre
    • 12 juin 2014 à 09:37
      Permalink

      Bonjour,
      Le lien de BDD entre Oracle et MySQL permet de taper dans la base MySQL depuis Oracle.
      Si votre synchronisation est unilatérale, vous pouvez créer des triggers côté Oracle afin de répliquer les données côté MySQL.
      Sinon, pour une synchro bilatérale et propre, vous pourriez peut être utiliser PHP. En effet avec les PDO il est possible de se connecter à MySQL et Oracle. Vous pourrez lire dans une base pour insérer dans l’autre, tout en prenant soin de convertir les champs qui peuvent poser problème (champs dates par exemple).
      Quel est votre besoin ?

      Répondre
  • 30 avril 2015 à 10:04
    Permalink

    « Encore une fois, remplacez XXX par le nom de votre lien OBCD (labase dans notre cas) »

    c’est quoi un lien « OBCD »?

    Répondre

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Êtes-vous humain ? *