PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 17/02/2017 14:36:28

damalaan
Membre

[RESOLU] Mise en place de Foreign Data Wrappers Oracle

Bonjour,

Je cherche des témoignages et éventuellement de l'aide sur la mise en place de foreign data wrappers d'une base oracle vers un postgres 9.6 (Postgres étant en environnement Windows et Oracle en Linux)
L'installation ne m'a pas l'air très simple (comme d'habitude avec oracle sad ).
Mais qu'en est il des performances ?
Y a t il des limitations ?
Peut on agir en dehors des select sur la table distante oracle avec postgres (update, insert, delete)?

J'ai installé un fdw avec un fichier csv de qq milliers de lignes lié à pg 9.6, les select fonctionnent bien, je trouve ça intéressant.
Ca me rappelle finalement ce qu'on peut faire avec des clients de type access ou libreoffice base avec des odbc.

Merci pour les infos.

Dernière modification par damalaan (02/03/2017 09:18:21)

Hors ligne

#2 17/02/2017 15:06:13

rjuju
Administrateur

Re : [RESOLU] Mise en place de Foreign Data Wrappers Oracle

Côté postgres, vous pouvez utiliser https://github.com/laurenz/oracle_fdw qui est un très bon foreign data wrapper pour Oracle, et gère l'écriture sur les tables Oracle.

Le plus compliqué étant à mon avis de compiler l'extension sous windows, bon courage smile

Hors ligne

#3 17/02/2017 15:12:23

damalaan
Membre

Re : [RESOLU] Mise en place de Foreign Data Wrappers Oracle

c'est bien celui ci que j'avais vu, par contre s'il faut compiler l'extension................sais pas faire sad

Hors ligne

#4 17/02/2017 15:32:56

ruizsebastien
Membre

Re : [RESOLU] Mise en place de Foreign Data Wrappers Oracle

Bonjour,

les fichiers pré-compilés pour Windows sont présents ici :
https://github.com/laurenz/oracle_fdw/r … _FDW_1_5_0

il suffit juste de placer les fichiers dans les bons répertoires (lib, extension, etc...)

Enfin je crois....jamais fais sur windows...


Cordialement,

Sébastien.

Hors ligne

#5 17/02/2017 15:51:03

rjuju
Administrateur

Re : [RESOLU] Mise en place de Foreign Data Wrappers Oracle

Ah ça c'est classe ! Donc oui il suffit d'extraire les fichiers dans le répertoire des binaires de postgres et de faire un "CREATE EXTENSION oracle_fdw;".  Si cela fonctionne c'est que les fichiers ont bien été copiés dans le bon répertoire.

Hors ligne

#6 17/02/2017 16:21:58

damalaan
Membre

Re : [RESOLU] Mise en place de Foreign Data Wrappers Oracle

Apparemment ça fonctionne, j'ai réussi à faire un create extension oracle_fdw en copiant les fichiers dans les bons dossier de Postgres.
je crains maintenant le paramétrage pour accéder à la base oracle .... je vous dis ça ....

Hors ligne

#7 17/02/2017 16:29:10

ruizsebastien
Membre

Re : [RESOLU] Mise en place de Foreign Data Wrappers Oracle


Cordialement,

Sébastien.

Hors ligne

#8 17/02/2017 16:30:17

shishi
Membre

Re : [RESOLU] Mise en place de Foreign Data Wrappers Oracle

Bonjour,
pour ma part j'ai utilisé les fdw uniquement entre 2 bases postgres sur des serveurs differents donc je ne sais pas si cela peut t'aiguiller mais j'ai commencé par créer l'extension ensuite il faut créer un foreign server avec une commande de ce style :

create server nom_foreign server
foreign data wrapper postgres_fdw 
options (dbname 'nom_bdd', port '5432', host 'IP server distant ');

ensuite il faut créer un user mapping avec ce genre de commande :

create user mapping for nom_user
server nom_foreign_server
options (user 'nom_user_distant', password 'password');

et pour finir il faut créer un foreign table avec ce code

create foreign table nom_foreign_table (
idgenre integer not null,
nom character varying(50) not null,
)server nom_foreign_server options (schema_name 'public', table_name 'genre');

En espérant que cela t'aide un petit peu

Cordialement
Shishi

Hors ligne

#9 17/02/2017 17:38:44

damalaan
Membre

Re : [RESOLU] Mise en place de Foreign Data Wrappers Oracle

j'ai fait tout ça

	CREATE EXTENSION oracle_fdw;

   
=>ok

	CREATE SERVER oracle_labo  FOREIGN DATA WRAPPER oracle_fdw OPTIONS (dbserver 'LABO')

=>ok

	GRANT USAGE ON FOREIGN SERVER oracle_labo TO postgres;

=> ok

	create user mapping for postgres
	server oracle_labo
	options (user '**', password '**');

=>ok

j'ai créé une table dans postgres
=> ok

ensuite j'ai fait une requête
sur ma table fraichement créée

ERREUR:  error connecting to Oracle: OCIEnvCreate failed to create environment handle
DETAIL:  

