Réplication d'une base de données Oracle avec DBVisit Replicate

DBVisit Replicate est un outil qui, comme son nom l’indique, permet de répliquer des données d’une base de données source vers une base de données cible. Il offre une alternative moins onéreuse que Oracle Goldengate.
Jusqu’à la version actuelle (2.9), la base de données source est obligatoirement une base Oracle, Standard Edition ou Enterprise Edition, à partir de la version 9iR2, jusqu’à la version 12cR2. Le produit supporte les instances Standalone et RAC (éditions DBVisit Replicate XTD et MAX).
 
Comme dans tout outil de réplication de données, certaines contraintes existent, notamment au niveau des types de données supportés. DBVisit fournit des scripts permettant de s’assurer de la compatibilité de vos données sources.
La base de données cible peut être sous MySQL, PostgreSQL, Microsoft SQL Server, Tibero, Google Cloud SQL, Hadoop, CSV ou Kafka.
DBVisit Replicate peut s’installer sous Linux (i386/x86_64), mais également sous Windows (i386/x86_64), IBM AIX, Sun Solaris ou HP-UX.
Trois éditions sont commercialisées :

  • LTD : limitée à la réplication de 200 tables ;
  • XTD : permettant de répliquer jusqu’à 2000 tables, offrant plus de fonctionnalités (support du RAC entre autres) et plus de types de données (LOB)) ;
  • MAX : non limitée en nombre de tables et avec des fonctionnalités avancées (Two-way-replication, …).

Principe de fonctionnement de DBVisit Replicate


Le processus de réplication s’établit en 3 phases :

  • le process « MINE » extrait les instructions DML des redo log de la base de données source et les retranscrit dans des fichiers « PLOG » ;
  • les fichiers PLOG sont transmis via le réseau sur la machine cible ;
  • les instructions contenues dans les fichiers PLOG sont alors appliquées par le process « APPLY » sur la base de données cible.

 

Contexte client

Le besoin d’un de nos clients était de pouvoir déporter les requêtes de type BI d’une base de données transactionnelle vers une base de données répliquée en temps réel. La volumétrie est d’environ 3To avec moins de 2000 tables. L’édition XTD a donc été choisie avec Oracle 11gR2 Entreprise Edition en source, et Oracle 11gR2 Standard Edition en cible.

Installation du produit

Sous Linux l’installation est triviale. Il suffit d’installer un RPM dans l’environnement source et dans l’environnement cible avec le compte root :

[root@source]$ rpm -ivh dbvisit_replicate-2.9.04-1.x86_64.rpm
 Preparing... ########################################### [100%]
 1:dbvisit_replicate ########################################### [100%]
 [root@source]$
[root@cible]$ rpm -ivh dbvisit_replicate-2.9.04-1.x86_64.rpm
 Preparing... ########################################### [100%]
 1:dbvisit_replicate ########################################### [100%]
 [root@cible]$

Créer un filesystem dédié sur le serveur source et le serveur cible pour stocker les fichiers créés par DBVisit, les plus volumineux étant les PLOG. Les fichiers sont automatiquement compressés et purgés par DBVisit mais il est conseillé d’avoir un espace de stockage d’une journée de production.

[root@source]# df -hP | grep dbvisit
/dev/mapper/vg_root-lv_dbv_src1     50G  63M   49G  1% /u02/app/dbvisit
[root@source]#
[root@cible]# df -hP | grep dbvisit
/dev/mapper/vg_root-lv_dbv_cib1     50G  63M   49G  1% /u02/app/dbvisit
[root@cible]#

A partir de maintenant, toutes les actions seront faites avec un compte système différent de root et ayant suffisamment de droits pour se connecter à une base de données Oracle.
 

Initialisation de la base de données cible

La base cible doit être créée et les données synchronisées avec la base de données source. Chaque contexte est différent et DBVisit Replicate nous donne le choix pour effectuer cette première synchronisation.
Si les données à répliquer représentent une petite partie de la base, Datapump sera adapté. Si au contraire les données représentent la quasi-totalité de la base, RMAN sera la solution à retenir avec sa fonction « duplicate ».
Dans notre contexte, les tables répliquées représentent 90% de la volumétrie sur les 3To de la base. Avec Oracle Database 11gR2, RMAN avec la fonctionnalité « duplicate from active database » a été choisi.
 

