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

triaguae

Wrappeur de données ORACLE-POSGRESQL

Noter ce billet
par , 01/03/2017 à 14h45 (2511 Affichages)
J'utilise PostgreSQL depuis quelques années, et j'ai besoin de récupérer des données sur une base Oracle.
Jusqu'à présent je passais par des exports de données puis des réintégrations dans PostgreSQL.
Et puis au hasard d'un page web, j'ai découvert la notion de Foreign Data Wrapper, pour "mapper" des tables Oracle sur PostgreSQL. L'interrogation de ces foreign tables devient alors possible directement depuis PostgreSQL (avec son langage donc).
J'avoue que j'ai un peu galéré, parce qu'avec Oracle, rien n’est simple, sinon c'est pas drôle!
J'ai donc choisi de partager mon expérience car les ressources sont peu nombreuses.

Système :
-Installation sur une machine virtuelle avec un Windows 7 Pro 64 bits.
-Installer Microsoft Visual C ++ 2015 Redistribuable : https://www.microsoft.com/fr-fr/down....aspx?id=48145
-Installer Java Runtime Environment (version 7 ou 8) : http://www.oracle.com/technetwork/ja...s-2133155.html

-installation de PostgreSQL 64 bits en version 9.6
-télécharger l'exécutable sur https://www.enterprisedb.com/advanced-downloads
-Installer postgresql dans un dossier à la racine de C:\ (C:\PostgreSQL par exemple), on évite ainsi les espaces dans les noms de dossier de type Program Files qui peuvent parfois poser problème.
-Pour administrer pg, j'ai choisi pgadmin3 v 1.22.2 (compatible avec pg 9.6 https://www.pgadmin.org/download/windows.php), je trouve pgadmin4 encore buggé (à suivre néanmoins la dernière version à l’air d’être mieux, il évolue régulièrement mais est déroutant par rapport à la version 3)


-installation de oracle instant_client correspondant parfaitement à la version d'Oracle
Repérer la version exacte du système oracle en place, dans mon cas je suis en 11.2.0.1.0
On va récupérer 3 zip sur le site d'oracle http://www.oracle.com/technetwork/to...ft-089540.html
-Instant Client Package - Basic
-Instant Client Package - SQL*Plus
-Instant Client Package - ODBC

Nom : oracle.png
Affichages : 817
Taille : 60,8 Ko


-Dézipper les 3 téléchargements dans le même dossier à la racine de C:\ (dans C:\oracle\instanclient_11_2 par exemple)
-Il y a des fichiers communs dans certains zip, acceptez donc de les remplacer.
-Executer odbc.exe, c'est très rapide.
-Il faut donner le chemin d’accès du serveur au client, il faut créer un fichier tnsnames.ora :
Le mien se présente comme ça :
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
NOM_SERVEUR=
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST =IP_du_serveur)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = NOM_SERVEUR)
    )
  )


-il faut paramétrer les variables d'environnement :
-créer TNS_ADMIN avec comme valeur le chemin des fichiers que l’on vient de dézipper soit C:\oracle\instanclient_11_2
-créer ORACLE_HOME avec comme valeur le chemin des fichiers que l’on vient de dézipper soit C:\oracle\instanclient_11_2
-Editer le PATH et rajouter C:\oracle\instanclient_11_2

-Redémarrer le système

-Tester la connexion avec sqlplus, si vous arriver à vous connecter à ORACLE, c’est gagné, sinon les forums seront les bienvenus !

-installation des fichiers wrappeur de donnée oracle fdw
-télécharger le zip correspondant à la version et au système : https://github.com/laurenz/oracle_fd...ACLE_FDW_1_5_0
-extraire les fichiers
-copier le oracle_fdw.dll (se trouvant dans lib) dans le dossier C:\ PostgreSQL\lib
-copier les fichiers oracle_fdw.control,oracle_fdw—1.0—1.1.sql,oracle_fdw—1.1.sql (se trouvant dans share/extension/ du sip) dans C:\ PostgreSQL\share\extension
-copier le fichier oracle_fdw.pdb (se trouvant dans symbol du zip) dans C:\ PostgreSQL\symbols


-installation du wrappeur de donnée dans postgresql en utilisant pgadmin

-créer extension :
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
 CREATE EXTENSION oracle_fdw ;

-créer le serveur :
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
CREATE SERVER oracle_pg  FOREIGN DATA WRAPPER oracle_fdw OPTIONS (dbserver 'NOM_SERVEUR_DANS_LE_TNS')

-mapper un user oracle sur le user postgres :
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
GRANT USAGE ON FOREIGN SERVER oracle_pg TO user_postgres ;
CREATE USER MAPPING FOR user_postgres SERVER oracle_pg OPTIONS (USER 'nom_user_oracle', PASSWORD 'pw_user_oracle');


