Déclarer une table externe Oracle sous MariaDB
Source
Introduction
Les utilisateurs de bases de données Oracle peuvent être familiers avec des liaisons de bases de données qui permettent de récupérer des données de bases de données distantes directement de la base de données locale. Malheureusement cela ne fonctionne qu’avec les bases de données Oracle.
Ce tutoriel va montrer les étapes nécessaires pour permettre à un serveur MariaDB de se connecter à une base de données Oracle 12c distante par le moteur CONNECT. Cela permettra aux données de la base de données Oracle d’être interrogées directement depuis MariaDB comme une table locale, à l’aide d’un lien de base de données.
Note : A ce jour, le moteur CONNECT ne permet que des requêtes SELECT sur la base de données distante. Le moteur est toujours en évolution et supportera d’autres opérations telles que INSERT, UPDATE et DELETE dans le futur.
Configuration
– Linux Debian 10, 64-bit – MariaDB 64-bit – Oracle Instant Client 21.6 64-bit (Basic, SDK/devel, odbc, sqlplus) – unixodbc 64bit |
Etape 1 : Installer MariaDB-Server
Si le serveur MariaDB n’est pas déjà installé, installez le. Un article sur ce sujet par exemple ici :
https://www.malekal.com/installer-mysql-mariadb-sur-debian-10/
Etape 2 : Installer Oracle Instant Client
Les modules nécessaires peuvent être téléchargés depuis le site Oracle, ici :
https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html
Après l’installation, définissez LD_LIBRARY_PATH avec cette commande :
$ sudo nano /etc/ld.so.conf.d/oracle-instantclient.conf |
Et indiquez le dossier où vous avez déposé votre InstantClient Oracle :
/usr/lib/oracle/21.6/client64/lib |
Puis lancez ldconfig :
$ sudo ldconfig |
Etape 3 : Installer unixodbc
Ouvrez votre terminal et lancez cette commande :
$ sudo apt install unixodbc |
Vérifiez que le 64-bit unixodbc correct est installé :
jrullier@kodachi:~$ which isql /usr/bin/isql jrullier@kodachi:~$ file /usr/bin/isql /usr/bin/isql: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=50b290829ba8bea725ee65ad9b2973326f6def71, stripped jrullier@kodachi:~$ |
Si vous avez installé le correct unixodbc, la réponse doit contenir :
ELF 64-bit LSB etc…. |
Sinon, assurez-vous de purger le diver unixodbc et ensuite lancez sudo apt-get autoremove pour être sûr que le système est propre de toutes dépendances du précédent unixodbc. Regardez pour plus de détails dans la section « Dépannage » ci-dessous.
Etape 4 : Installer le moteur CONNECT MariaDB
Ouvrez votre terminal et lancez cette commande :
$ sudo apt install mariadb-connect-engine-10.0 |
Installer le client ODBC oracle
Récupérer le package ODBC du site Oracle ici:
https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html
Vous pouvez aussi le télécharger directement depuis votre Linux à l’aide de la commande wget :
$ wget https://download.oracle.com/otn_software/linux/instantclient/216000/instantclient-odbc-linux.x64-21.6.0.0.0dbru.zip
Dézippez le fichier, et copiez le contenu dans le sous-dossier lib du client Oracle :
Etape 5 : Configurer la connexion ODBC
Pour configurer la connexion ODBC, vous allez devoir éditer 2 fichiers : /etc/odbc.ini et /etc/odbcinst.ini.
D’abord configurez odbc.ini, par exemple avec l’éditeur nano
$ sudo nano /etc/odbc.ini |
Et ajoutez ces ligne dans le fichier :
[MYORACLEDSN] Application Attributes = T Attributes = W BatchAutocommitMode = IfAllSuccessful CloseCursor = F DisableDPM = F DisableMTS = T Driver = Oracle EXECSchemaOpt = EXECSyntax = T Failover = T FailoverDelay = 10 FailoverRetryCount = 10 FetchBufferSize = 64000 ForceWCHAR = F Lobs = T Longs = T MetadataIdDefault = F QueryTimeout = T ResultSets = T ServerName = //<oracledbIPorDomainName>:1521/<SID> SQLGetData extensions = F Translation DLL = Translation Option = 0 UserName = <username to oracle dbase> Password = <password for above username> |
Adaptez les valeurs ServerName, UserName et Password ci-dessus selon votre installation Oracle.
Après cela configurez odbcinst.ini par exemple avec l’éditeur nano :
sudo nano /etc/odbcinst.ini |
Et ajoutez ces lignes dans le fichier :
[Oracle] Description = Oracle ODBC Connection Driver = /usr/lib/oracle/12.1/client64/lib/libsqora.so.12.1 Setup = FileUsage = CPTimeout = CPReuse = |
Etape 6 : Testez votre connexion ODBC
Vérifiez la connexion ODBC en tapant cette commande :
$ isql -v MYORACLEDSN |
ou
$ isql MYORACLEDSN <username> <password> |
Vous obtiendrez un message « Connected! » si la connexion ODBC est réussie.
Etape 7 : Créez votre table CONNECT
Installez le moteur de base de données « CONNECT » :
$ sudo apt-get install mariadb-plugin-connect
1. Ouvrez votre terminal, et connectez-vous à MariaDB :
$ mysql -u root -p |
2. Maintenant créons une table avec le moteur CONNECT et le type ODBC avec le nom de la table Oracle que nous voulons rattacher par exemple ici une table nommée « HOLX_SSI_LABEL_V« . nous allons faire pointer cette table vers la table « HOLX_SSI_LABEL_V » table de Oracle :
Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 3 Server version: 10.0.11-MariaDB-log MariaDB Server Copyright (c) 2000, 2013, Oracle, Monty Program Ab and others. Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement. MariaDB [(none)]> MariaDB [test]> MariaDB [ssi]> CREATE TABLE HOLX_SSI_LABEL_V ENGINE=CONNECT TABLE_TYPE=ODBC DBNAME=APPSRO CONNECTION=’DSN=MYORACLEDSN;UID=AxxxxxRO;PWD=hDxxxxn’; Query OK, 0 rows affected (22.161 sec) |
3. Félicitations ! Vous devriez maintenant pouvoir lancer des requêtes SELECT sur la table TABLE HOLX_SSI_LABEL_V qui est actuellement directement liée à la table TABLE HOLX_SSI_LABEL_V de la base de données Oracle :
MariaDB [ssi]> SELECT ITEM_NO FROM HOLX_SSI_LABEL_V LIMIT 5; +----------+ | ITEM_NO | +----------+ | SFP95100 | | SFP95100 | | SFP95100 | | SFP95100 | | SFP95100 | +----------+ 5 rows in set (3.981 sec) MariaDB [ssi]>
Dépannage
Si vous lancez la commande $ isql -v ifas et que vous obtenez un message comme celui-ci :
[01000][unixODBC][Driver Manager]Can’t open lib ‘/usr/lib/oracle/12.1/client64/lib/libsqora.so.12.1’ : file not found |
Cela signifie que vous êtes dans l’un de ces 2 cas :
A. Vous avez installé le mauvais unixodbc (32 bit)
OU
B. libsqora.so.12.1 is missing some of the dependency files
Pour rectifier la situation A :
1. Supprimez le unixodbc actuel
$ sudo apt-get purge unixodbc:i386sudo apt-get autoremove |
2. Réinstallez unixodbc
$ sudo apt install unixodbc |
3. Pour vérifier que vous avez installé la bonne version :
$ which isqlfile <the output above> |
La réponse devrait ressembler à ceci :
ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=62f4ed55b29f0d9ad136122448b672d7725ea01f, stripped |
Pour rectifier la situation B :
Pour vérifier quel fichier de dépendance est manquant, tapez ceci :
ldd /usr/lib/oracle/12.1/client64/lib/libsqora.so.12.1′ |
Vous obtiendrez une réponse similaire à cela :
linux-vdso.so.1 => (0x00007fff64727000)libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fc607792000)libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fc60748c000)libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fc60726d000)libnsl.so.1 => /lib/x86_64-linux-gnu/libnsl.so.1 (0x00007fc607053000)librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fc606e4b000)libclntsh.so.12.1 => /usr/lib/oracle/12.1/client64/lib/libclntsh.so.12.1 (0x00007fc60415d000)libodbcinst.so.2 => not foundlibc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc603d97000) /lib64/ld-linux-x86-64.so.2 (0x00007fc607e0a000)libnnz12.so => /usr/lib/oracle/12.1/client64/lib/libnnz12.so (0x00007fc603680000)libons.so => /usr/lib/oracle/12.1/client64/lib/libons.so (0x00007fc60343c000)libaio.so.1 => /lib/x86_64-linux-gnu/libaio.so.1 (0x00007fc60323a000)libclntshcore.so.12.1 => /usr/lib/oracle/12.1/client64/lib/libclntshcore.so.12.1 (0x00007fc602ce9000) |
dans cet exemple libodbcinst.so.2 est manquant. La plupart du temps la library existe actuellement sur l’OS, mais est installée au mauvais endroit. Ensuite, cherchons le fichier :
$ sudo updatedb $ locate libodbcinst |
Output :
/usr/lib/x86_64-linux-gnu/libodbcinst.so.1/usr/lib/x86_64-linux-gnu/libodbcinst.so.1.0.0 |
Yup, the file is actually installed but in a wrong place!. To rectify it just create a symlink in /usr/lib :
$ cd /usr/lib $ sudo ln -s /usr/lib/x86_64-linux-gnu/libodbcinst.so.1 libodbcinst.so.2 |
C’est tout ! Testez à nouveau votre connexion ODBC en tapant :
$ isql -v MYORACLEDSN |
Il devrait vous être demandé le login et le mot de passe cette fois-ci. Bonne chance !