Infrastructure at your Service

Open source Team

Migration d’Oracle vers PostgreSQL avec ora2pg

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 :

  1. Une version de perl > 5.6
  2. Les drivers perl DBI & DBD:ORACLE
  3. La présence sur votre système des librairies Oracle.
  4. Optionnellement le driver perl DBD:Pg
  5. 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/[email protected]: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:

[[email protected] 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:

 

Selection_001.jpg

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.

Reférence documentaire

One Comment

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Open source Team
Open source Team