IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Voir le flux RSS

Blog de Cin�Phil

[Actualit�] Interroger une base MariaDB depuis Oracle

Note : 4 votes pour une moyenne de 3,00.
par , 15/09/2021 � 14h27 (28233 Affichages)
On trouve diff�rents tutoriels, la plupart en anglais, au sujet de la cr�ation d'un database_link dans Oracle pour acc�der � une base MySQL. L'un parle du cas sp�cifique de l'acc�s � une base MariaDB mais ses exemples de code m'ont pos� quelques soucis de compr�hension entra�nant par la suite un refus de fonctionnement et quelques prises de t�te pendant pas mal de temps.
Je vais donc d�crire ici pas � pas ce qu'il faut faire pour que �a fonctionne.

Nota :
Pour les configurations ci-apr�s, je me suis servi de mes fichiers de configuration r�els que j'ai ensuite annonymis�s. Si vous rencontrez des erreurs, n'h�sitez pas � m'en faire part en commentaire.

1. Environnement technique utilis�
D'un c�t�, un serveur Oracle 12.2.0.1 sous OracleLinux que j'appelerai ici "ora.mondomaine.fr" avec une base de donn�es nomm�e "bd_oracle" et un sch�ma nomm� "schemora". Peu importe si le sch�ma contient des tables ou pas dans le cadre de ce tutoriel.

De l'autre c�t�, un serveur MariaDB (sous OpenSuse mais peu importe) que j�appellerai ici "mdb.mondomaine.fr" avec une base de donn�es nomm�e "bd_maria" et une table nomm�e "t_source" contenant quelques lignes. Peu importe la structure de la table ; ce n'est pas important dans le cadre de ce tutoriel.
L'utilisateur autoris� � se connecter � la table pour l'interroger sera 'useroracle'@'ora.mondomaine.fr' et son mot de passe "User_ORA" (parce que, �videmment, vous n'acc�dez pas � vos BDD en root, n'est-ce pas ? ).

Bien entendu, les deux serveurs sont aptes � communiquer l'un avec l'autre.

2. Installation du driver ODBC
On commence par installer, si ce n'est pas d�j� fait, le driver "unixODBC" sur le serveur Oracle :
Code bash : S�lectionner tout - Visualiser dans une fen�tre � part
sudo yum install unixODBC unixODBC-devel -y

3. Installation du connecteur ODBC pour MariaDB
Sur le serveur Oracle, il faut installer le connecteur ODBC propre � MariaDB pour que Oracle puisse interroger la BDD MariaDB.

Nota :
Comme je suis sur un serveur sous Oracle Linux, j'ai d'abord essay� d'installer le connecteur ODBC pour MySQL fournit dans la distribution mais je n'ai pas r�ussi � acc�der � MariaDB, malgr� la compatibilit� de principe existant entre MySQL et MariaDB.

Conform�ment aux instructions pr�sentes sur le site de MariaDB, pour RedHat et CentOS (puisque Oracle Linux est un clone de RedHat), on t�l�charge le connecteur dans un r�pertoire cr�� pour l'occasion puis on l'installe :
Code bash : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
mkdir odbc_package
cd odbc_package
wget https://downloads.mariadb.com/Connectors/odbc/connector-odbc-3.1.7/mariadb-connector-odbc-3.1.7-ga-rhel7-x86_64.tar.gz
tar -xvzf mariadb-connector-odbc-3.1.7-ga-rhel7-x86_64.tar.gz
sudo install lib64/libmaodbc.so /usr/lib64/
sudo install -d /usr/lib64/mariadb/
sudo install -d /usr/lib64/mariadb/plugin/
sudo install lib64/mariadb/plugin/auth_gssapi_client.so /usr/lib64/mariadb/plugin/
sudo install lib64/mariadb/plugin/caching_sha2_password.so /usr/lib64/mariadb/plugin/
sudo install lib64/mariadb/plugin/client_ed25519.so /usr/lib64/mariadb/plugin/
sudo install lib64/mariadb/plugin/dialog.so /usr/lib64/mariadb/plugin/
sudo install lib64/mariadb/plugin/mysql_clear_password.so /usr/lib64/mariadb/plugin/
sudo install lib64/mariadb/plugin/sha256_password.so /usr/lib64/mariadb/plugin/

