par , 01/03/2017 à 14h45 (2689 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
-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 :
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 :
CREATE EXTENSION oracle_fdw ;
-créer le serveur :
CREATE SERVER oracle_pg FOREIGN DATA WRAPPER oracle_fdw OPTIONS (dbserver 'NOM_SERVEUR_DANS_LE_TNS')
-mapper un user oracle sur le user postgres :
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 » :
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 quil 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