Le propos des trois posts PostgreSQL qui vont suivre, est de présenter:
- la mise en place d’un outil d’aide à la migration d’une base Oracle, au sens du schéma, vers une base PostgreSQL
- L’utilisation de cet outil, nommé ora2pg
- Les difficultés qu’un projet de migration doit affronter
Le premier post porte sur l’installation d’ora2pg, un des outils disponibles sur internet.
Je vais décrire ici l’installation d’une machine sous linux “OEL 6.3” que l’on pourrait pompeusement nommer une appliance de migration ora2pg. Le choix de la distribution ayant été fait pour minimiser les difficultés, Oracle n’étant pas à priori disponible pour les distributions Debian et dérivées.
L’idée est d’y installer l’ensemble des outils nécessaires:
- les drivers perl DBI, DBD::ORACLE , DBD::Pg
- Les librairies Oracle nécessaires à l’utilisation de ces drivers.
- ora2pg
Mais tout d’abord: qu’est ce qu’ora2pg ?
ora2pg un utilitaire écrit en perl par Gilles Darold avec le soutien et les contributions de nombreuses personnes de la communauté PostgreSQL.
La version courante est 11.4, les premiers développments remontant à l’année 2000.
Les prérequis de la version 11.4 sont :
- Une version de perl > 5.6
- Les drivers perl DBI & DBD:ORACLE
- La présence sur votre système des librairies Oracle.
- Optionnellement le driver perl DBD:Pg
- Les binaires de ora2pg
Installation
Drivers DBI & DBD::Pg
Nous commençons par le plus simple, l’installation des drivers DBI et DBD::Pg, parce qu’ils sont disponibles dans les repository des distributions:
yum install perl-DBIyum install perl-DBD-Pg Loaded plugins: refresh-packagekit, security ol6_UEK_base | 1.2 kB 00:00 ol6_UEK_latest | 1.2 kB 00:00 ol6_u3_base | 1.4 kB 00:00 Setting up Install Process Resolving Dependencies --> Running transaction check ---> Package perl-DBD-Pg.x86_64 0:2.15.1-3.el6 will be installed --> Finished Dependency Resolution Dependencies Resolved ======================================================================================================================== Package Arch Version Repository Size ======================================================================================================================== Installing: perl-DBD-Pg x86_64 2.15.1-3.el6 ol6_u3_base 196 k Transaction Summary ======================================================================================================================== Install 1 Package(s)Total download size: 196 k Installed size: 544 k Is this ok [y/N]: y Downloading Packages: perl-DBD-Pg-2.15.1-3.el6.x86_64.rpm | 196 kB 00:00 Running rpm_check_debug Running Transaction Test Transaction Test Succeeded Running Transaction Warning: RPMDB altered outside of yum. Installing : perl-DBD-Pg-2.15.1-3.el6.x86_64 1/1 Verifying : perl-DBD-Pg-2.15.1-3.el6.x86_64 1/1 Installed: perl-DBD-Pg.x86_64 0:2.15.1-3.el6 Complete!
Validation de l’installation
Dans notre cas, les commandes suivantes vont nous permettre d’avoir rapidement la possibilité de nous connecter à une base postgresql.
Nous pouvons tester avec le code ci-dessous la connexion à la base Postgresql:
#!/usr/bin/perl use DBI; my $dbh = DBI->connect('dbi:Pg:dbname=test;host=vmpgdeb2;port=54321','tstiste','manager') or die "Erreur de connection : $DBI::errstrn"; print "2+2=",$dbh->selectrow_array("SELECT 2+2"),"n"; $rv = $dbh->pg_ping; print "ping 1 : ", $rv,"n"; $rv = $dbh->disconnect; print "deconnection ", $rv,"n"; $rv = $dbh->pg_ping; print "ping 2 : ", $rv,"n"; exit;
Installation instance client Oracle
Une fois la validation de la connexion faite nous pouvons passer à l’installation du driver DBD::Oracle et des librairies Oracle nécessaires.
Pour cela, nous avons besoin de télécharger du site d’Oracle OTN les trois paquets suivants…
- oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm
- oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.rpm
- oracle-instantclient11.2-sqlplus-11.2.0.4.0-1.x86_64.rpm
…et le fichier source du drivers à partir du site CPAN: DBD-Oracle-1.66.tar.gz.
A partir du point de téléchargement, en tant qu’utilisateur root, passer les commandes suivantes:
rpm -iv oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm rpm -iv oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.rpm rpm -iv oracle-instantclient11.2-sqlplus-11.2.0.4.0-1.x86_64.rpm
Ces trois paquets créent une arborescence oracle dans /usr/lib : oracle/11.2/client64/lib & oracle/11.2/client64/bin
Afin de tester la bonne installation des paquets, il est possible de tenter une connexion à votre base de données Oracle avec l’utilitaire sqlplus se trouvant dans le répertoire /usr/lib/oracle/11.2/client64/bin.
Toutefois, il est nécessaire de positionner l’environnement sur les librairies dynamiques de ce client. Cela se fait en positionnant la variable LD_LIBRARY_PATH à la valeur: /usr/lib/oracle/11.2/client64/bin
Validation
Dans notre cas, la vérification se fait ainsi:
export ORACLE_HOME=/usr/lib/oracle/11.2/client64 export LD_LIBRARY_PATH=$ORACLE_HOME/lib export PATH=$ORACLE_HOME/bin:$PATHsqlplus system/manager@vmtestora11g:1521/MSC_SITE1.localhostSQL*Plus" SQL*Plus : Release 11.2.0.4.0 Production on Wed Oct 2 17:22:15 2013 Copyright (c) 1982, 2013, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> select instance_name from v$instance;INSTANCE_NAME ---------------- MSC SQL> quit
Installation de DBD::Oracle
Après avoir décompressé le fichier téléchargé depuis le CPAN et avoir positionné votre environnement, le fichier INSTALL vous donne les informations relatives à l’installation.
Le point important étant de positionner votre environnement comme ci-dessus. Une fois cela fait, il est possible de commencer l’installation par la commande suivante:
perl Makefile.PL
Celle-ci va construire le makefile pour votre environnement après avoir vérifié les pré-requis.
La commande suivante, c’est le lancement de la compilation et de l’édition de lien nécessaires à l’intégration des librairies Oracle au driver perl DBD::Oracle.
make
En fin de construction, vous pouvez lancer l’installation par la commande:
make install
Ensuite, il est possible comme pour le driver DBD:Pg de tester la connexion à la base Oracle cible.
Validation
#!/usr/bin/perl -w # # test Connects to an Oracle database. # use DBI; # Load the DBI module # # ### Perform the connection using the Oracle driver my $dbh = DBI->connect( "dbi:Oracle:host=vmtestora11g;sid=MSC", "SIBMIG", "migora" ) or die "Can't connect to Oracle database: $DBI::errstrn"; print "2+2=", $dbh->selectrow_array("SELECT 2+2 from dual"),"n"; $rv = $dbh->disconnect; print "deconnection ", $rv,"n"; exit;
Aprés avoir validé cette connexion à la base, au travers du driver DBD::Oracle, il est possible de passer à l’installation de ora2pg.
Installation de Ora2pg
C’est la partie la plus simple 😉 de la mise en oeuvre de l’installation et de l’utilisation de ora2pg.
Il s’agit juste de décompresser dans un répertoire le fichier tar téléchargé sur le site puis de lancer en tant qu’utilisateur root, les deux commandes:
[root@oel6ap01 ora2pg-11.4]# perl Makefile.PLChecking if your kit is complete... Looks good Writing Makefile for Ora2PgDone...
Une fois ce makefile produit, on en lance l’éxécution puis l’installation:
make && make install cp lib/Ora2Pg.pm blib/lib/Ora2Pg.pm cp lib/Ora2Pg/PLSQL.pm blib/lib/Ora2Pg/PLSQL.pm cp scripts/ora2pg blib/script/ora2pg /usr/bin/perl -MExtUtils::MY -e 'MY->fixin(shift)' -- blib/script/ora2pg Manifying blib/man3/ora2pg.3 Installing /usr/local/share/perl5/Ora2Pg.pm Installing /usr/local/share/perl5/Ora2Pg/PLSQL.pm Installing /usr/local/share/man/man3/ora2pg.3 Installing /usr/local/bin/ora2pg Installing default configuration file (ora2pg.conf.dist) to /etc Appending installation info to /usr/lib64/perl5/perllocal.pod
Nous sommes ainsi prêts pour tester l’installation et travailler avec ora2pg.
Utilisation d’Ora2pg
Dans ce premier post, nous allons juste vérifier que nous pouvons travailler avec ora2pg en modifiant le fichier de configuration pour produire un rapport sur le schéma cible de notre migration.
Depuis notre répertoire de travail, nous recopions le ../binary/ora2pg-11.4/ora2pg.conf.dist report.conf puis l’editons en modifiant les paramètres suivants:
- ORACLE_HOME /usr/lib/oracle/11.2/client64
- ORACLE_DSN dbi:Oracle:host=vmtestora11g;sid=MSC
- ORACLE_USER SIBMIG
- ORACLE_PWD xxxxxx
- SCHEMA SIBMIG
Une fois ces modifications fates, on peut lancer la génération d’un rapport sur le schema par la commande ci-dessous:
ora2pg -t SHOW_REPORT --estimate_cost --cost_unit_value 10 --conf report.conf --dump_as_html >sibmig.html [========================>] 238/238 tables (100.0%) end of scanning. [========================>] 12/12 objects types (100.0%) end of objects auditing.
De ce rapport dont voici un exemple, nous pouvons rapidement faire un tableau résumant la tache de migration de la base:
Conclusion
L’installation de l’outil est plutôt simple et nous permet, en peu de temps, de connaitre l’ampleur de la tâche qui nous attend.
Nous aborderons dans le prochain article le déroulement d’une migration en nous appuyant sur un cas concret.