4. Cr�ation de la source de donn�es
On peut suivre maintenant les instructions de la page "Creating a Data Source with MariaDB Connector/ODBC" pour configurer le driver unixODBC afin qu'il puisse communiquer avec MariaDB. Commen�ons par cr�er, avec l'�diteur de notre choix, un fichier "MariaDB_odbc_driver_template.ini" d�crivant le connecteur ODBC de MariaDB et le chemin du fichier � utiliser pour le driver :
Code ini : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
[MariaDB ODBC 3.0 Driver]
Description = MariaDB Connector/ODBC v.3.0
Driver = /usr/lib64/libmaodbc.so

Puis installons cette configuration dans le fichier de configuration de unixODBC : /etc/odbcinst.ini
Code bash : S�lectionner tout - Visualiser dans une fen�tre � part
sudo odbcinst -i -d -f MariaDB_odbc_driver_template.ini
L'installation doit donner un message de ce genre :
odbcinst: Driver installed. Usage count increased to 1.
Target directory is /etc
Si vous v�rifiez le contenu du fichier "/etc/odbcinst.ini", vous y trouverez � la fin le contenu de notre fichier "MariaDB_odbc_driver_template.ini".

5. Cr�ation d'un Data Source Name (DSN)
Nous allons maintenant cr�er la d�finition de la source de donn�es MariaDB qui sera interrog�e par Oracle. Vous devrez bien s�r r�p�ter cette op�ration pour chaque source de donn�es � interroger.
Puisque j'ai nomm� la base de donn�es � interroger "bd_maria", nous cr�ons un fichier "bd_maria_odbc.ini". Ce nom �tant utilis� plus tard dans la configuration, si vous le changez, tenez-en compte par la suite !
Code ini : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[ODBC Data Sources]
bd_maria=bd_maria schema data source
 
[bd_maria]
Driver = /usr/lib64/libmaodbc.so
Description = ODBC for MariaDB
SERVER = mdb.mondomaine.fr
PORT = 3306
USER = useroracle
Password = User_ORA
charset = utf8mb4
OPTION = 3
Database = bd_maria
SOCKET =
Notas :
J'ai d� remplacer le nom du serveur MariaDB par son IP et, c�t� MariaDB, j'ai d� changer l'utilisateur en 'useroracle'@'<ip du serveur Oracle>'.
Si votre table a un autre charset, vous pouvez le modifier. De toute mani�re, vous verrez par la suite que j'ai d� aussi faire une conversion explicite dans mes requ�tes Oracle pour les colonnes de texte.

Installons ce fichier dans la configuration globale /etc/odbc.ini :
Code bash : S�lectionner tout - Visualiser dans une fen�tre � part
sudo odbcinst -i -s -l -f bd_maria_odbc.ini

Puis v�rifions qu'on peut se connecter � la base de donn�es MariaDB depuis le serveur Oracle avec l'utilitaire isql :
Vous devriez obtenir ceci :
Code bash : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL>
Et vous pouvez directement lancer des requ�tes sur le serveur MariaDB :
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
SQL> use bd_maria;
SQLRowCount returns 0
SQL> select count(*) from t_source;
+---------------------+
| count(*)            |
+---------------------+
| 5                          |
+---------------------+
SQLRowCount returns 1
1 rows fetched
Pour revenir � la console Linux, quittez :
6. Configuration du processus d'�coute Oracle
La configuration ODBC �tant termin�e, passons � la configuration d'Oracle Database (rappel : la version d'Oracle utilis�e est la 12.2.0.1).