Paramétrage de DBVisit Replicate

Après l’initialisation de la base cible, vous devrez désactiver les triggers et les contraintes de clés étrangères sur la cible. Les triggers joués sur la base source ne doivent pas être rejoués sur la cible, la réplication étant faite de table à table entre la source et la cible.
Le paramétrage de la réplication peut maintenant être fait avec le « wizard » de DBVisit Replicate. Il peut être utilisé soit en mode interactif, soit avec un fichier de réponse préalablement créé. C’est la seconde solution qui est utilisée ici avec le fichier de réponse ci-dessous :

Version of response file: 2.9.00
accept_license: yes
DDC_NAME: dbvatlg
LICENSE_KEY: XXXXX-XXXXX-XXXXX-XXXXX-XXXXX-XXXXX-XXXXX
SETUP_SCRIPT_PATH: /u02/app/dbvisit/dbvatlg
TNS_ADMIN: /u01/app/oracle/product/11.2.0/dbhome_1/network/admin
###Step 1
store_passwords: YES
rdbms: Oracle
TNS_alias: SOURCE
sysuser: SYS
syspassword: ********
systemuser: SYSTEM
systempassword: ********
dbvuser: dbvrep
dbvpassword: ********
tablespace: USERS
temp_tablespace: TEMP
database#: add
rdbms: Oracle
TNS_alias: CIBLE
sysuser: SYS
syspassword: ********
systemuser: SYSTEM
systempassword: ********
dbvuser: dbvrep
dbvpassword: ********
tablespace: USERS
temp_tablespace: TEMP
database#: done
###Step 2
source db: 1
target db: 2
enable_ddl: Yes
use_fetcher: No
suplog_all: Yes
encrypt_network: No
compress_network: No
network_timeout: 60
prepare_type: resetlogs
instantiate_type: none
pair#: done
###Step 3
pair#: 1
tables_and_schemas: APPLI1 APPLI2.TAB1 APPLI2.TAB2
add_more: No
plsql_schemas: APPLI1 APPLI2
add_more: No
rename_or_filter: No
pair#: done
###Step 4
process#: 1
hostname: source
OS: Linux
email_notify: No
snmp_notify: No
SETUP_SCRIPT_PATH: /u02/app/dbvisit/dbvatlg
change: No
process#: 2
hostname: cible
OS: Linux
email_notify: No
snmp_notify: No
SETUP_SCRIPT_PATH: /u02/app/dbvisit/dbvatlg
change: No
process#: done

Informations concernant les paragraphes :

  • En en-tête : DDC_NAME est le nom de notre réplication. Ici nous l’appelons dbvatlg. Nous retrouverons ce nom dans les fichiers de configuration générés. Nous avons aussi le numéro de licence et le répertoire de travail de la réplication.
  • Step 1 : informations concernant les 2 bases de données impliquées dans la réplication.
  • Step 2 : sens de réplication et mode de préparation de la cible. Ici « resetlogs » car nous avons choisi une duplication avec RMAN.
  • Step 3 : les schémas et tables que nous allons répliquer. Dans cet exemple, le schéma APPLI1 (toutes ses tables), et les tables TABLE1 et TABLE2 du schéma APPLI2. plsql_schemas indique que les procédures, fonctions, packages sont également répliqués.
  • Step 4 : il concerne les notifications que DBVisit Replicate peut envoyer par mail ou via des trappes SNMP. Ici nous ne les configurons pas, le client utilise ses propres supervisions.

La configuration peut être faite en lançant la commande ci-dessous :

$ /usr/dbvisit/replicate/dbvrep setup wizard respfile /u02/app/dbvisit/dbvatlg/dbvatlg-response_file.txt

Le wizard crée tous les fichiers de configuration et les scripts shell ci-dessous qui vont nous permettre de finaliser la configuration et lancer la réplication.

