Vous n'êtes pas identifié(e).
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 ).
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
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
Julien.
https://rjuju.github.io/
Hors ligne
c'est bien celui ci que j'avais vu, par contre s'il faut compiler l'extension................sais pas faire
Hors ligne
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
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.
Julien.
https://rjuju.github.io/
Hors ligne
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
un bon exemple bien fait :
http://www.openscg.com/2016/04/how-to-i … a-wrapper/
Cordialement,
Sébastien.
Hors ligne
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
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
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
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
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
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
Hors ligne
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
Julien.
https://rjuju.github.io/
Hors ligne
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
Que la table "LABO"."LA_TABLE" n'existe pas ou n'est pas accessible en lecture pour l'utilisateur configuré ?
Julien.
https://rjuju.github.io/
Hors ligne
Je suis carrément novice en gestion des accès 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
Il faut configurer ça avec le CREATE USER MAPPING, voir https://github.com/laurenz/oracle_fdw#1-cookbook
Julien.
https://rjuju.github.io/
Hors ligne
ç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
Comme promis, j'ai fait un petit tuto sur le blog de developpez.com https://www.developpez.net/forums/blogs … posgresql/
Hors ligne
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
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
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
@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
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