Dans le fichier listener.ora, ajoutons un SID pour notre source de donn�es ODBC :
Code bash : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
cd $ORACLE_HOME/network/admin
vi listener.ora
Voici le SID � ajouter pour l'exemple de ce tutoriel. Je lui donne le nom "sid_db_maria". Chaque Source de donn�es ODBC doit avoir le sien et c'est le seul param�tre de cette configuration qui change :
<votre ou vos autre(s) SID>

(SID_DESC =
(SID_NAME = sid_db_maria)
(ORACLE_HOME = /produits/oracle/products/12.2.0.1/db_1)
(PROGRAM = dg4odbc)
(ENV = LD_LIBRARY_PATH=/usr/lib64:/produits/oracle/products/12.2.0.1/db_1/lib)
)
7. Cr�ation de la passerelle pour ODBC
Afin que Oracle puisse utiliser le DSN d�fini au chapitre 5, il faut maintenant cr�er une passerelle pour le service h�t�rog�ne ODBC (heterogeneous service : hs) d�di� � notre source de donn�es. Il faut donc cr�er un fichier de param�tres par source de donn�es dans le r�pertoire $ORACLE_HOME/hs/admin et dont le nom est de la forme : init<SID>.ora. Dans notre cas, ce sera donc le fichier "initsid_db_maria.ora" :
Code ini : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# HS init parameters
#
HS_FDS_CONNECT_INFO = sid_db_maria
HS_FDS_TRACE_LEVEL = DEBUG
HS_TRACE_FILE_NAME = /var/log/odbctrace.log
HS_FDS_SHAREABLE_NAME = /usr/lib64/libmaodbc.so
HS_NLS_NCHAR=UTF8
 
#
# ODBC specific environment variables
#
set ODBCINI=/home/oracle/pefodbc.ini
set LD_LIBRARY_PATH=/usr/lib64
 
#
# Environment variables required for the non-Oracle system
#
#set <envvar>=<value>
set HOME=/home/oracle

8. Configuration du nom de service r�seau Oracle
Ajoutons maintenant une entr�e dans le fichier $ORACLE_HOME/network/admin/tnsnames.ora :
Voici l'entr�e � ajouter :
sid_db_maria =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS =
(PROTOCOL = TCP)
(HOST = ora.mondomaine.fr)
(PORT = 1521)
)
)
(CONNECT_DATA =
(SID = sid_db_maria)
)
(HS = OK)
)
9. Cr�ation du lien de base de donn�es (DATABASE LINK)
Nous en avons termin� avec les fichiers de configuration. Derni�re �tape avant d'interroger notre source de donn�es MariaDB � partir d'Oracle : cr�er dans la base de donn�es Oracle un lien vers notre source.
J'utilise ici le programme sqlplus mais vous pouvez le faire avec Sql Developer. Je cr�e un DATABASE LINK public mais vous pouvez le rendre sp�cifique � un sch�ma de votre BDD. Je vous renvoie � la documentation d'Oracle pour de plus amples possibilit�s sur cette cr�ation.
Entrons d'abord dans sqlplus :
Puis ex�cutons cette requ�te SQL :
Code SQL : S�lectionner tout - Visualiser dans une fen�tre � part
CREATE PUBLIC DATABASE LINK <nom du database link> connect to "<user MariaDB>" identified by "<mdp du user MariaDB>" using 'nom du dsn';
C'est � dire pour notre exemple (je nomme le database link "dbl_bd_maria") :
Code SQL : S�lectionner tout - Visualiser dans une fen�tre � part
CREATE PUBLIC DATABASE LINK dbl_bd_maria connect to "useroracle" identified by "User_ORA" using 'bd_maria';
Et nous pouvons maintenant interroger notre table MariaDB comme nous l'avions fait tout � l'heure avec isql :
Code SQL : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
SELECT COUNT(*) FROM "t_source"@dbl_bd_maria;
  COUNT(*)
