EDB – Utilitaires : EDB*Plus et Kit de Migration

Cet article fournit un guide pour effectuer la mise en œuvre des utilitaires EDB*Plus version 36 et EDB Postgres Migration Toolkit version 53.0.1 du logiciel de gestion de base de données EDB Postgres dans l'environnement Linux RHEL/CentOS/OL (RedHat Enterprise Linux/Community enterprise Operating System/Oracle Linux) :

  • Introduction
  • Pré-requis
  • Mise en œuvre d'EDB*Plus
  • Installation du kit de migration EDB Postgres Migration Toolkit
  • Mise en œuvre du kit de migration des objets d’une base Oracle vers Enterprise EDB PostgreSQL

Introduction

EDB Postgres est une version consolidée du moteur de gestion de base de données PostgreSQL. C’est une plateforme de gestion de données de qualité professionnelle qui fournit une vraie compatibilité avec Oracle Database. L'installation des utilitaires EDB*Plus et EDB Migration Toolkit sur Linux RHEL/CentOS/OL avec YUM et le gestionnaire de packages  RPM nécessite la configuration du référentiel YUM pour EDB. Dans la mesure où cette étape a déjà été effectuée vous pouvez vous rendre directement au paragraphe "Mise en œuvre d'EDB*Plus".

Site : https://www.enterprisedb.com/fr/

Pré-requis

Pour pouvoir installer les logiciels EDB Postgres sur Linux RHEL/CentOS/OL vous devez avoir un compte utilisateur sur le site EnterpriseDB et le référentiel YUM doit être configuré pour EDB. Le logiciel EDB Enterprise Database doit également avoir été installé préalablement. Consultez les articles EDB Postgres – Enregistrement & Référentiel  et EDB Postgres – installation et mise en œuvre pour effectuer ces opérations.

Mise en œuvre d'EDB*Plus

Le guide d'utilisation est accessible à cette adresse : Guide EDB*Plus

Installation de EDB*Plus

Le guide d’installation officiel est accessible à cette adresse : https://www.enterprisedb.com/edb-docs/d/edbplus/user-guides/edbplus-guide/36/installing_edb_plus.html

Avant d'installer EDB*Plus, vous devez d'abord installer Java (version 1.7 ou supérieure). Sur votre système Linux, vous pouvez utiliser le gestionnaire de packages yum pour installer Java. Ouvrez une fenêtre de terminal, et entrez en tant que super utilisateur root :

login as: root 
root@serveur's password: xxxxx

# yum install java

Ou bien si java est déjà installé vous pouvez éventuellement mettre à jours la version avec la commande :

# yum update java

Les commandes précédentes installent Open Java dont l'environnement est installé dans le directory /usr/lib/jvm. Vous pouvez également télécharger et installer java depuis le site d'Oracle (recommandé), l'environnement sera alors installé dans le directory /usr/java.  Télécharger Java depuis le lien : https://www.oracle.com/java/technologies/javase-downloads.html

Téléchargez le RPM Java :

A partir du répertoire dans lequel a été téléchargé le rpm :

Installez java avec la commande yum :

# yum -y localinstall jdk-8u241-linux-x64.rpm

EDB*Plus utilise java, vous devez configurer la variable JAVA_HOME dans l’environnement shell :

# JAVA_HOME=/usr/java/jdk1.8.0_241-amd64
# export JAVA_HOME

Remarques : la syntaxe ci-dessus est compatible « shell Bourne ». La variable JAVA_HOME peut être différente en fonction de l’installation de java (voir le directory /usr/java ou /usr/lib/jvm). D’autre part, votre référentiel yum EDB doit être configuré avec les droits d’accès de votre compte utilisateur EDB (voir les premiers paragraphes de ce document à ce sujet)

Installez EDB*Plus avec yum :

# yum install edb-as12-edbplus

EDB*Plus est compatible avec l’utilitaire Oracle SQL*Plus. Vous pouvez essayer quelques commandes SQL avec EDB*Plus :

# edbplus enterprisedb
Enter Password:
Connected to EnterpriseDB 12.2.3 (localhost:5444/edb) AS enterprisedb
edb*Plus: Release 12 (Build 38.0.0)
Copyright (c) 2008-2019, EnterpriseDB Corporation.  All rights reserved.