********** Erreur **********

ERREUR: error connecting to Oracle: OCIEnvCreate failed to create environment handle
État SQL :HV00N

Hors ligne

#10 17/02/2017 18:03:49

ruizsebastien
Membre

Re : [RESOLU] Mise en place de Foreign Data Wrappers Oracle

est-ce que vous avez installé un client oracle ?
est-il correctement configuré ?
pouvez-vous vous connecter à la base cible oracle avec sqlplus depuis le serveur où est installé postgresql ?

Dernière modification par ruizsebastien (17/02/2017 18:04:17)


Cordialement,

Sébastien.

Hors ligne

#11 17/02/2017 20:09:22

damalaan
Membre

Re : [RESOLU] Mise en place de Foreign Data Wrappers Oracle

Oui il y a un client oracle, ( instant client), sqlplus fonctionne, j ai un accès à oracle sans problème.
J ai vu dans le lien http://www.openscg.com/2016/04/how-to-i … a-wrapper/, qu il y a la notion de schéma. Est ce que ca pourrait être ca?

Hors ligne

#12 20/02/2017 10:01:03

shishi
Membre

Re : [RESOLU] Mise en place de Foreign Data Wrappers Oracle

Bonjour,
Pour ma part en créant la foreign table je spécifie dans quel schéma la table distante se situe, de plus assure toi que l'utilisateur local avec lequel tu exécuté la requête sur La foreigner table à les droits sur le schéma et La foreign table. Et de plus il faut que l'utilisateur distant ai les droits sur La table et le schéma distant.

Cordialement
Shishi

Hors ligne

#13 21/02/2017 09:34:46

damalaan
Membre

Re : [RESOLU] Mise en place de Foreign Data Wrappers Oracle

Je savais bien qu'avec Oracle ça serait pas simple:(

J'ai essayé les manips suivantes :
-installer Microsoft Visual C++ 2015 Redistributal” and Java Runtime Environment (version 7 or 8) (comme demandé dans le lien )
-l'instant client est déjà en place puisque j'utilise aussi une connexion odbc pour autre chose
-j'ai tout supprimé et tout recréé dans postgres  comment je l'ai décrit dans un post ci dessus.
-à la création de la table étrangère j'ai spécifié le schéma où elle se trouve dans oracle

.....
SERVER oracle_labo
   OPTIONS (schema 'LABO', table 'toto');

Jusque là ça se passe bien

J'ai vérifier les variable d'environnement :
ORACLE_PATH : C:\oracle\instantclient_11_2
TNS_ADMIN : %ORACLE_PATH%
Path : beaucoup de chose dont C:\oracle\instantclient_11_2

et j'ai toujours la même erreur sad

Hors ligne

#14 21/02/2017 10:23:00

rjuju
Administrateur

Re : [RESOLU] Mise en place de Foreign Data Wrappers Oracle

Le plus simple serait certainement de demander à l'auteur.  Dans tous les cas, le problème vient de la fonction OCIEnvCreate(), mais je ne connais personnellement absolument pas l'écosystème oracle.

En cherchant avec votre code d'erreur (HV00N), je suis tombé sur the thread : https://www.postgresql.org/message-id/f … wien.gv.at

Si cela ne vous aide pas, demandez ici : https://github.com/laurenz/oracle_fdw/issues

Hors ligne

#15 21/02/2017 15:52:20

damalaan
Membre

Re : [RESOLU] Mise en place de Foreign Data Wrappers Oracle

J'ai refait toute mon install sur une machine virtuelle, propre et neuve !
J'ajoue que je ne sais pas ce qui a changé (à part la version de pg 9.6 au lieu de 9.5 ainsi que la version du oracle_fdw), mais à force de tripatouiller j'ai du m........

Cette fois je pense qu'il s'agit d'un problème de droit car voici l'erreur quand je fais un select sur la foreign table

ERREUR:  Oracle table "LABO"."LA_TABLE" for foreign table "ora_latable" does not exist or does not allow read access
DETAIL:  ORA-00942: Table ou vue inexistante
HINT:  Oracle table names are case sensitive (normally all uppercase).

Je suis connecté avec l'utilisateur postgres.

Qu'en penser ?

Hors ligne

#16 21/02/2017 15:54:28

rjuju
Administrateur

Re : [RESOLU] Mise en place de Foreign Data Wrappers Oracle

Que la table "LABO"."LA_TABLE" n'existe pas ou n'est pas accessible en lecture pour l'utilisateur configuré ?

Hors ligne

#17 21/02/2017 16:07:22

damalaan
Membre

Re : [RESOLU] Mise en place de Foreign Data Wrappers Oracle

Je suis carrément novice en gestion des accès sad mais je sens que qu'il va falloir que j'apprenne.

Sous oracle, un user "labo" peut se connecter à cette table.
Comment dois-je procéder pour qu'un utilisateur connecté à pg puisse avoir accès à cette foreign table ?

Hors ligne

#18 21/02/2017 16:10:30

