Connexion Oracle XE PostGreSQL

edbPostgres

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.