Remarques :
- Ce tutoriel nécessite l'accès à Oracle Cloud. Pour vous inscrire à un compte gratuit, reportez-vous à Introduction à Oracle Cloud Infrastructure Free Tier.
- Il utilise des exemples de valeur pour les informations d'identification, la location et les compartiments Oracle Cloud Infrastructure. Lorsque vous terminez votre atelier, remplacez ces valeurs par celles propres à votre environnement cloud.
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
- Migrez votre base de données MySQL sur site vers une instance gérée Oracle HeatWave MySQL sur OCI à l'aide d'OCI GoldenGate.
Prérequis
-
La base de données MySQL source est sur site et l'instance gérée Oracle Heatwave MySQL cible et l'hôte OCI Bastion sont en place.
-
Comme il s'agit d'une réplication unidirectionnelle, la cible peut être sur une version supérieure à la source. En cas de réplication bidirectionnelle, il est recommandé que la source et la cible soient sur la même version.
-
log_bin
(binlog) doit être activé sur la source. -
Le paramètre d'instance
binlog_expire_logs_second
sur les instances source et cible doit être défini sur au moins 72 heures. -
Le paramètre d'instance
binlog_row_metadata
sur les instances source et cible doit être défini sur Full pour permettre la réplication LDD (Langage de définition de données).Remarque : dans ce tutoriel, la source exécute MySQL version
5.7.44
, où le paramètrebinlog_row_metadata
n'est pas pris en charge. Par conséquent, la réplication DDL n'est pas prise en charge. -
Le mode d'identificateur de transaction global (GTID) doit se trouver sur la source si l'instance Oracle Heatwave MySQL cible dispose d'une haute disponibilité (HA), sinon il est facultatif.
-
Consulter les types de données pris en charge. Pour plus d'informations, reportez-vous à MySQL : types de données, objets et opérations pris en charge.
-
Passez en revue les limites de la réplication LDD. Pour plus d'informations, reportez-vous à Utilisation de la réplication DDL.
-
L'instance cible doit être créée à l'avance à partir de la source à l'aide de l'une des méthodes suivantes :
- Méthode 1 : utilisation d'utilitaires shell MySQL tels que
util.dumpInstance
etutil.loadDump
. - Méthode 2 : utilisation d'utilitaires shell MySQL tels que
util.copyInstance
. - Méthode 3 : utilisation d'OCI GoldenGate pour l'extraction et la réplication initiales afin d'effectuer le chargement de données initial.
Remarque : dans ce tutoriel, nous allons utiliser
util.copyInstance
pour le chargement initial. - Méthode 1 : utilisation d'utilitaires shell MySQL tels que
-
Hôte OCI Bastion avec client MySQL et utilitaire Shell MySQL installés dans OCI.
-
FastConnect/IPSec/VPN, règles entrantes et listes de sécurité mises à jour pour permettre la communication entre la source sur site, la cible Oracle Heatwave MySQL, le bastion et OCI GoldenGate.
Restrictions
-
Incrémentation automatique des problèmes de colonne.
-
Si une table comporte une colonne et qu'il ne s'agit pas d'une clé primaire ou d'une clé unique, la mise en correspondance échoue car la combinaison de toutes les colonnes de cette table est identique sur la source et la cible.
-
Types de données, restrictions LDD et autres fonctionnalités.
-
Lors de l'utilisation de la réplication Active-Active, les fuseaux horaires doivent être identiques sur les deux systèmes afin que la résolution et la détection des conflits basées sur l'horodatage puissent fonctionner.
Tâche 1 : créer des instances MySQL source et cible
-
Source:
-On-premise Hostname: MySQLCI57 OEL 7.9 MySQL version 5.7.44 Intel Hardware Standard.Flex3 with 4 CPUs and 32GB Dedicated VM
-
Cible:
-OCI Oracle Heatwave MySQL Managed Instance Hostname: MySQLGG1 with HA and no heatwave (4CPU and 32GB) OEL 8 with latest build MySQL version: 8.4.4 Private subnet
-
Hôte OCI Bastion :
-OCI Hostname: Bastion OEL 8 with Intel hardware Standard.Flex3 with 4CPUs and 32GB
Tâche 2 : test des connexions entre les instances Bastion, On-Premise et Oracle Heatwave MySQL
-
Installez le client MySQL et l'utilitaire shell MySQL sur l'hôte OCI Bastion.
-
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)
-
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
-
Source:
create user 'ggsuser_S'@'%' identified by "<password>"; grant all privileges on airportdb.* to 'ggsuser_S'@'%' with grant option; Grant select, process, replication slave, reload, replication client on *.* to 'ggsuser_S'@'%';
-
Cible:
create user 'ggsuser_T'@'%' identified by "<password>"; grant all privileges on airportdb.* to 'ggsuser_T'@'%' with grant option; Grant select, process, replication slave, replication client on *.* to 'ggsuser_T'@'%'; Create database ggadmin; -- you create this db on target side to store the checkpoint table. grant all privileges on ggadmin.* to 'ggsuser_T'@'%' with grant option;
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
.
-
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
-
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.
-
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)
-
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 tablemysql.gtid_executed
.
Tâche 5 : créer le schéma airportdb
(métadonnées uniquement) dans la base de données cible
-
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.
-
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.
-
Connectez-vous à la console OCI et sélectionnez GoldenGate Deployments.
-
Cliquez sur Créer un déploiement et entrez les informations requises, comme indiqué dans l'image suivante.
-
Ajoutez les détails de connexion source et cible sur la page Créer un déploiement.
-
Affectez les connexions au déploiement OCI GoldenGate. Cliquez sur le nom de la connexion, puis sur Affecter un déploiement.
-
A l'aide du service OCI Bastion, configurez le transfert de port vers le port
443
, puis connectez-vous à la console OCI GoldenGate. -
Validez les connexions de base de données à partir de la console OCI GoldenGate.
-
Cliquez sur le menu Hamburger pour voir les deux connexions ajoutées au déploiement dans la tâche 6.4.
-
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.
-
Tâche 7 : Créer des processus d'extraction et de réplication
-
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.
Remarque : ici, l'ensemble GTID est extrait du fichier JSON de la commande
dumpInstance
ou de la sortie des commandescopyInstance
. -
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 dedumpInstance()
ou dans la sortie decopyInstance()
.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 MySQLversion 5.7.4
.
-
-
Démarrez le processus d'extraction.
-
Le processus Extract est en cours d'exécution et génère le fichier trace. Créez maintenant le processus Replicat.
-
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.
-
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.
-
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()
-
Exécutez une simulation à l'aide de l'option
dryRun:"true"
decopyInstance()
.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):
-
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.
Statut de réplication En cours d'exécution.
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.
-
Source:
mysql> select count(*) from passenger; +----------+ | count(*) | +----------+ | 36095 | +----------+ 1 row in set (0.01 sec) mysql> insert into passenger (passportno,firstname,lastname) values ('Pd89UKL','Timothy','London'); Query OK, 1 row affected (0.00 sec) mysql> commit -> ; Query OK, 0 rows affected (0.00 sec) mysql> select count(*) from passenger; +----------+ | count(*) | +----------+ | 36096 | +----------+ 1 row in set (0.00 sec) mysql> select @@version; +------------+ | @@version | +------------+ | 5.7.44-log | +------------+ 1 row in set (0.00 sec)
-
Cible:
[root@bastion opc]# mysql --host <target IP> -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 1249 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> use airportdb; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> select count(*) from passenger; +----------+ | count(*) | +----------+ | 36096 | +----------+ 1 row in set (0.00 sec) mysql> select @@version -> ; +----------------+ | @@version | +----------------+ | 8.4.4-u5-cloud | +----------------+ 1 row in set (0.00 sec)
Liens connexes
-
Connexion à Oracle Cloud Infrastructure GoldenGate à l'aide d'une adresse IP privée
-
MySQL : prérequis pour la configuration LDD basée sur le journal des transactions
-
Charger des données du fichier vers le processus Replicat dans l'architecture des microservices
-
MySQL : types de données, objets et opérations pris en charge pour OCI GoldenGate
Accusés de réception
- Auteur - Chakradhar Jagganagari (Expert en implémentation de l'ascenseur - Base de données)
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.
Migrate On-Premises MySQL Database to Oracle HeatWave MySQL Managed Instance using OCI GoldenGate
G34891-01
Copyright ©2025, Oracle and/or its affiliates.