1

Cybertec Migrator : une alternative à ora2pg ?

twitterlinkedinmail

Connue pour de nombreux produits développés pour PostgreSQL, Cybertec a récemment mis à jour son outil de migration de base de données du moteur Oracle vers le moteur PostgreSQL.

Dans cet article, je vais vous expliquer la mise en place de l’outil, son installation, et vous montrer pas à pas comment migrer une base de données depuis Oracle vers PostgreSQL.

Pour l’exemple que je m’apprête à vous montrer, je suis partie d’une machine Rocky Linux 8.7 (Green Obsidian) sur laquelle j’ai installé une version 19c d’Oracle en multitenant et une version 13 de PostgreSQL.

Sur l’instance Oracle, j’ai utilisé une base de données sample fournie par Oracle pour avoir de la matière à migrer :

1ère étape : Télécharger la version désirée de Migrator.

Cybertec nous met à disposition trois types de licences pour son nouvel outil :

  • Une licence standard, qui est une licence gratuite et permet à tout le monde de télécharger l’outil pour le tester. Cette licence n’est à utiliser que si vous pouvez vous permettre d’avoir des temps de maintenance et donc d’indisponibilité de votre base.
  • Une licence professionnelle, qui garantit des performances de migrations plus hautes, réduisant le temps d’indisponibilité en augmentant la rapidité d’exécution de la migration
  • Une licence Enterprise, qui garantit une très nette diminution du temps d’indisponibilité, passant de quelques heures à quelques minutes pour les bases les plus conséquentes.

Ce test est réalisé avec la version standard de l’application, celle que l’on peut obtenir gratuitement. Pour l’obtenir, il suffit de vous rendre sur le site de Cybertec, et de cliquer sur “Download” en dessous de la case de la Standard Edition.

La version actuelle du Migrator est la version 3.16.2, la mise à jour est intervenue pendant que je faisais mes tests, j’ai donc dû mettre à jour le produit pour pouvoir l’utiliser correctement.

Pour pouvoir télécharger l’outil, il vous faut vous inscrire en fournissant une adresse email sur laquelle le lien de téléchargement vous sera envoyé. Vous n’avez plus qu’à transférer l’archive ainsi téléchargée sur votre serveur d’installation.

2ème étape : Les dépendances

Pour pouvoir fonctionner, Migrator nécessite entre autre Git et Docker. L’application fonctionne sur son propre serveur, d’où l’utilisation de Docker. Cela permet entre autre de pouvoir installer facilement celle-ci car il ne s’agit que de déployer un container sur votre installation et le tour est joué.

-> Installer Docker

sudo dnf check-update
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf install docker-ce docker-ce-cli containerd.io
...
Installed:
container-selinux-2:2.189.0-1.module+el8.7.0+1154+147ffa21.noarch containerd.io-1.6.20-3.1.el8.x86_64 docker-buildx-plugin-0.10.4-1.el8.x86_64 docker-ce-3:23.0.4-1.el8.x86_64
docker-ce-cli-1:23.0.4-1.el8.x86_64 docker-ce-rootless-extras-23.0.4-1.el8.x86_64 docker-compose-plugin-2.17.2-1.el8.x86_64 fuse-common-3.3.0-16.el8.x86_64
fuse-overlayfs-1.9-1.module+el8.7.0+1154+147ffa21.x86_64 fuse3-3.3.0-16.el8.x86_64 fuse3-libs-3.3.0-16.el8.x86_64 iptables-1.8.4-23.el8_7.1.x86_64
iptables-libs-1.8.4-23.el8_7.1.x86_64 libcgroup-0.41-19.el8.x86_64 libnetfilter_conntrack-1.0.6-5.el8.x86_64 libnfnetlink-1.0.1-13.el8.x86_64
libnftnl-1.1.5-5.el8.x86_64 libpcap-14:1.9.1-5.el8.x86_64 libslirp-4.4.0-1.module+el8.7.0+1154+147ffa21.x86_64 slirp4netns-1.2.0-2.module+el8.7.0+1154+147ffa21.x86_64

Complete!

-> Installer Git :

