Remarques :

Migration de MySQL Database sur site vers une instance gérée par Oracle HeatWave MySQL à l'aide d'OCI GoldenGate

Introduction

Oracle Cloud Infrastructure GoldenGate (OCI GoldenGate) est un service entièrement géré qui aide les ingénieurs de données à déplacer des données en temps réel, à grande échelle, d'un ou de plusieurs systèmes de gestion des données vers des bases de données OCI. Concevez, exécutez, orchestrez et surveillez les tâches de réplication de données dans une interface unique sans avoir à allouer ou gérer des environnements de calcul. OCI GoldenGate prend en charge plusieurs sources et cibles, notamment MySQL et le service de base de données Oracle HeatWave MySQL.

Dans ce tutoriel, nous vous expliquerons comment migrer une base de données MySQL sur site vers une instance gérée Oracle HeatWave MySQL à l'aide d'OCI GoldenGate.

Objectifs

Prérequis

Restrictions

Tâche 1 : créer des instances MySQL source et cible

Tâche 2 : test des connexions entre les instances Bastion, On-Premise et Oracle Heatwave MySQL

  1. Installez le client MySQL et l'utilitaire shell MySQL sur l'hôte OCI Bastion.

  2. Testez la connexion d'OCI Bastion à l'instance MySQL sur site source.

    [root@bastion ~]#  mysql --host <sourceIP> -uadmin -p
    mysql: [Warning] Using a password on the command line interface can be insecure.
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 15
    Server version: 5.7.44 MySQL Community Server (GPL)
    
    Copyright (c) 2000, 2025, Oracle and/or its affiliates.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    +--------------------+
    4 rows in set (0.00 sec)
    
    mysql> select @@version;
    +-----------+
    | @@version |
    +-----------+
    | 5.7.44    |
    +-----------+
    1 row in set (0.00 sec)
    
  3. Testez la connexion de l'instance MySQL sur site source à l'instance gérée Oracle Heatwave MySQL.

    [root@mysqlci57 ~]# mysql --host <targetIP> -u admin -p
    mysql: [Warning] Using a password on the command line interface can be insecure.
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 108
    Server version: 8.4.4-u5-cloud MySQL Enterprise - Cloud
    
    Copyright (c) 2000, 2023, Oracle and/or its affiliates.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql> select @@version;
    +----------------+
    | @@version      |
    +----------------+
    | 8.4.4-u5-cloud |
    +----------------+
    1 row in set (0.01 sec)
    

Tâche 3 : création d'utilisateurs pour OCI GoldenGate

Tâche 4 : définition des paramètres obligatoires dans la base de données source pour OCI GoldenGate

