Comment répliquer une table entre Oracle et MySQL avec Oracle Streams ? (Partie 1)

J’ai cherché une idée pour partager mes 3 blogs à travers le même sujet… Le voici: « Comment répliquer une table entre Oracle et MySQL avec Streams ?« . Ce que je propose, c’est donc d’aborder dans l’ordre:

Si vous êtes intéressé par l’un ou l’autre de ces blogs, vous pouvez vous abonner. Voici les liens correspondants pour mon blog en français, pour mes posts en anglais sur le site de The Pythian Group (et ici pour les posts de tout The Pythian Group) et enfin pour We Do Streams!

Installer MySQL sur Ubuntu

Les bonnes nouvelles d’abord ! Ce que j’aime dans Ubuntu, c’est que mon fils de 9 ans peut s’en servir dans 95% des cas… Installer MySQL 5.0 sur Intrepid Ibex ou Hardy Heron n’est donc pas plus compliqué que la commande ci-dessous (ou la selection des package dans Synaptic Package Manager) :

sudo apt-get install mysql-server mysql-client

Et voilà, l’outil vous posera une unique question qui est le mot de passe de l’utilisateur root de mysql. J’ai mis manager, histoire de ne pas perdre le lien qui m’unit avec Oracle et me voilà avec MySQL 5.0 sur Intrepid!

Créer une base de données, un utilisateur, une table, une ligne

L’étape suivante consiste à:

  • Se connecter:
mysql -uroot -pmanager
  • Créer une base de données demo; Pour des raisons d’incompatibilité de la gateway ODBC d’Oracle avec MySQL utf8, on choisira le jeu de caractènres par défaut pour la base latin1 :
create database demo character set latin1;
  • Créer un utilisateur demo (mot de passe: demo) et lui donner un accès complet la nouvelle base de données:
grant all privileges on demo.* to 'demo'@'localhost'
identified by 'demo' with grant option;

flush privileges;
  • Se connecter avec le nouvel utilisateur:
exit;

# mysql -?
mysql -udemo -pdemo -Ddemo
  • Créer une table avec différent types de données avec InnoDB:
create table demo (
col1 integer,
col2 date,
col3 varchar(10),
col4 varchar(10) character set utf8,
col5 varbinary(10)) engine innodb;
  • Insérer une ligne dans la table:
insert into demo(col1, col2, col3, col4, col5)
values(1, cast(now() as date), '0123456789', '0123456789', '0123456789');

select * from demo G

*********** 1. row ************
col1: 1
col2: 2009-03-11
col3: 0123456789
col4: 0123456789
col5: 0123456789

Installer MySQL Connector ODBC 5.1

Cette partie contient quelques pièges : (1) La gateway générique d’Oracle ne fonctionne pas avec le driver 3.51 parce que celui-ci n’implémente pas SQLSetDescRec (cf bug 32692); (2) il n’existe pas de package pour le connector ODBC 5.1 et il faut donc l’installer depuis les sources; (3) le connector ODBC 5.1 ne fonctionne pas avec la version iodbc de Ubuntu Hardy et Intrepid.

Il faut donc installer le connector manuellement depuis les sources et tester depuis un autre outils que iodbctest… Dans l’ordre, il faut :

tar -zxvf mysql-connector-odbc-5.1*.tar.gz
cd mysql-connector-odbc-5.1*
  • Installer les packages nécessaires pour compiler le connector; la liste n’est peut-être pas exhaustive et vous la compléterez :
sudo apt-get install unixODBC unixODBC-dev 
libmysqlclient15-dev iodbc
libqt3-mt libqt3-headers
  • Configurer le source pour votre environnement et en particulier:
    • --prefix pour indiquer le répertoire qui contiendra le connector ODBC
    • --with-qt-includes pour indiquer l’emplacement des headers qt3
./configure --prefix=/home/oracle/myodbc51 
--with-qt-includes=/usr/include/qt3
aclocal
autoheader
autoconf
automake
make
  • Déployer le connector dans le répertoire d’installation:
make install

Configurer la source de données ODBC

Vous pouvez utiliser iodbcadm-gtk pour configurer la source de données. Enregistrez le driver ODBC; mettez le fichier libmyodbc5.so dans « Driver file name » et libmyodbc3S.so dans « Setup file name »; Un fichier .odbcinst.ini est créé dans le répertoire $HOME:

cd ~
$ cat .odbcinst.ini
[ODBC Drivers]
MySQL ODBC Driver 5.1 = Installed

[MySQL ODBC Driver 5.1]
Driver = /home/oracle/myodbc51/lib/libmyodbc5.so
Setup = /home/oracle/myodbc51/lib/libmyodbc3S.so

Vous pouvez ensuite créer un DSN user; Il est stocké dans le fichier .odbc.ini du répertoire $HOME:

cd ~
$ cat .odbc.ini
[ODBC Data Sources]
demo = MySQL ODBC Driver 5.1

[demo]
Driver = /home/oracle/myodbc51/lib/libmyodbc5.so
DATABASE = demo
DESCRIPTION = MySQL ODBC 5.1.5 Connector Sample
PORT = 3306
SERVER = 127.0.0.1
CHARSET = latin1
UID = demo
PWD = demo
TRACEFILE = /tmp/myodbc51.trc
TRACE = OFF

Important:
Pour utilisez avec Oracle, vous devez utiliser une variable CHARSET qui ne soit pas utf8; latin1 fera l’affaire comme nous le verrons

Tester la source de données

Si vous utilisez iodbc pour tester la source de données, vous obtenez un message d’erreur incompréhensible, comme ci-dessous:

iodbctest DSN=demo
iODBC Demonstration program
This program shows an interactive SQL processor
Driver Manager: 03.52.0607.1008
1: SQLDriverConnect = ������������������� (0) SQLSTATE=
1: ODBC_Connect = �������������������� (0) SQLSTATE=

Mais le driver fonctionne très bien; si vous voulez tester, utilisez odbctest, sans le « i » de unixODBC! Cela étant plus simple reste d’utiliser « OpenOffice.org Database » et de sélectionner « Co
nnect to an existing database » -> ODBC pour se connecter à MySQL via ODBC.

Voilà. A bientôt sur le blog de The Pythian Group pour configurer la gateway Oracle et accéder à MySQL depuis SQL*Plus. Je commenterai ce post une fois mon prochain post disponible.

5 réflexions sur “Comment répliquer une table entre Oracle et MySQL avec Oracle Streams ? (Partie 1)”

  1. Bonjour,

    Avez-vous publié la partie 3 de l’article, sur la façon de définir Streams entre Oracle et MySQL?

    Merci.

  2. la classe 🙂

    PS. Ahh, decidemment, rien n’est simple avec les bases de données.

  3. J’ai fini la configuration de la gateway sur le blog de Pythian. Il faudra probablement quelques jours pour qu’il soit publié; Pythian est en train de refaire la charte de son site et ça a l’air pénible…

    Côté Streams, c’est largement plus touchy et il me faudra quelques semaines pour terminer en conciliant ça avec mon travail. En effet, il faut gérer les transactions avec un precommit handler puis que la gateway ODBC n’est pas supportée par l’apply Streams et qu’il faut simuler un « 2-phase-commit » pour avoir une solution robuste (à défaut de performante)

    Revenez bientôt!

Les commentaires sont fermés.