sudo dnf install git
...
Installed:
emacs-filesystem-1:26.1-7.el8.noarch         git-2.31.1-3.el8_7.x86_64                                       git-core-2.31.1-3.el8_7.x86_64                              git-core-doc-2.31.1-3.el8_7.noarch
perl-Carp-1.42-396.el8.noarch                perl-Data-Dumper-2.167-399.el8.x86_64                           perl-Digest-1.17-395.el8.noarch                             perl-Digest-MD5-2.55-396.el8.x86_64
perl-Encode-4:2.97-3.el8.x86_64              perl-Errno-1.28-421.el8.x86_64                                  perl-Error-1:0.17025-2.el8.noarch                           perl-Exporter-5.72-396.el8.noarch
perl-File-Path-2.15-2.el8.noarch             perl-File-Temp-0.230.600-1.el8.noarch                           perl-Getopt-Long-1:2.50-4.el8.noarch                        perl-Git-2.31.1-3.el8_7.noarch
perl-HTTP-Tiny-0.074-1.el8.noarch            perl-IO-1.38-421.el8.x86_64                                     perl-IO-Socket-IP-0.39-5.el8.noarch                         perl-IO-Socket-SSL-2.066-4.module+el8.6.0+957+15d660ad.noarch
perl-MIME-Base64-3.15-396.el8.x86_64         perl-Mozilla-CA-20160104-7.module+el8.6.0+965+850557f9.noarch   perl-Net-SSLeay-1.88-2.module+el8.6.0+957+15d660ad.x86_64   perl-PathTools-3.74-1.el8.x86_64
perl-Pod-Escapes-1:1.07-395.el8.noarch       perl-Pod-Perldoc-3.28-396.el8.noarch                            perl-Pod-Simple-1:3.35-395.el8.noarch                       perl-Pod-Usage-4:1.69-395.el8.noarch
perl-Scalar-List-Utils-3:1.49-2.el8.x86_64   perl-Socket-4:2.027-3.el8.x86_64                                perl-Storable-1:3.11-3.el8.x86_64                           perl-Term-ANSIColor-4.06-396.el8.noarch
perl-Term-Cap-1.17-395.el8.noarch            perl-TermReadKey-2.37-7.el8.x86_64                              perl-Text-ParseWords-3.30-395.el8.noarch                    perl-Text-Tabs+Wrap-2013.0523-395.el8.noarch
perl-Time-Local-1:1.280-1.el8.noarch         perl-URI-1.73-3.el8.noarch                                      perl-Unicode-Normalize-1.25-396.el8.x86_64                  perl-constant-1.33-396.el8.noarch
perl-interpreter-4:5.26.3-421.el8.x86_64     perl-libnet-3.11-3.el8.noarch                                   perl-libs-4:5.26.3-421.el8.x86_64                           perl-macros-4:5.26.3-421.el8.x86_64
perl-parent-1:0.237-1.el8.noarch             perl-podlators-4.11-1.el8.noarch                                perl-threads-1:2.21-2.el8.x86_64                            perl-threads-shared-1.58-2.el8.x86_64

Complete!

Etape 3 : Installer Migrator

Une fois l’archive téléchargée et uploadée sur votre serveur, la première étape c’est de décompresser l’archive. Il est conseillé de le faire avec l’utilisateur root pour avoir les droits suffisant à faire les installations nécessaires.

[root@oracle-02]# tar xf cybertec_migrator-v3.16.0-standard.tar.gz
[root@oracle-02]# cd cybertec_migrator

Une fois notre archive décompressée, on créé la configuration de base pour notre Migrator.

[root@oracle-02 cybertec_migrator]# ./migrator configure
[OK] Generated environment file
[INFO] Run './migrator install --archive < archive_file > ' to complete setup

Avant de passer à la suite, on s’assure de bien démarrer notre Docker :

[root@oracle-02 cybertec_migrator]# systemctl start docker
[root@oracle-02 cybertec_migrator]# systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
Active: active (running) since Tue 2023-05-02 08:53:00 UTC; 7s ago
Docs: https://docs.docker.com
Main PID: 3197 (dockerd)
Tasks: 8
Memory: 119.0M
CGroup: /system.slice/docker.service
└─3197 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

On lance ensuite notre installation :