Il n'est pas obligatoire d'activer le GTID sur la source si la cible est autonome (pas HA). Mais si la cible est HA, il est fortement recommandé d'activer GTID sur la source. Il est obligatoire d'activer le mode binlog.

  1. Modifiez le fichier /etc/my.cnf et ajoutez les lignes suivantes.

    server-id=1
    log-bin=/var/log/mysql/mysql-bin.log
    max_binlog_size=100M
    binlog_format=ROW
    expire_logs_days=10
    -- binlog_row_metadata=FULL <-- this is not supported in Version 5.7.44. So DDL replication will not be possible if source is on v5.7.44.
    gtid_mode=ON
    enforce_gtid_consistency=ON
    
  2. Redémarrez le serveur MySQL.

    Systemctl stop mysqld
    Systemctl start mysqld
    Systemctl status mysqld
    

    Pour obtenir la liste ou les paramètres complets, vérifiez les paramètres et les conditions du journal des transactions. Pour plus d'informations, reportez-vous à Option B : utilisation de votre propre bastion sur OCI Compute.

  3. Exécutez la commande suivante pour vérifier que les journaux binaires sont activés maintenant.

    mysql> show binary logs;
    +------------------+-----------+
    | Log_name         | File_size |
    +------------------+-----------+
    | mysql-bin.000001 |       154 |
    +------------------+-----------+
    1 row in set (0.00 sec)
    
    mysql> show variables like 'bin%';
    +--------------------------------------------+--------------+
    | Variable_name                              | Value        |
    +--------------------------------------------+--------------+
    | bind_address                               | *            |
    | binlog_cache_size                          | 32768        |
    | binlog_checksum                            | CRC32        |
    | binlog_direct_non_transactional_updates    | OFF          |
    | binlog_error_action                        | ABORT_SERVER |
    | binlog_format                              | ROW          |
    | binlog_group_commit_sync_delay             | 0            |
    | binlog_group_commit_sync_no_delay_count    | 0            |
    | binlog_gtid_simple_recovery                | ON           |
    | binlog_max_flush_queue_time                | 0            |
    | binlog_order_commits                       | ON           |
    | binlog_row_image                           | FULL         |
    | binlog_rows_query_log_events               | OFF          |
    | binlog_stmt_cache_size                     | 32768        |
    | binlog_transaction_dependency_history_size | 25000        |
    | binlog_transaction_dependency_tracking     | COMMIT_ORDER |
    +--------------------------------------------+--------------+
    16 rows in set (0.01 sec)
    
  4. Exécutez la commande suivante pour vérifier que le mode GTID (gtid_mode) est activé.

    mysql> show variables like 'gtid%';
    +----------------------------------+-----------+
    | Variable_name                    | Value     |
    +----------------------------------+-----------+
    | gtid_executed_compression_period | 1000      |
    | gtid_mode                        | ON        |   <--- it is now showing ON
    | gtid_next                        | AUTOMATIC |
    | gtid_owned                       |           |
    | gtid_purged                      |           |
    +----------------------------------+-----------+
    5 rows in set (0.00 sec)
    
    mysql> select @@gtid_executed, @@gtid_purged\G
    *************************** 1. row ***************************
    @@gtid_executed:
      @@gtid_purged:
    1 row in set, 1 warning (0.00 sec)
    
    mysql> select * from mysql.gtid_executed;
    Empty set (0.00 sec)   <--- this is empty because we just turned it ON. As transactions occur this will get populated
    

Remarque : il est courant que la première requête affiche des valeurs NULL pour le GTID. En effet, dans MySQL versions 5.7, la valeur GTID est stockée uniquement dans la table mysql.gtid_executed.

Tâche 5 : créer le schéma airportdb (métadonnées uniquement) dans la base de données cible

  1. Extrayez les métadonnées de schéma de la base de données source.

    [root@bastion airport-db]# mysqldump --host <SourceIP> -u admin -p --no-data --routines --events airportdb > airportdb.sql
    mysqldump: [Warning] Using a password on the command line interface can be insecure.
    -- Warning: column statistics not supported by the server.
    
  2. Importez les métadonnées de schéma dans la base cible.

    [root@bastion opc]#  mysql --host <TargetIP> -u admin -p
    mysql: [Warning] Using a password on the command line interface can be insecure.
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 581
    Server version: 8.4.4-u5-cloud MySQL Enterprise - Cloud
    
    Copyright (c) 2000, 2025, Oracle and/or its affiliates.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql> create database airportdb;
    Query OK, 1 row affected (0.01 sec)
    
    mysql> use airportdb;
    Database changed
    mysql> source airportdb.sql
    

Tâche 6 : configuration du déploiement OCI GoldenGate et ajout de connexions

Il existe plusieurs blogs et tutoriels sur la configuration des déploiements OCI GoldenGate. Nous allons donc vous présenter quelques étapes.

  1. Connectez-vous à la console OCI et sélectionnez GoldenGate Deployments.

  2. Cliquez sur Créer un déploiement et entrez les informations requises, comme indiqué dans l'image suivante.

    Image montrant comment créer un déploiement Golden Gate

  3. Ajoutez les détails de connexion source et cible sur la page Créer un déploiement.

    Image montrant comment créer une connexion Golden Gate pour la source

    Image montrant comment créer une connexion Golden Gate pour la cible

    Illustration présentant les deux connexions ajoutées dans GG

  4. Affectez les connexions au déploiement OCI GoldenGate. Cliquez sur le nom de la connexion, puis sur Affecter un déploiement.

    Image montrant comment affecter un déploiement à une connexion

    Image représentant la connexion source affectée au déploiement

    Image représentant la connexion cible affectée au déploiement

  5. A l'aide du service OCI Bastion, configurez le transfert de port vers le port 443, puis connectez-vous à la console OCI GoldenGate.

    Image représentant l'URL de la page d'accueil de goldengate

  6. Validez les connexions de base de données à partir de la console OCI GoldenGate.

    1. Cliquez sur le menu Hamburger pour voir les deux connexions ajoutées au déploiement dans la tâche 6.4.

    2. Cliquez sur Connexion pour valider les connexions. Si les connexions réussissent, vous pouvez créer une table de points de reprise en cliquant sur Point de reprise +.

      Il est fortement recommandé d'ajouter les connexions à l'aide du déploiement OCI GoldenGate dans OCI car il ajoutera automatiquement le DNS aux adresses IP. Sans ces DNS, les connexions de test échoueront.

      Illustration présentant les connexions goldengate et les tests de connexions