-créer la table «étrangère » :
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
CREATE FOREIGN TABLE toto
   (définir ici les champs et les typés de manière à ce que ce soit compatible avec ce qu’il y a dans oracle) SERVER oracle_pg OPTIONS (table 'nom_de_la_table_oracle');


Et si tout s’est bien passé et en fonction des droits du user oracle, vous pouvez manipuler les données ORACLE depuis PG.

Conclusion
Je trouve ce système intéressant à plusieurs titres :
-migration progressive (oracle vers postgres) en maintenant un système en place tout en développant et testant un nouveau,
-interconnexions de systèmes (il existe de nombreux wrappeurs pour mysql, sqlserver, fichier csv........)

Bon courage à ceux qui veulent se lancer dans l'aventure........

quelques liens qui m’ont servi à installer ce wrappeur de données.
http://www.openscg.com/2016/04/how-t...-data-wrapper/
https://github.com/laurenz/oracle_fdw/issues
Un post que j'avais ouvert sur http://www.postgresql.fr/ http://forums.postgresql.fr/viewtopic.php?id=4122e

Envoyer le billet « Wrappeur de données ORACLE-POSGRESQL » dans le blog Viadeo Envoyer le billet « Wrappeur de données ORACLE-POSGRESQL » dans le blog Twitter Envoyer le billet « Wrappeur de données ORACLE-POSGRESQL » dans le blog Google Envoyer le billet « Wrappeur de données ORACLE-POSGRESQL » dans le blog Facebook Envoyer le billet « Wrappeur de données ORACLE-POSGRESQL » dans le blog Digg Envoyer le billet « Wrappeur de données ORACLE-POSGRESQL » dans le blog Delicious Envoyer le billet « Wrappeur de données ORACLE-POSGRESQL » dans le blog MySpace Envoyer le billet « Wrappeur de données ORACLE-POSGRESQL » dans le blog Yahoo

Mis à jour 29/07/2018 à 17h59 par LittleWhite (Coloration du code)

Catégories
Sans catégorie

Commentaires

  1. Avatar de amesnard
    • |
    • permalink
    Bonjour,

    Tout d'abord merci beaucoup pour ce billet très détaillé.
    Je suis parvenue à le mettre en œuvre sans gros problème hormis dans le cas où la base Oracle et la base postgresql se trouvent sur le même serveur.
    Avec cette configuration, il semble y avoir un conflit dans les variables d'environnement. Selon la présence ou non de la variable oracle_home, j'ai soit l'erreur ORA-01804 (OCIEnvCreate failed to create environment handle) soit l'erreur ORA-12154 (tns could not resolve service name) qui est retournée dans pgadmin au moment de l'ouverture de la table distante. Savez-vous si il est possible de mettre un FDW entre deux bases hébergées sur le même serveur ? Et avez-vous déjà été confronté à ces erreurs ?

    Si dessous la configuration système de l'environnement dans lequel je travaille :
    Windows Serveur 2008 R2 – service pack 1
    Oracle 11.2.0 / Client oracle 11.02.00.01
    Postgres 9.3.1 / Pgadmin : 1.18.1

    Merci.
    Amélie
  2. Avatar de triaguae
    • |
    • permalink
    Bonjour,

    L'installation que j'ai est sur 2 serveurs différents dont un où je n'ai pas la main (Oracle installé sur un Linux), je ne saurais donc vous aidé :-(
    Mis à jour 09/09/2018 à 14h51 par LittleWhite (Pas besoin de citer l'intégralité du message précédent)
  3. Avatar de ebmocalnnay
    • |
    • permalink
    Ce tuto m'a été bien utile pour réaliser la connexion entre les bases de données, il y a quelques points d'attention qui peuvent varier selon les configurations (client oracle et wrapper en 32b ou 64b selon les postes) mais cela fonctionne bien.
    Reste un point sur lequel je bute dans cette configuration, c'est les insertions sur le serveur lié postgresql.
    une requête d'insertion sur le serveur lié cible me fait crasher (littéralement) SQL SERVER. Au bout de 30s à pau près, la requête se ferme avec comme message d'erreur

    Description: Échec de la liaison de communication
    SQL State: 08S01
    SQL Error Number: 109

    Sous-erreur n°1
    Description: Fournisseur de mémoire partagée : Le canal de communication a été fermé.

    puis le service sql server s'arrête et plus rien.

    Je penchais pour une limitation de la liaison ODBC mais je n'ai trouvé aucun paramètre pour l'instant qui joue sur ce facteur. Idem sur le sql server.

    Rencontreriez-vous aussi ce problème dans votre configuration?
    Merci pour votre billet dans tous les cas.