OCI : Utiliser Zero Downtime Migration pour migrer une base de données (1/2)

Introduction

Pour les besoins de migrations de bases de données vers OCI, il existe un outil bien pratique : Zero Downtime Migration (ZDM).

ZDM est une solution simplifiée à l’extrême et grandement automatisée pour la mise en place d’une migration d’une base On-Premises vers une infrastructure OCI, Exac@C ou encore Exadata On-Premises, le tout sans ou avec un downtime négligeable.

Le principe de ZDM est le suivant : ZDM construit une copie de votre base de données sur OCI et garde cette copie synchronisée avec la base source.
ZDM se base sur des fonctionnalités techniques telles que GoldenGate ou Data Guard pour garantir une Haute Disponibilité et permettre une migration à chaud.
Depuis les dernières versions, ZDM supporte les Autonomous Databases (ATP et ADW) en tant que cible sur OCI.

 

Cibles possibles de migration

Voici les différentes cibles de migration qu’il est possible de choisir :

  • Oracle Database Cloud Service : Bare Metal & Virtual Machine
  • Oracle Exadata Cloud Service
  • Oracle Exadata Cloud at Customer
  • Autonomous Transaction Processing (Dedicated and Shared)
  • Autonomous Data Warehouse (Dedicated and Shared)

 

Installation

