Aller au contenu

oracle_fdw

L’extension communautaire oracle_fdw fournit les composants nécessaires pour établir facilement une connexion vers une base Oracle depuis une base PostgreSQL. Elle supporte une variété d’optimisations (pushdown) ainsi que la possibilité de récupérer le plan d’exécution avec l’instruction EXPLAIN.

Attention

À cause des changements d’API dans les versions mineures de PostgreSQL, les versions suivantes ne peuvent pas être utilisées avec cette extension :

  • 9.6.0 to 9.6.8
  • 10.0 to 10.3
  • 11.0 to 11.10
  • 12.0 to 12.5
  • 13.0 to 13.9
  • 14.0 to 14.6
  • 15.0 to 15.1

Source : https://github.com/laurenz/oracle_fdw?tab=readme-ov-file#5-installation-requirements

Prérequis

L’extension nécessite la bibliothèque propriétaire Oracle Instant Client pour garantir les échanges entre PostgreSQL et Oracle à travers le protocole Oracle Net.

Les outils et bibliothèques Oracle Instant Client sont disponibles au format .zip ou .rpm depuis la page de téléchargement https://www.oracle.com/database/technologies/instant-client/downloads.html. Selon le système d’exploitation et sa version de la glibc, il est nécessaire d’étudier la méthode d’installation la plus appropriée entre les deux formats.

Les matrices suivantes reprennent les compatibilité entre les versions du Client Oracle et les versions du Serveur Oracle.

(Doc ID 207303.1) Client / Server Interoperability Support Matrix for Different Oracle Versions

Légende

  • Yes : Supported.
  • ES : Supported but fixes only possible for customers with Extended Support.
  • MDS : Supported, but fixes only possible for customers with a valid Market-Driven Support contract.
  • Was : Was a supported combination but one of the releases is no longer covered by any of Premier Support, Primary Error Correct support, Extended Support, nor Extended Maintenance Support. Fixes are no longer possible.
  • No : Has never been Supported.

Redhat et affiliés

Sélectionner les paquets correspondants à votre système (OL8 pour Redhat ou Rocky 8, OL7 pour Redhat ou CentOS 7) depuis la page de téléchargement et les déposer sur le serveur.

# se connecter en root
dnf install -y oracle-instantclient-basic-21.5.0.0.0-1.x86_64.rpm
dnf install -y oracle-instantclient-devel-21.5.0.0.0-1.x86_64.rpm
dnf install -y oracle-instantclient-sqlplus-21.5.0.0.0-1.x86_64.rpm

Les fichiers seront installés dans le répertoire $ORACLE_HOME = /usr/lib/oracle/21.5/client64.

Debian et affiliés

Séléctionner les archives correspondantes à votre système depuis la page de téléchargement et les déposer sur le serveur. Cette méthode manuelle permet de définir arbitrairement le chemin d’installation.

# se connecter en root
export ORACLE_DIR=/opt/oracle
export ORACLE_HOME=$ORACLE_DIR/instantclient_21_5

# le sdk 21.5 créé le dossier instantclient_21_5/
unzip -d $ORACLE_DIR instantclient-sdk-linux.x64-21.5.0.0.0dbru.zip

# le basiclite doit être positionné dans le dossier lib/
unzip -j -d $ORACLE_HOME/lib instantclient-basiclite-linux.x64-21.5.0.0.0dbru.zip

# les lib sqlplus sont déployées dans lib/, l'utilitaire sqlplus est copié dans bin/
unzip -j -d $ORACLE_HOME/lib instantclient-sqlplus-linux.x64-21.5.0.0.0dbru.zip "*.so"
unzip -j -d $ORACLE_HOME/bin instantclient-sqlplus-linux.x64-21.5.0.0.0dbru.zip "*/sqlplus"

# le script glogin.sql doit être créé dans sqlplus/admin/
mkdir -p $ORACLE_HOME/sqlplus/admin
unzip -j -d $ORACLE_HOME/sqlplus/admin instantclient-sqlplus-linux.x64-21.5.0.0.0dbru.zip "*/glogin.sql"

