Unifier les connexions de bases de données avec ODBC

1. Introduction

ODBC (Open Database Connectivity) est une interface de communication en C qui permet à des applications de se connecter à différentes bases de données d’éditeurs différents de manière transparente, c’est à dire via une interface unique. Dans ce modèle, une application se connectera à un DSN (Data Source Name) qui sera préalablement configuré au niveau de la couche ODBC pour attaquer une base de données en particulier. ODBC sera capable de se connecter à un SGBDR à condition que le driver de connexion soit disponible et renseigné dans son fichier de configuration.

A l’origine développé par Microsoft pour les systèmes MS Windows, l’interface ODBC fonctionne également sur la majorité des systèmes Unix. Dans ce cas de test, on utilisera un serveur CentOS 7.5 et le package unixODBC disponible dans les repositories par défaut. Nous utiliserons ce serveur pour centraliser la connexion à deux bases de données différentes, ici, Oracle Database et MySQL.

 

2. Prérequis

Voici les éléments requis pour ce cas de test :

  • Une instance Oracle Database fonctionnelle, avec listener en écoute.
  • Une base de données MySQL fonctionnelle avec un utilisateur d’accès et une base de données créée.
  • Un serveur CentOS 7.5 pour la partie ODBC (peut être l’un des deux serveurs de BDD).

Toutes les opérations décrites ci-après sont à réaliser sur le serveur CentOS 7.5.

 

3. Mise en place

3.1 Installation ODBC

Pour commencer, un certain nombre de packages logiciels doivent être installés.

Installer le package ODBC depuis les dépôts :

yum install unixODBC.x86_64 unixODBC-devel.x86_64

Vérifier la bonne installation et les chemins des fichiers de conf via le chemin :

odbcinst -j

 

3.2 Connexion Oracle Database

Pour que l’interface ODBC puisse exploiter des bases de données, il lui faut les drivers des SGDBR associés.
Pour installer le client Oracle 18.3 x64, télécharger les fichiers RPM suivant depuis le site d’oracle :

  • oracle-instantclient18.3-basic-18.3.0.0.0-1.x86_64.rpm
  • oracle-instantclient18.3-odbc-18.3.0.0.0-1.x86_64.rpm
  • oracle-instantclient18.3-sqlplus-18.3.0.0.0-1.x86_64.rpm

Installer les RPM sur le serveur :

rpm -i oracle-instantclient18.3-basic-18.3.0.0.0-1.x86_64.rpm
rpm -i oracle-instantclient18.3-odbc-18.3.0.0.0-1.x86_64.rpm
rpm -i oracle-instantclient18.3-sqlplus-18.3.0.0.0-1.x86_64.rpm

Configurer les variables d’environnement pour le client Oracle. Ajouter à la fin de /etc/profile :

export LD_LIBRARY_PATH=/usr/lib/oracle/18.3/client64/lib:$LD_LIBRARY_PATH
export ORACLE_HOME=/usr/lib/oracle/18.3/client64
export TNS_ADMIN=/usr/lib/oracle/18.3/client64/lib/network/admin
export PATH=$PATH:$ORACLE_HOME/bin:/usr/pgsql-9.6/bin

Pour simplifier la connexion à la base de données Oracle, on préfèrera l’utilisation d’un nom TNS. Après avoir reconnecté la session shell pour rafraichir les variables d’environnement définies ci-dessus, créer le répertoire $TNS_ADMIN et le fichier tnsnames.ora et y saisir les informations de connexion à la base de données.

mkdir -p ${TNS_ADMIN}
vi /usr/lib/oracle/18.3/client64/lib/network/admin/tnsnames.ora

----------- tnsnames.ora -----------
EASYTEST =
 ( DESCRIPTION =
  (ADDRESS_LIST =
  (ADDRESS =
  (PROTOCOL = TCP)
  (Host = ora-test.local)
  (Port = 1521)
  )
 )
 (CONNECT_DATA = (SID = EASYTEST)	
 )
)
------------------------------------