[oracle@source dbvatlg] $ ll
total 312904
drwxr-xr-x 2 oracle oinstall      4096 Jan 29 17:59 config
-rw-r--r-- 1 oracle oinstall     34634 Feb  1 23:18 dbvatlg-all.log
-rwxr----- 1 oracle oinstall      2792 Feb  1 23:13 dbvatlg-all.sh
-rw-r----- 1 oracle oinstall       754 Feb  1 23:15 dbvatlg-APPLY.ddc
-rw-r----- 1 oracle oinstall       705 Feb  1 23:16 dbvatlg-MINE.ddc
-rwxr----- 1 oracle oinstall       117 Feb  1 23:13 dbvatlg-run-cible.sh
-rwxr----- 1 oracle oinstall       115 Feb  1 23:13 dbvatlg-run-source.sh
drwxr-xr-x 2 oracle oinstall      4096 Feb  6 18:15 ddc_backup
drwxr-xr-x 3 oracle oinstall      4096 Feb  8 16:10 log
drwxr-xr-x 2 oracle oinstall     20480 Feb  8 17:26 mine
-rw-r----- 1 oracle oinstall      1318 Feb  1 23:13 Nextsteps.txt
drwxr-xr-x 2 oracle oinstall      4096 Dec 28 13:58 scripts
-rwxr-x--- 1 oracle oinstall        87 Feb  1 23:13 start-console.sh
[oracle@source dbvatlg] $ ll config
total 108
-rw-r----- 1 oracle oinstall  2313 Feb  1 23:13 dbvatlg-dbsetup_CIBLE_dbvrep.sql
-rw-r----- 1 oracle oinstall  2056 Feb  1 23:13 dbvatlg-dbsetup_SOURCE_dbvrep.sql
-rw-r----- 1 oracle oinstall 35610 Feb  1 23:13 dbvatlg-grants_CIBLE_dbvrep.sql
-rw-r----- 1 oracle oinstall 17192 Feb  1 23:13 dbvatlg-grants_SOURCE_dbvrep.sql
-rw-r----- 1 oracle oinstall  3346 Feb  1 23:13 dbvatlg-onetime.ddc
-rw-r----- 1 oracle oinstall 17420 Feb  1 23:13 dbvatlg-setup.dbvrep
-rw-r----- 1 oracle oinstall   895 Feb  1 23:13 dbvatlg-wizard-databases.cfg
-rw-r----- 1 oracle oinstall  2079 Feb  1 23:13 dbvatlg-wizard-ddc.cfg
-rw-r----- 1 oracle oinstall   258 Feb  1 23:13 dbvatlg-wizard-pairs.cfg
-rw-r----- 1 oracle oinstall  7390 Feb  1 23:13 dbvatlg-wizard-tables.cfg
[oracle@source dbvatlg] $ ll scripts
total 40
-rwxr----- 1 oracle oinstall 1317 Feb  1 23:13 dbvatlg-cible-dbvrep-APPLY.sh
-rwxr----- 1 oracle oinstall  316 Feb  1 23:13 dbvatlg-cible-start-APPLY.sh
-rwxr----- 1 oracle oinstall  129 Feb  1 23:13 dbvatlg-cible-stop-APPLY.sh
-rwxr----- 1 oracle oinstall 1320 Feb  1 23:13 dbvatlg-source-dbvrep-MINE.sh
-rwxr----- 1 oracle oinstall  312 Feb  1 23:13 dbvatlg-source-start-MINE.sh
-rwxr----- 1 oracle oinstall  127 Feb  1 23:13 dbvatlg-source-stop-MINE.sh
-rw-rw-r-- 1 oracle oinstall  624 Feb  1 23:13 systemd-dbvrep-APPLY_dbvatlg.service
-rw-rw-r-- 1 oracle oinstall  617 Feb  1 23:13 systemd-dbvrep-MINE_dbvatlg.service
-rw-rw-r-- 1 oracle oinstall  870 Feb  1 23:13 upstart-dbvrep-APPLY_dbvatlg.conf
-rw-rw-r-- 1 oracle oinstall  857 Feb  1 23:13 upstart-dbvrep-MINE_dbvatlg.conf
[oracle@source dbvatlg] $

 

Initialisation de la réplication

C’est l’étape cruciale ! Elle doit être réalisée lors d’une faible activité car DBVisit Replicate pose un lock sur chaque table une à une afin d’avoir une cohérence des données.
Cette étape peut être longue (en fonction du nombre de tables à répliquer et de leur volumétrie), du fait que DBVisit Replicate active « supplemental logging » sur chaque table répliquée. Si « supplemental logging » est déjà actif, cette étape est rapide.
Lancement de l’initialisation à partir du serveur source :