SQL> desc user_tables
 Name                                       Null?    Data Type
 ------------------------------------------ -------- ------------
 SCHEMA_NAME                                         CLOB
 TABLE_NAME                                          CLOB
 TABLESPACE_NAME                                     CLOB
 STATUS                                              VARCHAR2(5)
 TEMPORARY                                           CHAR(1)

SQL> show user
 USER is "enterprisedb"

SQL> select TABLE_NAME from user_tables;
 TABLE_NAME
 ------------------------------------------------------------------------
 PGA_JOBCLASS
 PGA_JOB
 PGA_JOBAGENT
 PGA_JOBSTEP
 PGA_SCHEDULE
 PGA_EXCEPTION
 PGA_JOBLOG
 PGA_JOBSTEPLOG
 PRODUCT_COMPONENT_VERSION
 DUAL
 EDB_DBMS_REDACT_FULL_DEFAULT_VALUES
 ...
 ...
 TABLE_NAME
 ------------------------------------------------------------------------
 EDB$STATIO_ALL_INDEXES
 EDB$STATIO_ALL_TABLES
 24 rows retrieved.

SQL> exit

Connexion en mode easy*connect

# edbplus enterprisedb@localhost/edb 
Enter Password: 
Connected to EnterpriseDB 12.2.3 (localhost:5444/edb) AS enterprisedb 
edb*Plus: Release 12 (Build 38.0.0) Copyright (c) 2008-2019, EnterpriseDB Corporation.  
All rights reserved.

SQL> exit

Installation du kit de migration EDB Postgres Migration Toolkit

Le référentiel YUM étant correctement configuré pour EDB, l'installation du kit de migration s'effectue comme pour EDB*Plus :

# yum install edb-migrationtoolkit

Mise en œuvre du kit de migration des objets d’une base Oracle vers Enterprise EDB PostgreSQL

Configuration de l'outil de migration

L’outil de migration a été installé dans le directory /usr/edb/migrationtoolkit

# cd /usr/edb/migrationtoolkit
# ls
 bin  edb-migrationtoolkit_3rd_party_licenses.txt  edb-migrationtoolkit_license.txt  etc  lib

Le directory contient les sous directory bin, etc et lib ainsi que les contrats de licence d’utilisation de l’outil de migration.

Remarque: Il est important de lire les contrats de licence. Le présent document décrit le processus de migration des objets d’une base de données Oracle vers Enterprise EDB à titre de démonstration et d’évaluation de la faisabilité technique. Si vous désirez adopter ces solutions vous devrez vous rapprocher d’EnterpriseDB Corporation et/ou d'Oracle Corporation.

Configuration des connexions jdbc

Modifiez le fichier toolkit.properties en fonction des paramètres de connexion aux base de données Oracle et PostgreSQL. La base Oracle qui est utilisée ici est la base de données pluggable xepdb1 du logiciel Oracle Express Edition 18c. C’est le contenu du schéma HR qui sera migré dans la base EDB Postgres.

# cd /usr/edb/migrationtoolkit/etc
# vi toolkit.properties

SRC_DB_URL=jdbc:oracle:thin:@//ol77.localdomain:1521/xepdb1
SRC_DB_USER=hr
SRC_DB_PASSWORD=hr

TARGET_DB_URL=jdbc:edb://localhost:5444/edb
TARGET_DB_USER=enterprisedb
TARGET_DB_PASSWORD=secret

Remarquez la chaîne de connexion au format easy connect pour accéder à la pluggable database. Le user Oracle de connexion doit avoir le rôle DBA  :

# su – oracle
$ export ORACLE_SID=XE
$ sqlplus / as sysdba
SQL> alter session set container=xepdb1 ;
SQL> grant dba to hr;
SQL> exit

Le driver JDBC pour EDB Enterprise Postgres est déjà installé.

Télécharger le driver JDBC pour Oracle depuis le site : https://www.oracle.com/database/technologies/jdbc-upc-downloads.html#license-lightbox

Dans cet article c’est le driver JDBC qui est fourni avec Oracle Express Edition qui sera utilisé. Oracle Express Edition est installé dans le directory /opt/oracle/product/18c/dbhomeXE/

