Après les données de fichiers plats, les données d’une base MsSql, on va voir comment récupérer des données de notre base Oracle favorite dans une base de données PostgreSQL.
Pour ce faire, on va une fois de plus passer par un Foreign Data Wrapper.
Ce dernier va nous permettre d’ouvrir une sorte de Db Link vers cette base Oracle à partir de notre base PostgreSQL.
L’installation se fera sur un serveur Linux.
- Pré-requis
Pour permettre l’installation du FDW pour Oracle, il faut disposer de librairies particulières que l’on retrouve dans l’installation de l’InstantClient Oracle. Dans notre cas, on installera la version 12.1.0.2 du produit.
Récupérez les packages Basic et SDK de l’instantCLient voulue chez Oracle, déposez-les sur le serveur puis lancez l’installation.
Pour cela, sous root, lancez la commande suivante :
#yum localinstall oracle-instantclient12.1-basic-12.1.0.2.0-1.x86_64.rpm oracle-instantclient12.1-devel-12.1.0.2.0-1.x86_64.rpm
Positionnez l’environnement PostgreSQL voulu, dans notre cas la version 9.6.
Assurez-vous que le fichier pg_congig est bien dans le path.
#which pg_config /usr/pgsql-9.6/bin/pg_config
Positionnez les variables ORACLE_HOME et LD_LIBRARY_PATH.
#export ORACLE_HOME=/usr/share/oracle/12.1/client64 #export LD_LIBRARY_PATH=/usr/lib/oracle/12.1/client64/lib
Positionnez l’ORACLE_HOME dans le path :
#export PATH=$PATH:/usr/share/oracle/12.1/client64
On contrôle :
#echo $PATH /usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/postgres/.local/bin:/home/postgres/bin:/usr/local/bin:/u01/app/common:/usr/pgsql-9.6/bin:/usr/share/oracle/12.1/client64:.
Assurez-vous que le package postgresqlXX-devel, correspondant à votre version de postgreSQL, soit bien installé.
#rpm –qa | grep postgres postgresql96-libs-9.6.1-1PGDG.rhel7.x86_64 postgresql96-server-9.6.1-1PGDG.rhel7.x86_64 postgresql96-contrib-9.6.1-1PGDG.rhel7.x86_64 postgresql96-devel-9.6.1-1PGDG.rhel7.x86_64 postgresql96-9.6.1-1PGDG.rhel7.x86_64 postgresql96-plperl-9.6.1-1PGDG.rhel7.x86_64
Dans le cas contraire, procédez à l’installation du package.
- Installation du fdw Oracle
Positionnez-vous dans le répertoire où le fichier oracle_fdw-1.5.0.zip a été déposé.
cd /home/postgres/oracle_fdw
Décompressez le fichier et positionnez-vous dans le répertoire ainsi créé.
#unzip oracle_fdw-1.5.0.zip #cd oracle_fdw-1.5.0
On peut maintenant lancer la mise en place du fdw.
#make gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -DLINUX_OOM_ADJ=0 -fpic -I/usr/lib/oracle/12.1/client64/sdk/include -I/usr/lib/oracle/12.1/client64/oci/include -I/usr/lib/oracle/12.1/client64/rdbms/public -I/usr/include/oracle/12.1/client -I/usr/include/oracle/12.1/client64 -I/usr/include/oracle/11.2/client -I/usr/include/oracle/11.2/client64 -I/usr/include/oracle/11.1/client -I/usr/include/oracle/11.1/client64 -I/usr/include/oracle/10.2.0.5/client -I/usr/include/oracle/10.2.0.5/client64 -I/usr/include/oracle/10.2.0.4/client -I/usr/include/oracle/10.2.0.4/client64 -I/usr/include/oracle/10.2.0.3/client -I/usr/include/oracle/10.2.0.3/client64 -I. -I./ -I/usr/pgsql-9.6/include/server -I/usr/pgsql-9.6/include/internal -D_GNU_SOURCE -I/usr/include/libxml2 -I/usr/include -c -o oracle_fdw.o oracle_fdw.c gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -DLINUX_OOM_ADJ=0 -fpic -I/usr/lib/oracle/12.1/client64/sdk/include -I/usr/lib/oracle/12.1/client64/oci/include -I/usr/lib/oracle/12.1/client64/rdbms/public -I/usr/include/oracle/12.1/client -I/usr/include/oracle/12.1/client64 -I/usr/include/oracle/11.2/client -I/usr/include/oracle/11.2/client64 -I/usr/include/oracle/11.1/client -I/usr/include/oracle/11.1/client64 -I/usr/include/oracle/10.2.0.5/client -I/usr/include/oracle/10.2.0.5/client64 -I/usr/include/oracle/10.2.0.4/client -I/usr/include/oracle/10.2.0.4/client64 -I/usr/include/oracle/10.2.0.3/client -I/usr/include/oracle/10.2.0.3/client64 -I. -I./ -I/usr/pgsql-9.6/include/server -I/usr/pgsql-9.6/include/internal -D_GNU_SOURCE -I/usr/include/libxml2 -I/usr/include -c -o oracle_utils.o oracle_utils.c gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -DLINUX_OOM_ADJ=0 -fpic -I/usr/lib/oracle/12.1/client64/sdk/include -I/usr/lib/oracle/12.1/client64/oci/include -I/usr/lib/oracle/12.1/client64/rdbms/public -I/usr/include/oracle/12.1/client -I/usr/include/oracle/12.1/client64 -I/usr/include/oracle/11.2/client -I/usr/include/oracle/11.2/client64 -I/usr/include/oracle/11.1/client -I/usr/include/oracle/11.1/client64 -I/usr/include/oracle/10.2.0.5/client -I/usr/include/oracle/10.2.0.5/client64 -I/usr/include/oracle/10.2.0.4/client -I/usr/include/oracle/10.2.0.4/client64 -I/usr/include/oracle/10.2.0.3/client -I/usr/include/oracle/10.2.0.3/client64 -I. -I./ -I/usr/pgsql-9.6/include/server -I/usr/pgsql-9.6/include/internal -D_GNU_SOURCE -I/usr/include/libxml2 -I/usr/include -c -o oracle_gis.o oracle_gis.c gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -DLINUX_OOM_ADJ=0 -fpic -shared -o oracle_fdw.so oracle_fdw.o oracle_utils.o oracle_gis.o -L/usr/pgsql-9.6/lib -Wl,--as-needed -L/usr/lib64 -Wl,--as-needed -Wl,-rpath,'/usr/pgsql-9.6/lib',--enable-new-dtags -L/usr/lib/oracle/12.1/client64 -L/usr/lib/oracle/12.1/client64/bin -L/usr/lib/oracle/12.1/client64/lib -lclntsh -L/usr/lib/oracle/12.1/client/lib -L/usr/lib/oracle/12.1/client64/lib -L/usr/lib/oracle/11.2/client/lib -L/usr/lib/oracle/11.2/client64/lib -L/usr/lib/oracle/11.1/client/lib -L/usr/lib/oracle/11.1/client64/lib -L/usr/lib/oracle/10.2.0.5/client/lib -L/usr/lib/oracle/10.2.0.5/client64/lib -L/usr/lib/oracle/10.2.0.4/client/lib -L/usr/lib/oracle/10.2.0.4/client64/lib -L/usr/lib/oracle/10.2.0.3/client/lib -L/usr/lib/oracle/10.2.0.3/client64/lib
Puis
# make install /usr/bin/mkdir -p '/usr/pgsql-9.6/lib' /usr/bin/mkdir -p '/usr/pgsql-9.6/share/extension' /usr/bin/mkdir -p '/usr/pgsql-9.6/share/extension' /usr/bin/mkdir -p '/usr/pgsql-9.6/doc/extension' /usr/bin/install -c -m 755 oracle_fdw.so '/usr/pgsql-9.6/lib/oracle_fdw.so' /usr/bin/install -c -m 644 .//oracle_fdw.control '/usr/pgsql-9.6/share/extension/' /usr/bin/install -c -m 644 .//oracle_fdw--1.1.sql .//oracle_fdw--1.0--1.1.sql '/usr/pgsql-9.6/share/extension/' /usr/bin/install -c -m 644 .//README.oracle_fdw '/usr/pgsql-9.6/doc/extension/'
L’installation est terminée, on peut passer maintenant à la configuration du Foreign Data Wrapper dans notre base PostgreSQL.
- Mise en place du FWD dans le cluster postgreSQL
Sous le user postgres
Positionnez les variables ORACLE_HOME et LD_LIBRARY_PATH avec les destinations correspondant à l’instantClient précédemment insrallé.
export ORACLE_HOME=/usr/share/oracle/12.1/client64 export LD_LIBRARY_PATH=/usr/lib/oracle/12.1/client64/lib
Dans l’idéal, insérez-les dans le fichier .bash_profile.
Arrêtez puis redémarrez votre cluster postgreSQL pour prendre en compte les nouvelles librairies.
On peut maintenant créer l’extension dans la base.
psql -d mabdd mabdd=#CREATE EXTENSION oracle_fdw; CREATE EXTENSION
On passe maintenant à la création du serveur de données. Dans notre exemple, on cherche à se connecter au référentiel RMAN.
CREATE SERVER refrman FOREIGN DATA WRAPPER oracle_fdw OPTIONS (dbserver '//moserveur.domaine.name/MABDD'); GRANT USAGE ON FOREIGN SERVER reftest TO monpguser;
Dans le cas où le port d’écoute du listener n’est pas le 1521, la chaîne de connexion est la suivante :
CREATE SERVER refrman FOREIGN DATA WRAPPER oracle_fdw OPTIONS (dbserver '//moserveur.domaine.name:1524/MABDD'); GRANT USAGE ON FOREIGN SERVER reftest TO monpguser;
On crée un mapping entre le user postgreSQL monpguser et le user Oracle rman et son mot de passe.
create user mapping for monpguser server refrman options (user 'rman', password 'rman'); CREATE USER MAPPING
On peut maintenant créer une table externe sous notre user monpguser pour accéder aux données de notre table sous Oracle .
psql -d mabdd -U monpguser monpgusqer=# CREATE FOREIGN TABLE f_oracle_test ( monpgusqer(# db_key numeric , monpgusqer(# dbinc_key numeric , monpgusqer(# dbid numeric , monpgusqer(# name varchar(8), monpgusqer(# resetlogs_change numeric, monpgusqer(# resetlogs_time timestamp monpgusqer(# ) SERVER refrman OPTIONS (schema 'RMAN', table 'RC_DATABASE'); CREATE FOREIGN TABLE monpgusqer=# monpgusqer=# monpgusqer=# monpgusqer=# select * from f_oracle_test; db_key | dbinc_key | dbid | name | resetlogs_change | resetlogs_time -------------+-------------+------------+----------+------------------+--------------------- 27979 | 27980 | 2645261322 | KELIOPDH | 1 | 2012-10-10 11:14:18 60895 | 60896 | 2039080018 | NUMPRDH | 1 | 2012-11-02 10:47:46 86792 | 86793 | 1762529405 | VLL1PRD | 281428528 | 2012-09-27 11:27:34
Voilà, on accède maintenat à notre référentiel RMAN à partir de notre base PostgreSQL.
A vous de jouer !