Database Link entre Oracle XE et PostgreSQL
Comment établir une connexion entre Oracle Express Edition et EDB Postgres
Cet article fournit un guide pour effectuer la configuration des services de connexion réseau hétérogènes d'Oracle Express Edition vers le logiciel de gestion de base de données EDB Postgres dans l'environnement Linux RHEL/CentOS/OL (RedHat Enterprise Linux/Community enterprise Operating System/Oracle Linux) :
- Introduction
- Pré-requis
- Création d'une Data Source Name (DSN) ODBC sur Linux
- Configuration d'Oracle Heterogeneous Services
- Configuration d'Oracle Net
- Tests et mise en œuvre
Introduction
Oracle database et également la version libre Express Edition XE (11g et 18c), prennent en charge des services de connexion hétérogènes pour permettre aux informations provenant d'une base de données non Oracle, compatible ODBC (MS Access, SQL Server, MySQL, PostgreSQL, etc.), d'être utilisées depuis une session SQL. Cette fonctionnalité est rapide et simple à configurer. Les étapes décrites ci-dessous peuvent être utilisées pour connecter Oracle (toutes versions) à n'importe quelle base de données. Cette fonctionnalité est une alternative très intéressante face à l'entreprise de migration d'Oracle vers une base de données d'un autre éditeur de logiciel qui peut en fait s'avérer relativement complexe et coûteuse.
Pré-requis
Pour pouvoir configurer des liens inter base (Database Links) entre Oracle et PostgreSQL, les logiciels Oracle XE 18c et EDB Postgres sur Linux RHEL/CentOS/OL doivent avoir été installés avec des bases de données opérationnelles. Consultez les articles Installation Oracle Database 18c Express Edition (XE) Sur Oracle Linux, EDB Postgres – Enregistrement & Référentiel et EDB Postgres – installation et mise en œuvre pour effectuer ces opérations si ce n'est oas déjà fait.
Création d'une Data Source Name (DSN) ODBC sur Linux
Installation du driver ODBC pour EDB Postgres sur Linux 7
login as: root root@serveur's password: xxxxx # yum install edb-odbc Modules complémentaires chargés : langpacks, ulninfo Résolution des dépendances --> Lancement de la transaction de test ---> Le paquet edb-odbc.x86_64 0:12.00.0000.01-1.rhel7 sera installé
Emplacement du driver EDB odbc
# ls /usr/edb/odbc edb-odbc_license.txt lib samples share # ls /usr/edb/odbc/lib edb-odbc.so
Dans le cas où vous utilisez la version libre de PostgreSQL vous pouvez installer le driver ODBC comme suit :
# yum install unixODBC unixODBC-devel freetds -y # odbcinst -j unixODBC 2.3.1 DRIVERS............: /etc/odbcinst.ini SYSTEM DATA SOURCES: /etc/odbc.ini FILE DATA SOURCES..: /etc/ODBCDataSources USER DATA SOURCES..: /root/.odbc.ini SQLULEN Size.......: 8 SQLLEN Size........: 8 SQLSETPOSIROW Size.: 8
Eléments odbc installés si vous utilisez un Linux 6
# rpm -qa | grep odbc edb-odbc-12.00.0000.01-1.rhel6.x86_64 mysql-connector-odbc-setup-5.3.9-1.el6.x86_64 postgresql-odbc-08.04.0200-1.el6.x86_64 mysql-connector-odbc-5.3.9-1.el6.x86_64
Configuration de la Data Source dans le fichier /etc/odbc.ini
# vi /etc/odbc.ini
[PG] Description = PG Driver = /usr/lib64/psqlodbc.so ServerName = 127.0.0.1 Username = oracle Password = secret Port = 5432 Database = oracle [EDB] Description = EDB Driver = /usr/edb/odbc/lib/edb-odbc.so ServerName = 127.0.0.1 Username = enterprisedb Password = secret Port = 5444 Database = edb
Deux drivers sont installés : celui pour la version libre de PostgreSQL et celui de EDB Postgres. C'est l'entrée EDB qui sera utilisée, le port d'écoute étant 5444.
Configuration d'Oracle Heterogeneous Services
Les drivers de connexion réseau hétérogènes d'Oracle Express Edition sont installés dans le directory $ORACLE_HOME/hs/admin
Le directory contient des fichiers d'exemple. Création du fichier d'initialisation initEDB.ora :
$ cd $ORACLE_HOME/hs/admin
$ ls
extproc.ora initdg4odbc.ora listener.ora.sample tnsnames.ora.sample
$ cp initdg4odbc.ora initEDB.ora
Configuration du fichier d'initialisation initEDB.ora
# su - oracle $ cd $ORACLE_HOME/hs/admin $ vi initEDB.ora # # HS init parameters # HS_FDS_CONNECT_INFO = EDB HS_FDS_TRACE_LEVEL = 0 HS_FDS_SHAREABLE_NAME = /usr/edb/odbc/lib/edb-odbc.so # HS_LANGUAGE = UTF8 # HS_NLS_NCHAR = UCS2 # HS_LANGUAGE = AMERICAN_AMERICA.AL24UTFFSS # HS_NLS_LENGTH_SEMANTICS=CHAR # HS_LANGUAGE = AMERICAN_AMERICA.WE8ISO8859P15 HS_LANGUAGE = AMERICAN_AMERICA.WE8MSWIN1252 # # ODBC specific environment variables # set ODBCINI=/etc/odbc.ini
Les lignes en commentaires sont préfixées par un "#", ce sont des modèles de configuration. Le fichier DSN est indiqué par le paramètre ODBCINI.
Configuration d'Oracle Net
Configuration du fichier listener.ora
$ cd $ORACLE_HOME/network/admin $ vi listener.ora
DEFAULT_SERVICE_LISTENER = XE LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = esiea_xe.localdomain)(PORT = 1521)) (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) ) ) SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = PLSExtProc) (ORACLE_HOME = /opt/oracle/product/18c/dbhomeXE) (PROGRAM = extproc) ) (SID_DESC = (SID_NAME=EDB) (ORACLE_HOME = /opt/oracle/product/18c/dbhomeXE) (PROGRAM=dg4odbc) ) )
L'entrée EDB fait référence au driver dg4odbc et au fichier d'initialisation initEDB.ora. Le service EDB sera démarré via le listener. Le listener doit être relancé pour prendre en compte la nouvelle configuration :
$ lsnrctl reload $ lsnrctl stat Service "EDB" has 1 instance(s). Instance "EDB", status UNKNOWN, has 1 handler(s) for this service...
Configuration du fichier tnsnames.ora
$ vi tnsnames.ora
# tnsnames.ora Network Configuration File: /opt/oracle/product/18c/dbhomeXE/network/admin/tnsnames.ora # Generated by Oracle configuration tools. XEPDB1 = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = ol77.localdomain)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = XEPDB1) ) ) XE = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = ol77.localdomain)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = XE) ) ) EDB = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) (CONNECT_DATA = (SID = EDB) ) (HS = OK) ) LISTENER_XE = (ADDRESS = (PROTOCOL = TCP)(HOST = ol77.localdomain)(PORT = 1521))
L'Alias SQL*NET EDB fera appel au service EDB qui correspond à une connexion de type "Heterogeneous Service" (HS)
Tests et mise en œuvre
Création du lien inter bases (Database Link)
$ sqlplus / as sysdba SQL> alter session set container=xepdb1 SQL> alter user hr identified by hr account unlock; SQL> grant create database link to hr; SQL> exit $ sqlplus hr/hr@localhost/xepdb1 SQL> create database link EDB connect to "enterprisedb" identified by "secret" using 'EDB';
Dans la base EDB Postgres le schéma HR a été créé (voir l'article EDB*Plus & Migration Toolkit), il contient les tables "employees" et "departments".
SQL> desc "hr"."employees"@edb Name Null? Type ----------------- -------- ---------------------------- employee_id NOT NULL NUMBER(6) first_name VARCHAR2(240) last_name NOT NULL VARCHAR2(300) email NOT NULL VARCHAR2(300) phone_number VARCHAR2(240) hire_date NOT NULL DATE job_id NOT NULL VARCHAR2(120) salary NUMBER(8,2) commission_pct NUMBER(2,2) manager_id NUMBER(6) department_id NUMBER(4)
Test d'un ordre SQL SELECT
SQL> col last_name format A30 SQL> select "employee_id", "last_name" from "hr"."employees"@edb; employee_id last_name ----------- ------------------------------ 198 OConnell 199 Grant 200 Whalen 201 Hartstein 202 Fay 203 Mavris 204 Baer 205 Higgins 206 Gietz 100 King 101 Kochha
En conclusion les objets du schéma HR de la base EDB Postgres sont bien accessible depuis la session Oracle.