# ls /opt/oracle/product/18c/dbhomeXE/

L’environnement java qui sera utilisé par le Kit de Migration est référencé par la variable JAVA_HOME. C’est le JDK Oracle qui a été installé précédemment.

# env | grep JAVA
JAVA_HOME=/usr/java/jdk1.8.0_241-amd64

# PATH=$JAVA_HOME/jre/bin:$JAVA_HOME/bin:$PATH
# type java
java est /usr/java/jdk1.8.0_241-amd64/jre/bin/java

Copiez le driver JDBC Oracle dans le directory $JAVA_HOME/jre/lib/ext

# export ORACLE_HOME=/opt/oracle/product/18c/dbhomeXE/
# cp $ORACLE_HOME/jdbc/lib/ojdbc8_g.jar /usr/java/jdk1.8.0_241-amd64/jre/lib/ext/
# cp $ORACLE_HOME/jdbc/lib/ojdbc8.jar   /usr/java/jdk1.8.0_241-amd64/jre/lib/ext/
# ls $JAVA_HOME/jre/lib/ext
cldrdata.jar  localedata.jar  ojdbc8.jar        sunpkcs11.jar dnsns.jar       
meta-index      sunec.jar  zipfs.jar     jaccess.jar     nashorn.jar     ojdbc8_g.jar     sunjce_provider.jar

Configuration de l’environnement du user système enterprisedb

Le processus de migration sera exécuté depuis le user système enterprisedb. Son profile doit être modifié comme suit :

  1. Se connecter sous enterprisedb
# su – enterprisedb
  1. modifier le fichier .bash_profile et configurer l'environnement shell pour accéder à la base Oracle.
    La variable PATH est configurée pour accéder également aux exécutables EDB et du kit de migration : /usr/edb/as12/bin:/usr/edb/migrationtoolkit/bin
$ vim ~/.bash_profile

[ -f /etc/profile ] && source /etc/profile
 PGDATA=/var/lib/edb/as12/data
 export PGDATA

# If you want to customize your settings,
# Use the file below. This is not overridden
# by the RPMS.
[ -f /var/lib/edb/.enterprisedb_profile ] && source /var/lib/edb/.enterprisedb_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
   . ~/.bashrc
fi

# User specific environment and startup programs
export JAVA_HOME=/usr/java/jdk1.8.0_241-amd64
export ORACLE_BASE=/opt/oracle
export ORACLE_HOME=$ORACLE_BASE/product/18c/dbhomeXE
export ORACLE_SID=XE

PATH=$JAVA_HOME/jre/bin:$JAVA_HOME/bin:$ORACLE_HOME/bin:/usr/edb/as12/bin:/usr/edb/migrationtoolkit/bin:$PATH:$HOME/.local/bin:$HOME/binexport LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib:/lib:/usr/lib:/usr/edb/migrationtoolkit/lib

eexport CLASSPATH=$ORACLE_HOME/jdbc/lib:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
 export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
 alias oe='env | egrep "ORA|LANG|JAVA"'
 alias oh='cd $ORACLE_HOME'
  1. Charger le script dans le shell courant
$ . ~/.bash_profile

$ oe
NLS_LANG=AMERICAN_AMERICA.AL32UTF8
ORACLE_SID=XE
ORACLE_BASE=/opt/oracle
JAVA_HOME=/usr/java/jdk1.8.0_241-amd64
LANG=fr_FR.UTF-8
ORACLE_HOME=/opt/oracle/product/18c/dbhomeXE

$ type sqlplus
sqlplus est /opt/oracle/product/18c/dbhomeXE/bin/sqlplus

$ type edbplus
edbplus est /bin/edbplus

$ type java
java est /usr/java/jdk1.8.0_241-amd64/jre/bin/java

$ java -version
java version "1.8.0_241"
Java(TM) SE Runtime Environment (build 1.8.0_241-b07)
Java HotSpot(TM) 64-Bit Server VM (build 25.241-b07, mixed mode)

$ type runMTK.sh
runMTK.sh est /usr/edb/migrationtoolkit/bin/runMTK.sh

$ exit

Migration des objets de la base Oracle XE vers la base EDB Enterprise Postgres