Tâche 7 : Créer des processus d'extraction et de réplication

  1. Avant de créer le processus d'extraction, assurez-vous que gtid_mode a la valeur ON dans la base de données source, en particulier si la cible est HA.

    Il existe deux méthodes pour ajouter un processus Extract :

    • Méthode 1 : vous pouvez ajouter une extraction une fois le chargement initial (instance de copie ou de vidage) terminé et utiliser une méthode d'instanciation précise. Pour plus d'informations, reportez-vous à Instanciation de précision pour MySQL à MySQL à l'aide des utilitaires de shell MySQL et d'Oracle GoldenGate.

      Pour ajouter une extraction et la démarrer pour effectuer la capture de données à partir de ce GTID ou journal binaire particulier, comme indiqué dans l'image suivante. Oracle recommande d'utiliser cette méthode.

      Image représentant la configuration d'extraction goldengate

      Remarque : ici, l'ensemble GTID est extrait du fichier JSON de la commande dumpInstance ou de la sortie des commandes copyInstance.

    • Méthode 2 : vous pouvez ajouter l'extraction au tout début avant même de lancer le chargement initial des données, puis modifier le processus Replicat pour qu'il commence par une position de journal binaire et gtidexecuted/binlog# particulière affichée dans le fichier JSON de dumpInstance() ou dans la sortie de copyInstance().

      Utilisez le paramètre HANDLECOLLISION avec cette méthode pour éviter tout problème de données en double.

      Remarque : Pour ce point de contact, la méthode 2 a été utilisée.

      Modifiez le fichier de paramètres d'extraction :

      EXTRACT ext1
      USERIDALIAS  MySQLCI57, DOMAIN OracleGoldenGate
      EXTTRAIL e1
      --DDL INCLUDE MAPPED  (needed for DDL replication, also need to set  binlog_row_metadata to FULL in mysql config file on source db). But not supported for MySQL V5.7
      TRANLOGOPTIONS FETCHPARTIALJSON       (for JSON replication, also need to set binlog_row_value_options to empty string in the mysql config)
      TABLE airportdb.*;
      

      Remarque : si vous ajoutez DDL INCLUDE MAPPED au fichier de paramètres d'extraction, vous obtenez une erreur indiquant que la réplication LDD n'est pas prise en charge pour MySQL version 5.7.4.

  2. Démarrez le processus d'extraction.

    Image montrant l'exécution de l'extraction goldengate

  3. Le processus Extract est en cours d'exécution et génère le fichier trace. Créez maintenant le processus Replicat.

    1. Créez d'abord une table de points de reprise. Accédez à la section Configuration, sélectionnez la base de données cible et cliquez sur Point de reprise + pour créer une table de points de reprise.

      Image représentant la création d'une table de points de reprise goldengate

    2. Créer un traitement de réplication. Comme il s'agit d'une réplication unidirectionnelle, nous pouvons utiliser la réplication parallèle pour obtenir de meilleures performances. Pour la réplication bidirectionnelle, seule la réplication classique est prise en charge.

      Ne lancez pas le processus Replicat, créez-le simplement. Nous allons le démarrer une fois les données importées.

      Image représentant la création de réplicat goldengate

    3. Modifiez le fichier de paramètres. Vous pouvez également ajouter des paramètres PARALLEL ou utiliser le parallélisme par défaut.

      REPLICAT rep1
      USERIDALIAS  MySQLGG1, DOMAIN OracleGoldenGate
      MAP airportdb.*, TARGET airportdb.*;
      