Nous allons procéder à l’installation de ZDM sur une instance Linux créée sur OCI (Oracle Linux 7).

    • Dans un premier temps, il faut installer les packages systèmes ci-dessous :
      yum -y install \
      glibc-devel \
      expect \
      unzip \
      libaio \
      kernel-uek-devel-$(uname -r) \
      python36

 

    • Créer ensuite un groupe et un user ZDM :
      groupadd zdm
      useradd -g zdm zdmuser
      

 

    • Créer un répertoire pour les binaires ZDM :
      mkdir /u01
      chown zdmuser:zdm /u01
      
    • Modifier le fichier .bashrc du user zdmuser, y ajouter les variables ci-dessous et recharger l’environnement :
      INVENTORY_LOCATION=/u01/app/oraInventory; export INVENTORY_LOCATION 
      ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE ZDM_BASE=\$ORACLE_BASE; export ZDM_BASE
      ZDM_HOME=\$ZDM_BASE/zdm21; export ZDM_HOME
      ZDM_INSTALL_LOC=/sources; export ZDM_INSTALL_LOC 
      

 

    • Créer ensuite les différents répertoires Oracle :
      mkdir -p $ORACLE_BASE $ZDM_BASE $ZDM_HOME $ZDM_INSTALL_LOC

 

    • Créer ensuite les différents répertoires Oracle :
      mkdir -p $ORACLE_BASE $ZDM_BASE $ZDM_HOME $ZDM_INSTALL_LOC

 

 

    • Décompresser ensuite le fichier dans le répertoire :
      cd $ZDM_INSTALL_LOC
      unzip zdm21.1.zip
      cd zdm21.1

 

    • Lancer ensuite l’installation de ZDM :
      ./zdminstall.sh setup \
      oraclehome=$ZDM_HOME \
      oraclebase=$ZDM_BASE \
      ziploc=./zdm_home.zip -zdm
      

 

    • Voici comment se déroule l’installation :
      ZDM kit home: /sources/zdm21.1
      /sources/zdm21.1
      ---------------------------------------
      Unzipping shiphome to ZDM home...
      ---------------------------------------
      Unzipping shiphome...
      Shiphome unzipped successfully..
      ---------------------------------------
      ##### Performing GridHome Software Only Installation #####
      ---------------------------------------
      Installation log location: /u01/app/oracle/crsdata/oralinux/rhp/logs/runInstaller_1627050481.out
      making dir /u01/app/oracle/crsdata/oralinux/rhp/conf
      ---------------------------------------
      Generating Preference file
      ---------------------------------------
      /u01/app/oracle/crsdata/oralinux/rhp/conf/rhp.pref
      Using port 8897 for MySQL
      ---------------------------------------
      Generating Root Certificate
      ---------------------------------------
      Cluster root certificate generated successfully.
      ---------------------------------------
      Generating CA CERTS file
      ---------------------------------------
      spawn /u01/app/oracle/zdm21/bin/crskeytoolctl -copycacerts -filestore /u01/app/oracle/crsdata/oralinux/security
      Enter JRE cacerts truststore password:
      JRE cacerts copied to file [/u01/app/oracle/crsdata/oralinux/security/cacerts].
      ---------------------------------------
      Generating nogi.enabled file
      ---------------------------------------
      nogi.enabled file generated sucessfully
      ---------------------------------------
      Generating standalone_config.properties file
      ---------------------------------------
      Setting base folder permissions
      ---------------------------------------
      Copying service script to bin folder in Oracle Home
      ---------------------------------------
      Storing to wallet
      ---------------------------------------
      cacerts  crskeytoolctl.log  cwallet.sso  cwallet.sso.lck
      ---------------------------------------
      Generating random password
      ---------------------------------------
      -rw-------. 1 zdmuser zdm 4389 Jul 23 16:28 /u01/app/oracle/crsdata/oralinux/security/cwallet.sso
      -rw-------. 1 zdmuser zdm 4389 Jul 23 16:28 /u01/app/oracle/crsdata/oralinux/security/cwallet.sso
      RHP_PT.ZDM21_LINUX.X64_210228.2
      rhpctl working
      label_date is: 210228.2
      ---------------------------------------
      Setting up MySQL...
      ---------------------------------------
      mysqld will log errors to /u01/app/oracle/crsdata/oralinux/rhp/mysql/metadata/mysql-error.log
      mysqld is running as pid 25940
      ---------------------------------------
      Storing to wallet
      ---------------------------------------
      cacerts  crskeytoolctl.log  cwallet.sso  cwallet.sso.lck
      ---------------------------------------
      Generating random password
      ---------------------------------------
      -rw-------. 1 zdmuser zdm 4501 Jul 23 16:28 /u01/app/oracle/crsdata/oralinux/security/cwallet.sso
      -rw-------. 1 zdmuser zdm 4501 Jul 23 16:28 /u01/app/oracle/crsdata/oralinux/security/cwallet.sso
      spawn /u01/app/oracle/zdm21/mysql/server/bin/mysql --socket=/u01/app/oracle/crsdata/oralinux/rhp/mysql/metadata/mysql.sock -u root
      ---------------------------------------
      Creating MySQL DB and user...
      ---------------------------------------
      spawn /u01/app/oracle/zdm21/mysql/server/bin/mysql --socket=/u01/app/oracle/crsdata/oralinux/rhp/mysql/metadata/mysql.sock -u root -p -e CREATE DATABASE IF NOT EXISTS GHSUSER21;
      spawn /u01/app/oracle/zdm21/mysql/server/bin/mysql --socket=/u01/app/oracle/crsdata/oralinux/rhp/mysql/metadata/mysql.sock -u root -p
      spawn /u01/app/oracle/zdm21/mysql/server/bin/mysql --socket=/u01/app/oracle/crsdata/oralinux/rhp/mysql/metadata/mysql.sock -u root -p -e GRANT ALTER, CREATE, CREATE TEMPORARY TABLES, CREATE VIEW, DELETE, DROP, INDEX, INSERT, LOCK TABLES, REFERENCES, SELECT, SHOW VIEW, UPDATE ON GHSUSER21.* TO 'GHSUSER21'@'localhost';
      current node is active node
      spawn /u01/app/oracle/zdm21/mysql/server/bin/mysqladmin --defaults-file=/u01/app/oracle/crsdata/oralinux/rhp/conf/my.cnf -u root -p shutdown
      ZDM service setup finished successfully...
      

 

    • Démarrer ensuite le service ZDM :
      $ZDM_HOME/bin/zdmservice start No instance detected, starting zdmservice
      mysqld will log errors to /u01/app/oracle/crsdata/oralinux/rhp/mysql/metadata/mysql-error.log
      mysqld is running as pid 26426WARNING: oracle.jwc.rest does not exist in the configuration file. It will be FALSE by default. WARNING: oracle.jwc.jmx does not exist in the configuration file. It will be TRUE by default. [jwcctl debug] Environment ready to start JWC [jwcctl debug] Return code of initialization: [0] [jwcctl debug] ... BEGIN_DEBUG [Action= start] ... Start JWC [jwcctl debug] Loading configuration file: /u01/app/oracle/crsdata/oralinux/rhp/conf/jwc.properties [jwcctl debug] oracle.jmx.login.credstore = CRSCRED [jwcctl debug] oracle.jmx.login.args = DOMAIN=rhp CACHE_ENABLED=true CACHE_EXPIRATION=180 [jwcctl debug] oracle.rmi.url = service:jmx:rmi://{0}:{1,number,#}/jndi/rmi://{0}:{1,number,#}/jmxrmi [jwcctl debug] oracle.http.url = http://{0}:{1,number,#}/rhp/gridhome [jwcctl debug] oracle.jwc.tls.clientauth = false [jwcctl debug] oracle.jwc.tls.rmi.clientfactory = RELOADABLE [jwcctl debug] oracle.jwc.lifecycle.start.log.fileName = JWCStartEvent.log [jwcctl debug] oracle.jwc.http.connector.ssl.protocols = TLSv1.2,TLSv1.3 [jwcctl debug] Get JWC PIDs [jwcctl debug] Done Getting JWC PIDs [jwcctl debug] ... JWC containers not found ... [jwcctl debug] Start command:-server -Xms2048M -Xmx4096M -Djava.awt.headless=true -Ddisable.checkForUpdate=true -Djava.util.logging.config.file=/u01/app/oracle/crsdata/oralinux/rhp/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -DTRACING.ENABLED=true -DTRACING.LEVEL=2 -Doracle.wlm.dbwlmlogger.logging.level=FINEST -Duse_scan_IP=true -Djava.rmi.server.hostname=oralinux -Doracle.http.port=8896 -Doracle.jmx.port=8895 -Doracle.tls.enabled=false -Doracle.jwc.tls.http.enabled=false -Doracle.rhp.storagebase=/u01/app/oracle -Djava.security.manager -Djava.security.policy=/u01/app/oracle/crsdata/oralinux/rhp/conf/catalina.policy -Djava.security.egd=file:/dev/urandom -Doracle.jwc.wallet.path=/u01/app/oracle/crsdata/oralinux/security -Doracle.jmx.login.credstore=WALLET -Doracle.rest.enabled=false -Doracle.jmx.enabled=true -Dcatalina.home=/u01/app/oracle/zdm21/tomcat -Dcatalina.base=/u01/app/oracle/crsdata/oralinux/rhp -Djava.io.tmpdir=/u01/app/oracle/crsdata/oralinux/rhp/temp -Doracle.home=/u01/app/oracle/zdm21 -Doracle.jwc.mode=STANDALONE -classpath /u01/app/oracle/zdm21/jlib/cryptoj.jar:/u01/app/oracle/zdm21/jlib/oraclepki.jar:/u01/app/oracle/zdm21/jlib/osdt_core.jar:/u01/app/oracle/zdm21/jlib/osdt_cert.jar:/u01/app/oracle/zdm21/tomcat/lib/tomcat-juli.jar:/u01/app/oracle/zdm21/tomcat/lib/bootstrap.jar:/u01/app/oracle/zdm21/jlib/jwc-logging.jar org.apache.catalina.startup.Bootstrap start [jwcctl debug] Get JWC PIDs [jwcctl debug] Done Getting JWC PIDs [jwcctl debug] ... JWC Container (pid=26493) ... [jwcctl debug] ... JWC Container running (pid=26493) ... [jwcctl debug] Check command:-Djava.net.preferIPv6Addresses=true -Dcatalina.base=/u01/app/oracle/crsdata/oralinux/rhp -Doracle.wlm.dbwlmlogger.logging.level=FINEST -Doracle.jwc.client.logger.file.name=/u01/app/oracle/crsdata/oralinux/rhp/logs/jwc_checker_stdout_err_%g.log -Doracle.jwc.client.logger.file.number=10 -Doracle.jwc.client.logger.file.size=1048576 -Doracle.jwc.wallet.path=/u01/app/oracle/crsdata/oralinux/security -Doracle.jmx.login.credstore=WALLET -Doracle.tls.enabled=false -Doracle.jwc.tls.http.enabled=false -classpath /u01/app/oracle/zdm21/jlib/jwc-logging.jar:/u01/app/oracle/zdm21/jlib/jwc-security.jar:/u01/app/oracle/zdm21/jlib/jwc-client.jar:/u01/app/oracle/zdm21/jlib/jwc-cred.jar:/u01/app/oracle/zdm21/jlib/srvm.jar:/u01/app/oracle/zdm21/jlib/srvmhas.jar:/u01/app/oracle/zdm21/jlib/cryptoj.jar:/u01/app/oracle/zdm21/jlib/oraclepki.jar:/u01/app/oracle/zdm21/jlib/osdt_core.jar:/u01/app/oracle/zdm21/jlib/osdt_cert.jar:/u01/app/oracle/zdm21/tomcat/lib/tomcat-juli.jar oracle.cluster.jwc.tomcat.client.JWCChecker localhost 8896 -1 [jwcctl debug] ... JWC Container is ready ... [jwcctl debug] ... START - Return code = 0 ... [jwcctl debug] ... END_DEBUG [Action=start] ... [jwcctl debug] Return code of AGENT: [0] Return code is 0 Server started successfully.

 

    • Vérifier le status du service ZDM :
      $ZDM_HOME/bin/zdmservice start
      ---------------------------------------
      Service Status
      ---------------------------------------Running: true
      Tranferport:
      Conn String: jdbc:mysql://localhost:8897/
      RMI port: 8895
      HTTP port: 8896
      Wallet path: /u01/app/oracle/crsdata/oralinux/security

 

L’installation de ZDM est maintenant terminée.

 

Dans un second article, nous procéderons à sa configuration et son utilisation pour migrer une base de données vers OCI.