Avant de lancer la procédure de migration il est nécessaire de déverrouiller le user HR de la base Oracle xepdb1 :

# su - oracle
$ sqlplus sys/oracle@localhost/xepdb1 as sysdba
SQL*Plus: Release 18.0.0.0.0 - Production on Thu Apr 9 14:58:29 2020
Version 18.4.0.0.0
Copyright (c) 1982, 2018, Oracle.  All rights reserved.

Connected to:
Oracle Database 18c Express Edition Release 18.0.0.0.0 - Production
Version 18.4.0.0.0

SQL> alter session set container=xepdb1;

SQL> alter user hr identified by hr account unlock;
User altered.

SQL> grant dba to hr;
Grant succeeded.

SQL> exit

$ exit

Lancer la procédure de migration

# su - enterprisedb
$ runMTK.sh HR

Le Schéma HR a été créé.

Vérifications post migration

Le processus de migration étant terminé, il convient d’inspecter la base EDB pour vérifier que les objets ont été correctement convertis.

Depuis le user système enterprisedb connectez-vous à la base de données edb :

$ edb-psql -d edb -U enterprisedb
Mot de passe pour l'utilisateur enterprisedb :
edb-psql (12.2.3)
Saisissez « help » pour l'aide.

La commande \dn permet d’afficher les schémas de la base de données

edb=# \dn
   Liste des schémas
   Nom   | Propriétaire
---------+--------------
 daphne  | enterprisedb
 hr      | enterprisedb
 pgagent | enterprisedb
 public  | enterprisedb
(4 lignes)

Le schéma HR a été créé dans la base de données.

Chemin de recherche par défaut

edb=# show search_path;
   search_path
-----------------
 "$user", public
(1 ligne)

edb=# \dt
Aucune relation n'a été trouvée.

La commande \dt permet d’afficher les tables. Aucune table n’a été trouvée avec le chemin de recherche par défaut.

Modification du chemin de recherche

edb=# set search_path = hr, "$user", public;
SET
edb=# \dt
             Liste des relations
 Schéma |     Nom     | Type  | Propriétaire
--------+-------------+-------+--------------
 hr     | countries   | table | enterprisedb
 hr     | departments | table | enterprisedb
 hr     | employees   | table | enterprisedb
 hr     | job_history | table | enterprisedb
 hr     | jobs        | table | enterprisedb
 hr     | locations   | table | enterprisedb
 hr     | regions     | table | enterprisedb
(7 lignes)

Les tables du schéma HR sont maintenant affichées.

La commande \du permet de lister les utilisateurs déclarés dans la base de données

edb=# \du
      Liste des rôles
      Nom du rôle      |   Attributs            | Membre de
aq_administrator_role  | Pas d'héritage, Ne peut pas se connecter                                        +| {}
                       | Profile default        |
 daphne                | Superutilisateur      +| {}
                       | Profile default        |
 enterprisedb          | Superutilisateur, Créer un rôle, Créer une base, Réplication, Contournement RLS +| {}
                       | Profile default        |

Le user HR n’existe pas. La création du schéma n’entraine pas la création de l’utilisateur.

Création de l’utilisateur HR

edb=# create user hr with password 'hr';
CREATE ROLE

Assignation de tous les privilèges

edb=# grant all privileges on database edb to hr;
GRANT
edb=# \q

Connexion au user HR

$ edb-psql -d edb -U hr
Mot de passe pour l'utilisateur hr :
edb-psql (12.2.3)
Saisissez « help » pour l'aide.

Affichage du chemin de recherche par défaut

edb=> show search_path;
   search_path
-----------------
 "$user", public
(1 ligne)

Affichage des tables

edb=> \dt
Aucune relation n'a été trouvée.

Tentative d’accès à une table

edb=> select * from hr.departments;
ERREUR:  droit refusé pour le schéma hr
LIGNE 1 : select * from hr.departments;
edb=> \q

Modification du schéma par défaut associé à HR

$ edb-psql -d edb -U enterprisedb
Mot de passe pour l'utilisateur enterprisedb :
edb-psql (12.2.3)
Saisissez « help » pour l'aide.

edb=# GRANT USAGE ON SCHEMA hr TO hr;
GRANT