On peut tester le bon fonctionnement de la configuration en se connectant à distance à la base via sqlplus.

-bash-4.2$ sqlplus EASYTEST@EASYTEST

SQL*Plus: Release 18.0.0.0.0 - Production on Mon Dec 31 16:59:43 2018
Version 18.3.0.0.0

Copyright (c) 1982, 2018, Oracle.  All rights reserved.

Enter password:

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Data Mining
and Real Application Testing options

SQL>

Maintenant que la connexion à la base de données Oracle s’établit en sqlplus, on peut configurer cette base de données en tant que data source ODBC. Pour ce faire, ajouter la configuration suivante dans /etc/odbcinst.ini pour déclarer le driver Oracle :

vi /etc/odbcinst.ini
----------- odbcinst.ini -----------
[Oracle]
Description     = ODBC for Oracle
Driver          = /usr/lib/oracle/18.3/client64/lib/libsqora.so.18.1
Setup           = /usr/lib/oracle/18.3/client64/lib/libsqora.so.18.1
FileUsage       = 1
Driver Logging  = 7
------------------------------------

Ajouter maintenant la configuration du DSN dans le fichier /etc/odbc.ini. Le nom du driver utilisé doit correspondre au nom du driver déclaré dans odbcinst.ini :

vi /etc/odbc.ini
------------- odbc.ini -------------
[ora-easytest]
Driver = Oracle
DSN = Oracle
ServerName = EASYTEST
UserID = EASYTEST
Password = secret
------------------------------------

A ce stade, le DSN est prêt. Pour tester la connexion, le paquet fournit le client ODBC iSQL. On peut l’utiliser pour se connecter à une data source en lui spécifiant uniquement son nom :

isql easytest

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


SQL> select * from emp where id = 1;

+-----------+-----------------+-------------+---------+
| ID        | FIRST_NAME      | LAST_NAME   | DEPT_ID |
+-----------+-----------------+-------------+---------+
| 1         | Robert          | KING        | 1       |
+-----------+-----------------+-------------+---------+

SQLRowCount returns -1
1 rows fetched

La connexion s’établit, et on arrive à faire un SELECT sur une table. A partir de là, il est possible d’exploiter la base de données depuis de multiples contextes applicatifs sur la machine locale, un grand nombre de langages supportant les connexions ODBC.

 

3.3 Connexion MySQL

Voyons maintenant comment configurer une data source pointant sur la base de données MySQL. Dans un premier temps, il conviendra d’installer le driver odbc pour mysql :

yum install mysql-connector-odbc.x86_64

Dans /etc/odbcinst.ini, on spécifie le chemin du driver :

[MySQL]
Description     = ODBC for MySQL
Driver          = /usr/lib64/libmyodbc5w.so

Dans obdc.ini, on renseigne les informations de connexion à la base MySQL :

[mysql-easytest]
Driver = MySQL
USER = easytest
PASSWORD = secret
SERVER = mysql.local
Database = easytest
Port = 3306

Il suffit alors de tester la connexion de la même manière que pour la base Oracle, à savoir via iSQL :

isql mysql-easytest

+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> select * from test_table;
+-----------+
| id        |
+-----------+
| 1         |
| 2         |
| 3         |
+-----------+
SQLRowCount returns 3
3 rows fetched

La connexion s’établit et l’on peut faire une SELECT sur la table de test. On comprend donc que ODBC fait office de couche d’abstraction entre les applications et les bases de données. Sur ce serveur où les deux bases de données Oracle et MySQL sont configurées avec la couche ODBC, un applicatif pourra exploiter ces bases avec la même méthode, sans considération pour le SGDBR sous-jacent, et avec comme seule information requise le Data Source Name correpondant à la base de données cible.

On peut donc imaginer y installer un applicatif qui exploite les deux bases de données sans avoir à utiliser une méthode et une configuration spécifique pour la connexion à chacune des bases.