rjuju
Administrateur

Re : [RESOLU] Mise en place de Foreign Data Wrappers Oracle

Il faut configurer ça avec le CREATE USER MAPPING, voir https://github.com/laurenz/oracle_fdw#1-cookbook

Hors ligne

#19 22/02/2017 11:27:58

damalaan
Membre

Re : [RESOLU] Mise en place de Foreign Data Wrappers Oracle

ça y est, je peux faire un select !!

CREATE EXTENSION oracle_fdw;
CREATE SERVER oracle_labo  FOREIGN DATA WRAPPER oracle_fdw OPTIONS (dbserver 'LABO');
GRANT USAGE ON FOREIGN SERVER oracle_labo TO postgres;

CREATE USER MAPPING FOR postgres SERVER oracle_labo
          OPTIONS (user 'labo', password '****');

CREATE FOREIGN TABLE ora_table
   (........
)
   SERVER oracle_labo
   OPTIONS (table 'latable_oracle');

En fait j'ai enlevé le schema dans les options à la création de la table (la doc disant que c'est optionnel)

A voir maintenant à l'usage dans le temps.....
Quand j'aurai un petit moment je remettrai un message avec l'installation de a à z, ça peut servir....
Encore merci pour votre à tous !

Hors ligne

#20 02/03/2017 09:17:46

damalaan
Membre

Re : [RESOLU] Mise en place de Foreign Data Wrappers Oracle

Comme promis, j'ai fait un petit tuto sur le blog de developpez.com https://www.developpez.net/forums/blogs … posgresql/

Hors ligne

#21 01/03/2018 15:27:25

Re : [RESOLU] Mise en place de Foreign Data Wrappers Oracle

bonjour, merci pour ce post.
J'ai testé cela sur PostgreSQL 10.2 et Oracle 12.2:
Au lieu de la commande CREATE FOREIGN TABLE ora_table à effectuer pour chaque table, j'ai testé la commande qui permet de créer toutes les definitions de tables foreign du schéma distant d'un seul coup:

--                                       <schema oracle>                                  <schema local>
IMPORT FOREIGN SCHEMA "labo" from SERVER oracle_labo INTO schema_labo_local;

Si on a plusieurs schémas distants, on peut créer des schémas postgres distincts, et faire cette commande pour chaque schéma.

Ensuite, on passe de l'un à l'autre avec une commande
set search_path='schema_labo_local';

Pour 1200 définitions de table, la commande s'exécute en 5 à 10 secondes.

Dernière modification par fbamiere@yahoo.com (01/03/2018 15:30:39)

Hors ligne

#22 02/03/2018 12:09:37

damalaan
Membre

Re : [RESOLU] Mise en place de Foreign Data Wrappers Oracle

Bonjour

Effectivement, je viens de me le faire, c'est top !!
je n'avais pas envisager ça au moment où j'avais commencé ce post (1 an déjà ....), je n'avais besoin que de quelques tables oracle.
ce qui me manque toujours c'est les clefs et les index, sur des select simple (1 table ça va à peu près), mais dès qu'on passe pas des jointures, les durées d'exécution sont catastrophiques.

Comme vous êtes sur une version plus récente, y a t il eu des améliorations sur ce point ?

Hors ligne

#23 02/03/2018 13:34:20

gleu
Administrateur

Re : [RESOLU] Mise en place de Foreign Data Wrappers Oracle

Si vous faites des jointures entre deux tables distantes (du même serveur distant), la jointure peut être envoyé au serveur distant, ce qui améliorera les performances. Ça concerne les versions 9.6 et ultérieures.


Guillaume.

Hors ligne

#24 02/03/2018 13:51:50

Re : [RESOLU] Mise en place de Foreign Data Wrappers Oracle

@gleu

Pourriez-vous préciser votre propos ?

Soit une base de données D avec deux tables foreign x et y qui proviennent de la base de données E.

Vous dites que "la jointure peut être envoyée au serveur distant".

Comment ? Par quel mécanisme ?

Hors ligne

#25 02/03/2018 14:50:40

damalaan
Membre

Re : [RESOLU] Mise en place de Foreign Data Wrappers Oracle

Il semblerait que ce soit natif :  https://raw.githubusercontent.com/laure … oracle_fdw

Joins between foreign tables
----------------------------

From PostgreSQL 9.6 on, oracle_fdw can push down joins to the Oracle server,
that is, a join between two foreign tables will lead to a single Oracle query
that performs the join on the Oracle side.

There are some restrictions when this can happen:

- Both tables must be defined on the same foreign server.
- The join must be an inner join.
- Joins between three or more tables won't be pushed down.
- The join must be in a SELECT statement.
- oracle_fdw must be able to push down all join conditions and WHERE clauses.
- Cross joins without join conditions are not pushed down.
- If a join is pushed down, ORDER BY clauses will not be pushed down.

It is important that table statistics for both foreign tables have been
collected with ANALYZE for PostgreSQL to determine the best join strategy.

Hors ligne

Pied de page des forums