edb=# \q

Reconnexion à HR

$ edb-psql -d edb -U hr
Mot de passe pour l'utilisateur hr :
edb-psql (12.2.3)
Saisissez « help » pour l'aide.
edb=> \dt
             Liste des relations
 Schéma |     Nom     | Type  | Propriétaire
--------+-------------+-------+--------------
 hr     | countries   | table | enterprisedb
 hr     | departments | table | enterprisedb
 hr     | employees   | table | enterprisedb
 hr     | job_history | table | enterprisedb
 hr     | jobs        | table | enterprisedb
 hr     | locations   | table | enterprisedb
 hr     | regions     | table | enterprisedb
(7 lignes)

Tentative d’accès à une table

edb=> select * from hr.departments;
ERREUR:  droit refusé pour la table departments
edb=> \q

L’accès est refusé. Il est nécessaire d’accorder des droits au user HR.

$ edb-psql -d edb -U enterprisedb
Mot de passe pour l'utilisateur enterprisedb :
edb-psql (12.2.3)
Saisissez « help » pour l'aide.

edb=# GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA hr TO hr;
GRANT

edb=# alter role hr set search_path = hr, "$user", public;
ALTER ROLE

edb=# \q

Nouvelle tentative

$ edb-psql -d edb -U hr
Mot de passe pour l'utilisateur hr :
edb-psql (12.2.3)
Saisissez « help » pour l'aide.

edb=> \dt
Liste des relations
Schéma |     Nom     | Type  | Propriétaire
--------+-------------+-------+--------------
hr     | countries   | table | enterprisedb
hr     | departments | table | enterprisedb
hr     | employees   | table | enterprisedb
hr     | job_history | table | enterprisedb
hr     | jobs        | table | enterprisedb
hr     | locations   | table | enterprisedb
hr     | regions     | table | enterprisedb
(7 lignes)

edb=> select * from departments;
department_id |   department_name    | manager_id | location_id
---------------+----------------------+------------+-------------
10 | Administration       |        200 |        1700
20 | Marketing            |        201 |        1800
30 | Purchasing           |        114 |        1700
40 | Human Resources      |        203 |        2400
50 | Shipping             |        121 |        1500
...
...
250 | Retail Sales         |            |        1700
260 | Recruiting           |            |        1700
270 | Payroll              |            |        1700
(27 lignes)

edb=> \q
$

Connexion avec EDB*Plus

$ edbplus hr/hr@ol77/edb
Connected to EnterpriseDB 12.2.3 (ol77:5444/edb) AS hr
edb*Plus: Release 12 (Build 38.0.0)
Copyright (c) 2008-2019, EnterpriseDB Corporation.  All rights reserved.
SQL> show user
USER is "hr"

SQL> desc departments
Name                    Null?    Data Type
------------------------ -------- --------
DEPARTMENT_ID           NOT NULL NUMBER(4)
DEPARTMENT_NAME         NOT NULL VARCHAR2(30)
MANAGER_ID                       NUMBER(6)
LOCATION_ID                      NUMBER(4)

SQL> select DEPARTMENT_ID, DEPARTMENT_NAME from departments;

DEPARTMENT_ID DEPARTMENT_NAME
------------- ------------------------------
10 Administration
20 Marketing
30 Purchasing
40 Human Resources
50 Shipping
60 IT
70 Public Relations
80 Sales
90 Executive
100 Finance
110 Accounting

DEPARTMENT_ID DEPARTMENT_NAME
------------- ------------------------------
230 IT Helpdesk
240 Government Sales
250 Retail Sales
260 Recruiting
270 Payroll
27 rows retrieved.

SQL> desc add_job_history

PROCEDURE ADD_JOB_HISTORY
Argument Name      Type          In/Out Default?
------------------- ------------- ------ --------
P_DEPARTMENT_ID    NUMBER         IN
P_EMP_ID           NUMBER         IN
P_END_DATE         TIMESTAMP      IN
P_JOB_ID           VARCHAR2       IN
P_START_DATE       TIMESTAMP      IN

SQL> desc secure_dml
PROCEDURE SECURE_DML

SQL> exit
$

En conclusion les objets du schéma HR de la base Oracle ont été migré correctement.