Installation

Dépôt non-free

Dans le cas de l’utilisation des paquets rpm, il est possible d’accéder au dépôt communautaire non-free pour bénéficier du paquet précompilé de l’extension, valable pour la version PostgreSQL de son choix.

export R=https://download.postgresql.org/pub/repos/yum/reporpms/non-free/EL-8-x86_64
dnf install -y $R/pgdg-redhat-nonfree-repo-latest.noarch.rpm
dnf install -y oracle_fdw_14

Compilation

Sur CentOS et Redhat, adapter la version du paquet postgresql-devel :

yum groupinstall -y "Development Tools"
yum install -y centos-release-scl epel-release
yum install -y postgresql13-devel pgxnclient

Télécharger la dernière version du code source :

cd /tmp
wget https://github.com/laurenz/oracle_fdw/archive/refs/tags/ORACLE_FDW_2_3_0.tar.gz
tar xzf ORACLE_FDW_2_3_0.tar.gz
cd oracle_fdw-ORACLE_FDW_2_3_0/

Compiler l’extension :

export ORACLE_HOME=<chemin/vers/instantclient>
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export PATH=$PATH:$ORACLE_HOME/bin

make PG_CONFIG=/usr/pgsql-13/bin/pg_config
make PG_CONFIG=/usr/pgsql-13/bin/pg_config install

L’instance PostgreSQL doit être capable d’identifier les librairies Oracle pour fonctionner correctement avec oracle_fdw. Les variables d’environnement $ORACLE_HOME et $LB_LIBRARY_PATH doivent être renseignées au niveau du service PostgreSQL.

1ère solution : Ajouter les variables d’environnement au service PostgreSQL.

Éditer le fichier de service :

systemctl edit postgresql-13
[Service]
Environment=ORACLE_HOME=/opt/oracle/instantclient_21_5
Environment=LB_LIBRARY_PATH=/opt/oracle/instantclient_21_5/lib

Redémarrer le service :

systemctl restart postgresql-13

2ème solution : Utiliser des liens symboliques.

Retrouver les liens vers les bibliothèques Oracle :

# ldd /usr/lib/postgresql/14/lib/oracle_fdw.so | grep oracle
        libclntsh.so.19.1 => /opt/oracle/instantclient_19_22/lib/libclntsh.so.19.1 (0x00007fed34000000)
        libnnz19.so => /opt/oracle/instantclient_19_22/lib/libnnz19.so (0x00007fed33600000)
        libclntshcore.so.19.1 => /opt/oracle/instantclient_19_22/lib/libclntshcore.so.19.1 (0x00007fed33000000)

Créer les liens symboliques dans /usr/lib :

ln -s {/opt/oracle/instantclient_19_22,/usr}/lib/libclntsh.so.19.1
ln -s {/opt/oracle/instantclient_19_22,/usr}/lib/libclntshcore.so.19.1
ln -s {/opt/oracle/instantclient_19_22,/usr}/lib/libnnz19.so

Redémarrer le service :

systemctl restart postgresql-13

3ème solution : Utiliser ldconfig.

Créer un fichier de configuration pour ldconfig :

echo "/opt/oracle/instantclient_19_22/lib" > /etc/ld.so.conf.d/oracle-instantclient.conf
ldconfig

Redémarrer le service PostgreSQL :

systemctl restart postgresql-13

Avertissement

Cette méthode peut provoquer des conflits de bibliothèques avec d’autres applications. Il est conseillé de contrôler que le redémarrage complet du serveur s’effectue correctement.

Utilisation

Se connecter sur la base de données :

psql mabase

Créer l’extension :

CREATE EXTENSION oracle_fdw;
-- CREATE EXTENSION

Contrôler le bon fonctionnement de l’extension :

SELECT string_to_table(oracle_diag(), ', ') AS diag;
--                        diag
-- --------------------------------------------------
--  oracle_fdw 2.7.0devel
--  PostgreSQL 14.10 (Ubuntu 14.10-0ubuntu0.22.04.1)
--  Oracle client 19.22.0.0.0