[root@oracle-02 cybertec_migrator]# ./migrator install --archive ../cybertec_migrator-v3.16.0-standard.tar.gz
[INFO] Reading version information from archive file '../cybertec_migrator-v3.16.0-standard.tar.gz'
[INFO] Upgrading to version v3.16.0-standard
[INFO] Extracting archive file '../cybertec_migrator-v3.16.0-standard.tar.gz'
[INFO] Loading container images
c9182c130984: Loading layer [==================================================>] 72.53MB/72.53MB
40599cfe08ec: Loading layer [==================================================>] 349.7kB/349.7kB
20b85315cea4: Loading layer [==================================================>] 102.9MB/102.9MB
61a5eccb8646: Loading layer [==================================================>] 9.454MB/9.454MB
459b6b5a3ba3: Loading layer [==================================================>] 3.584kB/3.584kB
8b2451f44e75: Loading layer [==================================================>] 61.95MB/61.95MB
ff1b0bd4bc3d: Loading layer [==================================================>] 2.048kB/2.048kB
105a91dee35e: Loading layer [==================================================>] 115.5MB/115.5MB
8399b2b8ccbe: Loading layer [==================================================>] 3.173MB/3.173MB
4377e9cc2f2c: Loading layer [==================================================>] 25.5MB/25.5MB
8dbaeed3eff6: Loading layer [==================================================>] 2.56kB/2.56kB
Loaded image: cybertecpostgresql/cybertec_migrator-core:v3.16.0-standard
3af14c9a24c9: Loading layer [==================================================>] 84MB/84MB
af29ec691175: Loading layer [==================================================>] 62.5MB/62.5MB
a0b795906dc1: Loading layer [==================================================>] 3.584kB/3.584kB
95457f8a16fd: Loading layer [==================================================>] 4.608kB/4.608kB
4d0bf5b5e17b: Loading layer [==================================================>] 3.584kB/3.584kB
ff4557f62768: Loading layer [==================================================>] 7.168kB/7.168kB
0c1e2a4e5a14: Loading layer [==================================================>] 13.14MB/13.14MB
Loaded image: cybertecpostgresql/cybertec_migrator-web_gui:v3.16.0-standard
7cd52847ad77: Loading layer [==================================================>] 7.338MB/7.338MB
e2b55894f225: Loading layer [==================================================>] 12.8kB/12.8kB
96139409c02a: Loading layer [==================================================>] 2.048kB/2.048kB
c3ec93ee5b48: Loading layer [==================================================>] 233.7MB/233.7MB
99c761a4ed63: Loading layer [==================================================>] 60.42kB/60.42kB
b3357907ccb7: Loading layer [==================================================>] 2.56kB/2.56kB
a7504fa091bf: Loading layer [==================================================>] 3.584kB/3.584kB
a283b778659e: Loading layer [==================================================>] 15.87kB/15.87kB
Loaded image: postgres:13-alpine
[INFO] Container images loaded
[INFO] Archived container images
[INFO] Upgraded to v3.16.0-standard
[WARN] Could not find TLS/SSL certificate
[INFO] Run './migrator configure --tls self-signed-cert' to generate a self-signed TLS/SSL certificate

Pour pouvoir fonctionner, les nouvelles versions de Migrator nécessitent un certificat TLS, on en génère donc un :

[root@oracle-02 cybertec_migrator]# ./migrator configure --tls self-signed-cert
[INFO] Generating self-signed TLS/SSL certificate
[+] Running 2/1
 Network cybertec_migrator_common         Created                                                                                                                                                                                     0.2s
 Volume "cybertec_migrator_core_db-data"  Created                                                                                                                                                                                     0.0s
Generating a RSA private key
.................................................................................+++++
............+++++
writing new private key to '/etc/nginx/certs/nginx.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:FR
...
Email Address []:sfaveere@capdata-osmozium.com
[OK] Generated self-signed TLS/SSL certificate
[INFO] Run './migrator up' to switch to new version
[WARN] Switching will abort running migrations

Etape 4 : Démarrage de l’application et premiers pas

Une fois notre installation terminée, on peut démarrer l’outil :

[root@oracle-02 cybertec_migrator]# ./migrator up
[+] Running 3/3
 Container cybertec_migrator-core_db-1 Healthy 6.2s
 Container cybertec_migrator-core-1 Started 6.6s
 Container cybertec_migrator-web_gui-1 Started 7.3s
[OK] Started on 'https://***.**.*.**'

L’URL fournie par la fin de l’installation est l’url à laquelle vous devez accéder pour pouvoir voir s’afficher votre outil de migration web.

Important : Avant de vous connecter sur l’application, il y a certains droits qu’il faut s’assurer d’avoir.

Sur Oracle :
J’ai créé un compte Migrator avec des droits particuliers :

-- On the Oracle database
CREATE USER migrator IDENTIFIED by migrator;
GRANT CONNECT, SELECT_CATALOG_ROLE, SELECT ANY TABLE, FLASHBACK ANY TABLE TO migrator;

Sur PostgreSQL :

-- As PostgreSQL super user
CREATE DATABASE demo;
CREATE USER demo WITH PASSWORD 'demo';
GRANT CREATE ON DATABASE demo TO demo;

Il ne nous reste plus qu’à accéder à notre outil de migration, en se rendant au lien précisé à la fin du start-up :

Etape 5 : Prévoir sa migration

Une fois que nous avons correctement accès à notre page de garde de Migrator, on peut donc commencer à prévoir une nouvelle migration. En cliquant sur Migration dans le menu à gauche, on accède à une nouvelle fenêtre :