-----------
        5

10. Quelques subtilit�s
1) Nommage des objets MariaDB dans les requ�tes Oracle.
Vous aurez peut-�tre remarqu� que, dans la derni�re requ�te ci-dessus, j'ai mis le nom de la table entre guillemets. En effet, Oracle met syst�matiquement les requ�tes en lettres capitales. Si les tables, colonnes et autres objets de la bdd MariaDB sont �crits en minuscules, alors il faut mettre ces noms entre guillemets dans les requ�tes c�t� Oracle afin qu'il n'essaie pas d'interroger une table nomm�e T_SOURCE qui n'existe pas.

2) Transtypage
Bien que ma table soit en utf8mb4 dans MariaDB et que Oracle ait un characterset en principe compatible (AL16UTF16) si j'ai bien compris la doc Oracle � ce sujet, j'ai rencontr� des soucis lors de la lecture des caract�res accentu�s et sp�ciaux. Jai donc d� proc�der � une conversion explicite dans mes requ�tes Oracle :
Code SQL : S�lectionner tout - Visualiser dans une fen�tre � part
SELECT CONVERT("ma_colonne", 'WE8ISO8859P1', 'AL32UTF8') ma_colonne FROM "t_source"@dbl_bd_maria;

3) Taille des colonnes lues lors d'un import
J'ai mis en oeuvre cette technique du DATABASE LINK pour importer des donn�es issues d'une vue MariaDB dans une table Oracle � l'aide d'une proc�dure Oracle contenant une requ�te MERGE. Alors que les largeurs des colonnes de texte soient identiques dans la source et la cible, Oracle calculait une longueur de donn�es sup�rieure au nombre de caract�res de la table source. J'ai d� transformer mes colonnes texte c�t� Oracle de VARCHAR2(<n> BYTE) en VARCHAR2(<n> CHAR) et j'ai d� TRIMer les colonnes interrog�es :
Code SQL : S�lectionner tout - Visualiser dans une fen�tre � part
SELECT CONVERT(TRIM("ma_colonne"), 'WE8ISO8859P1', 'AL32UTF8') ma_colonne FROM "t_source"@dbl_bd_maria;

Envoyer le billet � Interroger une base MariaDB depuis Oracle � dans le blog Viadeo Envoyer le billet � Interroger une base MariaDB depuis Oracle � dans le blog Twitter Envoyer le billet � Interroger une base MariaDB depuis Oracle � dans le blog Google Envoyer le billet � Interroger une base MariaDB depuis Oracle � dans le blog Facebook Envoyer le billet � Interroger une base MariaDB depuis Oracle � dans le blog Digg Envoyer le billet � Interroger une base MariaDB depuis Oracle � dans le blog Delicious Envoyer le billet � Interroger une base MariaDB depuis Oracle � dans le blog MySpace Envoyer le billet � Interroger une base MariaDB depuis Oracle � dans le blog Yahoo

Mis � jour 08/07/2022 � 12h52 par CinePhil

Cat�gories
Base de donn�es , MySQL / MariaDB , Oracle Database

Commentaires

  1. Avatar de Invit�
    • |
    • permalink
    Cheh ! Vous n'auriez pas tous ces probl�mes avec SQL Server.

    (Ce commentaire est une oeuvre de fiction. Toute ressemblance avec une personne ayant vraiment exist� serait purement fortuite)
  2. Avatar de CinePhil
    • |
    • permalink
    Citation Envoy� par Jeff_67
    Cheh ! Vous n'auriez pas tous ces probl�mes avec SQL Server.

    (Ce commentaire est une oeuvre de fiction. Toute ressemblance avec une personne ayant vraiment exist� serait purement fortuite)

    Il est question qu'on change de PGI pour la partie gestion. Peut-�tre sera t-il sous SQL Server... C'est un monde que je n'ai que tr�s peu explor�.