Tâche 8 : copier des données de la source vers la cible à l'aide de copyInstance()

  1. Exécutez une simulation à l'aide de l'option dryRun:"true" de copyInstance().

    Type '\help' or '\?' for help; '\quit' to exit.
    MySQL  SQL > \connect admin@<Source IP>
    Creating a session to 'admin@<Source IP>'
    Fetching global names for auto-completion... Press ^C to stop.
    Your MySQL connection id is 37
    Server version: 5.7.44-log MySQL Community Server (GPL)
    No default schema selected; type \use <schema> to set one.
     MySQL  <Source IP>:3306 ssl  SQL > \js
    Switching to JavaScript mode...
     MySQL  <Source IP>:3306 ssl  JS > util.copyInstance('mysql://admin@<Target IP>', {"compatibility":["skip_invalid_accounts","strip_definers","strip_restricted_grants","strip_tablespaces","ignore_wildcard_grants","strip_invalid_grants","create_invisible_pks"], users:"true", threads:2, dryRun:"true"});
    Please provide the password for 'admin@<target IP': *******************
    Save password for 'admin@<target IP>'? [Y]es/[N]o/Ne[v]er (default No):
    
  2. En l'absence d'erreur, enlevez l'option dryRun et réexécutez-la pour effectuer le chargement des données. La sortie finale doit se présenter comme suit : Aucune erreur signalée.

    SRC: Starting data dump
    100% (59.50M rows / ~59.36M rows), 142.25K rows/s, 9.68 MB/s
    SRC: Dump duration: 00:07:50s
    SRC: Total duration: 00:07:50s
    SRC: Schemas dumped: 2
    SRC: Tables dumped: 15
    SRC: Data size: 2.03 GB
    SRC: Rows written: 59502422
    SRC: Bytes written: 2.03 GB
    SRC: Average throughput: 4.33 MB/s
    1 thds indexing \ 100% (2.03 GB / 2.03 GB), 7.47 MB/s (161.06K rows/s), 15 / 15 tables done
    Building indexes - done
    Executing common postamble SQL - done
    TGT: 53 chunks (59.50M rows, 2.03 GB) for 15 tables in 2 schemas were loaded in 7 min 51 sec (avg throughput 4.32 MB/s, 126.29K rows/s)
    TGT: 17 DDL files were executed in 0 sec.
    TGT: 0 accounts were loaded, 3 accounts failed to load due to unsupported authentication plugin errors
    TGT: Data load duration: 7 min 51 sec
    TGT: 1 indexes were built in 0 sec.
    TGT: Total duration: 7 min 51 sec
    TGT: 0 warnings were reported during the load.
    ..
    ..
    Dump_metadata:
    Binlog_file: mysql-bin.000006
    Binlog_position: 626
    Executed_GTID_set: 7ee61c32-16eb-11f0-b3fc-02001702dcb5:1-3
    

Remarque : notez le GTID exécuté dans la sortie de copyInstance() et utilisez-le pour modifier le processus Replicat.

Tâche 9 : Modifier la réplication et démarrer

Utilisez le numéro de fichier journal 000006 et le numéro de position du journal 626 comme indiqué dans la sortie de copyInstance() dans la tâche 8. Ce fichier journal et cette position de journal doivent être utilisés au format pour générer le CSN 000006:000000000000626.

Modifiez Replicat et cliquez sur Démarrer pour démarrer. Image illustrant la modification de la réplication

Statut de réplication En cours d'exécution.

Image montrant le statut de la réplication

Remarque : si vous avez utilisé la méthode 1 pour ajouter le processus Extract, comme indiqué dans la tâche 7, la modification du processus Replicat n'est pas nécessaire. Dans ce point de contact, nous avons utilisé la méthode 2 pour ajouter une extraction. Les deux méthodes fonctionnent bien.

Tâche 10 : exécuter des tests LMD

Testez la réplication en effectuant une activité LMD sur la source.

Accusés de réception

Ressources de formation supplémentaires

Explorez d'autres ateliers sur le site docs.oracle.com/learn ou accédez à d'autres contenus d'apprentissage gratuits sur le canal Oracle Learning YouTube. En outre, visitez le site education.oracle.com/learning-explorer pour devenir un explorateur Oracle Learning.

Pour obtenir de la documentation sur le produit, consultez Oracle Help Center.