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 :
- La migration Oracle vers PostgreSQL avec ora2pg (Emmanuel RAMI) [OraclePostgreSQL]
- Une solution de “Disaster Recovery” sous Oracle Standard Edition avec DBVisit standby (Emmanuel RAMI) [GénéralOracle]
- Containeriser PostgreSQL avec Docker ! (Emmanuel RAMI) [ContainerPostgreSQL]
- Transparent Data Encryption pour PostgreSQL (Sarah FAVEERE) [PostgreSQL]
- PostgreSQL : planifier une tâche avec pg_cron (Emmanuel RAMI) [Non classéPostgreSQL]
Merci pour toutes ces explications sur Migrator, je vais essayer ça !