$ /u02/app/dbvisit/dbvatlg/dbvatlg-all.sh

A la fin de l’exécution du script, le fichier /u02/app/dbvisit/dbvatlg/Nextsteps.txt s’affiche. Il répertorie les dernières étapes pour que la réplication soit fonctionnelle :

These steps are required after the dbvatlg-all.sh script runs:
1) Create the necessary directory(ies) on the servers:
cible: /u02/app/dbvisit/dbvatlg
2) Copy the DDC files to the server(s) where the processes will run:
cible: /u02/app/dbvisit/dbvatlg/dbvatlg-APPLY.ddc
source: /u02/app/dbvisit/dbvatlg/dbvatlg-MINE.ddc
3) Review that path to dbvrep executable is correct in the run scripts:
/u02/app/dbvisit/dbvatlg/dbvatlg-run-cible.sh
/u02/app/dbvisit/dbvatlg/dbvatlg-run-source.sh
4) Copy the run script to the server(s) where the processes will run:
cible: /u02/app/dbvisit/dbvatlg/dbvatlg-run-cible.sh
source: /u02/app/dbvisit/dbvatlg/dbvatlg-run-source.sh
5) Ensure firewall is open for listen interfaces 0.0.0.0:7902, 0.0.0.0:7901 used by the processes.
6) Make sure the data on apply are in sync as of time when setup was run.
7) Start the replication processes on all servers:
cible: /u02/app/dbvisit/dbvatlg/dbvatlg-run-cible.sh
source: /u02/app/dbvisit/dbvatlg/dbvatlg-run-source.sh
8) Start the console to monitor the progress:
/u02/app/dbvisit/dbvatlg/start-console.sh

Une fois les contrôles effectués et les fichiers copiés sur la machine cible (étapes 1 à 6), les process de réplication MINE et APPLY peuvent être lancés sur la cible…

$ /u02/app/dbvisit/dbvatlg/dbvatlg-run-cible.sh

… puis sur la source :

$ /u02/app/dbvisit/dbvatlg/dbvatlg-run-source.sh

 
A partir du serveur source, vous pouvez maintenant lancer la console pour contrôler l’état de la réplication :

/u02/app/dbvisit/dbvatlg/start-console.sh

L’écran suivant s’affiche, il se met à jour en temps réel :

Copyright (C) Dbvisit Software Limited.  All rights reserved.
/ Dbvisit Replicate 2.9.04(XTD edition) - Fully Licensed
MINE is running. Currently at plog 87844 and SCN 53173366424 (02/09/2018 08:48:27).
APPLY is running. Currently at plog 87844 and SCN 53173366417 (02/09/2018 08:48:27).
Progress of replication dbvatlg:MINE->APPLY: total/this execution
----------------------------------------------------------------------------------------------------------
APPLI1.CDE:  100%  Mine:12/12    Unrecov:0/0  Applied:12/12   Conflicts:0/0   Last:09/02/2018 08:48:23/OK
APPLI1.CDL:  100%  Mine:221/221  Unrecov:0/0  Applied:221/221 Conflicts:0/0   Last:09/02/2018 08:48:23/OK
APPLI1.CDR:  100%  Mine:54/54    Unrecov:0/0  Applied:54/54   Conflicts:0/0   Last:09/02/2018 08:47:45/OK
APPLI1.ART:  100%  Mine:3/3      Unrecov:0/0  Applied:3/3     Conflicts:0/0   Last:09/02/2018 08:48:21/OK
APPLI2.TAB1: 100%  Mine:1/1      Unrecov:0/0  Applied:1/1     Conflicts:0/0   Last:09/02/2018 08:48:03/OK
APPLI2.TAB2: 100%  Mine:3/3      Unrecov:0/0  Applied:3/3     Conflicts:0/0   Last:09/02/2018 08:47:45/OK

 
Les tables sont synchronisées. Nous pouvons voir que les process MINE et APPLY sont en état « running », et qu’ils sont bien synchrones (SCN et date).
La console permet de réaliser également plusieurs actions parmi lesquelles, l’arrêt et la mise en pause de la réplication, la gestion de conflits et la modification de paramètres. Il est également possible d’ajouter des tables ou schémas à une réplication.
Easyteam et DBVisit sont partenaires. N’hésitez pas à nous contacter pour vos projets DBVisit Replicate.