Sur cette nouvelle page, on peut cliquer sur Add New Migration afin d’accéder à la page de création d’une nouvelle migration

 

Ce premier écran est celui sur lequel on définit la connexion d’origine de la base de données, donc notre connexion Oracle.

Les deux premiers champs du formulaire permettent de donner un nom et une description à notre migration.

Ensuite, on donne une chaine de connexion pour notre base de données source, le username qu’on a créé plus tôt et le mot de passe qui lui est lié. On clique sur check, et si la connexion est ok, alors on aperçoit un message “Connection Success”. On peut donc cliquer sur “Next”.

 

L’écran suivant est l’écran qui nous permet de gérer le ou les schémas que l’on souhaite migrer. Dans notre cas, on sélectionne le schéma OT et on clique sur “Next”.

La fenêtre qui s’affiche permet de voir tout ce que l’outil Migrator nous permet de migrer. On peut voir que sur cette version standard, on ne sait pas migrer les partitions. On peut cliquer sur “Finish”.

L’écran suivant est l’écran de suivi de la migration en lui-même. Il comporte de nombreuses fonctionnalités qui vous permettent de choisir les objets que vous voulez migrer ou non, en les désactivant on peut aisément ne pas importer certains objets.

En cliquant dans le menu déroulant à gauche, on peut dérouler les tables et voir  les champs dans ces tables. En cliquant dessus on peut même aller modifier manuellement les types de ces champs pour leur migration, les contraintes, les index, les triggers…

Une fois nos modifications effectuées, pour qu’elles soient prises en compte on peut cliquer sur le bouton “Save” en bas à gauche, juste en dessous de la ligne.

Ainsi, on peut par exemple modifier le type des colonnes de clé primaire de Numeric à Integer pour éviter d’avoir un problème lors de l’import, dans la mesure où PostgreSQL n’accepte pas les clé primaires de type Numeric.

Une fois que toutes nos modifications sont effectuées, on peut cliquer sur le cercle en bas à gauche pour ouvrir la console qui va nous permettre de lancer la migration.

Les quatre étapes de la migration sont les suivantes :

  • Schéma : Migrator transfère le schéma depuis l’ancienne base vers la nouvelle
  • Data : Migrator transfère la data depuis la source vers la destination
  • Integrity : Il transfère les contraintes, les indexes, les clés primaires
  • Logic : Migrator transfère les fonctions, les procédures, les vues et les triggers

La petite fenêtre de log peut être étendue vers le haut, et elle vous permet d’avoir un visuel sur ce qui se passe pendant votre migration, et si des erreurs éventuelles sont rencontrées. La majeure partie des erreurs de migrations sont des problèmes de type que l’on peut modifier directement sur l’interface pour ensuite relancer le processus.

 

Quand notre migration est terminée, c’est affiché dans notre log, et on peut alors aller voir sur l’environnement PostgreSQL le résultat obtenu.

psql (13.10)
Type "help" for help.
postgres=# \c demo
You are now connected to database "demo" as user "postgres".
demo=# select * from ot.products;
product_id | product_name | description | standard_cost | list_price | category_id
------------+---------------------------------------------+-----------------------------------------------------------------------+---------------+------------+-------------
228 | Intel Xeon E5-2699 V3 (OEM/Tray) | Speed:2.3GHz,Cores:18,TDP:145W | 2867.51 | 3410.46 | 1
248 | Intel Xeon E5-2697 V3 | Speed:2.6GHz,Cores:14,TDP:145W | 2326.27 | 2774.98 | 1
249 | Intel Xeon E5-2698 V3 (OEM/Tray) | Speed:2.3GHz,Cores:16,TDP:135W | 2035.18 | 2660.72 | 1
...

Notre schéma PostgreSQL qui ne contenait rien à la base contient maintenant l’intégralité des données que notre schéma Oracle contenait.

Conclusion :

Sur un marché où de plus en plus de produits open-source nous permettent de faciliter des tâches aussi délicates que de la migration d’un environnement de base de données à un autre, Migrator et son interface graphique nous offrent une solution user-friendly avec une interface qui permet de simplifier les choses.
Il faut cependant garder en tête que cet outil n’est pas gratuit en dehors de sa version standard, et que pour pouvoir profiter des améliorations de performance pour vos migrations, il faut acheter une licence auprès de Cybertec.
L’installation du produit en elle-même ne pose aucune difficulté, et après un peu de prise en main, il s’avère relativement facile à utiliser.

Continuez votre lecture sur le blog :

twitterlinkedinmail

Sarah FAVEERE

Un commentaire

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.