Note :
- Ce tutoriel nécessite l'accès à Oracle Cloud. Pour vous inscrire à un compte gratuit, voir Démarrer avec le niveau gratuit d'Oracle Cloud Infrastructure.
- Il utilise des exemples de valeurs pour les données d'identification, la location et les compartiments d'Oracle Cloud Infrastructure. À la fin de votre laboratoire, remplacez ces valeurs par celles qui sont propres à votre environnement en nuage.
Migrer MySQL Database sur place vers une instance gérée par Oracle HeatWave MySQL à l'aide d'OCI GoldenGate
Présentation
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 plusieurs systèmes de gestion de données vers des bases de données OCI. Concevez, exécutez, orchestrez et surveillez des tâches de réplication de données sans avoir à allouer ni à 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 guiderons vers la migration d'une base de données MySQL sur place vers une instance gérée par Oracle HeatWave MySQL à l'aide d'OCI GoldenGate.
Objectifs
- Migrez la base de données MySQL sur place vers l'instance gérée par Oracle HeatWave MySQL sur OCI à l'aide d'OCI GoldenGate.
Préalables
-
La base de données source MySQL est sur place et l'instance gérée Oracle Heatwave MySQL cible et l'hôte bastion OCI 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 réglé à au moins 72 heures. -
Le paramètre d'instance
binlog_row_metadata
sur les instances source et cible doit être réglé à Complet pour permettre la réplication LDD (Langage de définition de données).Note : 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 LDD n'est pas prise en charge. -
Le mode de l'identificateur de transaction global (GTID) doit être sur la source si l'instance Oracle Heatwave MySQL cible a une haute disponibilité, sinon il est facultatif.
-
Réviser les types de données pris en charge. Pour plus d'informations, voir MySQL : Types de données, objets et opérations pris en charge.
-
Vérifiez les limitations de la réplication LDD. Pour plus d'informations, voir Utilisation de la réplication LDD.
-
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 des utilitaires d'interpréteur de commandes MySQL tels que
util.dumpInstance
etutil.loadDump
. - Méthode 2 : Utilisation des utilitaires d'interpréteur de commandes 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.
Note : Dans ce tutoriel, nous utiliserons
util.copyInstance
pour le chargement initial. - Méthode 1 : Utilisation des utilitaires d'interpréteur de commandes MySQL tels que
-
Hôte bastion OCI avec le client MySQL et l'utilitaire d'interpréteur de commandes MySQL installés dans OCI.
-
FastConnect/IPSec/RPV, règles de trafic entrant et listes de sécurité mises à jour pour permettre la communication entre la source sur place, le réseau Heatwave Oracle cible MySQL, l'hôte bastion et OCI GoldenGate.
Limitations
-
Problèmes d'incrémentation automatique des colonnes.
-
Si une table comporte une colonne qui n'est pas une clé primaire ou une clé unique, le mappage échoue car la combinaison de toutes les colonnes de cette table est la même pour la source et la cible.
-
Types de données, LDD et autres limitations de fonction.
-
Lors de l'utilisation de la réplication active-active, les fuseaux horaires doivent être les mêmes sur les deux systèmes afin que la résolution et la détection des conflits basées sur un horodatage puissent fonctionner.
Tâche 1 : Créer des instances MySQL sources et cibles
-
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 bastion OCI :
-OCI Hostname: Bastion OEL 8 with Intel hardware Standard.Flex3 with 4CPUs and 32GB
Tâche 2 : Tester les connexions entre les instances MySQL d'hôte bastion, sur place et Oracle Heatwave
-
Installez le client MySQL et l'utilitaire d'interpréteur de commandes MySQL sur l'hôte bastion OCI.
-
Tester la connexion de l'hôte bastion OCI à l'instance MySQL sur place 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)
-
Tester la connexion de l'instance sur place MySQL 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éer des 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éfinir les 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 (et non HA). Mais si la cible est HA, il est fortement recommandé d'activer le 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 exigences du journal des transactions. Pour plus d'informations, voir Option B : Utiliser votre propre hôte bastion sur le service de calcul pour OCI.
-
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
Note : Il est courant que la première interrogation affiche des valeurs NULL pour 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
-
Extraire les métadonnées du 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 de données 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 : Configurer le déploiement OCI GoldenGate et ajouter des connexions
Il existe plusieurs blogues et tutoriels sur la configuration des déploiements OCI GoldenGate. Voici quelques étapes à suivre.
-
Connectez-vous à la console OCI et sélectionnez Déploiements GoldenGate.
-
Cliquez sur Créer un déploiement et entrez les informations requises, comme illustré dans l'image suivante.
-
Ajoutez les détails de connexion source et cible dans 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.
-
À l'aide du service d'hôte bastion OCI, configurez le transfert de port vers le port
443
, puis connectez-vous à la console OCI GoldenGate. -
Validez les connexions à la base de données à partir de la console OCI GoldenGate.
-
Cliquez sur le menu hamburger et vous verrez les deux connexions ajoutées au déploiement dans la tâche 6.4.
-
Cliquez sur Connexion pour valider les connexions. Si les connexions sont réussies, vous verrez l'option permettant de créer une table de points de vérification en cliquant sur Point de vérification +.
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
est ON dans la base de données source, en particulier si la cible est haute disponibilité.Il existe deux méthodes pour ajouter une extraction :
-
Méthode 1 : Vous pouvez ajouter une extraction une fois le chargement initial (copie ou instance de vidage) terminé et utiliser une méthode d'instanciation précise. Pour plus d'informations, voir Instanciation précise entre MySQL et MySQL à l'aide des utilitaires d'interpréteur de commandes MySQL et d'Oracle GoldenGate.
Pour ajouter l'extraction et la démarrer pour effectuer la saisie de données à partir de ce GTID ou fichier binaire particulier, comme illustré dans l'image suivante. Oracle recommande d'utiliser cette méthode.
Note : Ici, le jeu GTID est extrait du fichier JSON des commandes
dumpInstance
ou de la sortie des commandescopyInstance
. -
Méthode 2 : Vous pouvez ajouter le processus d'extraction au tout début avant même de commencer le chargement initial des données, puis modifier ultérieurement le processus de réplication pour qu'il commence par une position
gtidexecuted/binlog#
et binlog particulière affichées dans le fichier JSON du fichierdumpInstance()
ou de la sortie decopyInstance()
.Utilisez le paramètre
HANDLECOLLISION
avec cette méthode pour éviter tout problème de données en double.Note : Pour cette démonstration de faisabilité, 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.*;
Note : Si vous ajoutez
DDL INCLUDE MAPPED
au fichier de paramètres d'extraction, vous obtiendrez un message d'erreur indiquant que la réplication LDD n'est pas prise en charge pour MySQLversion 5.7.4
.
-
-
Démarrez le processus Extract.
-
L'extraction est en cours d'exécution et génère le fichier trace. Créez maintenant le processus de réplication.
-
Créez d'abord une table de points de reprise. Allez à la section Configuration, sélectionnez la base de données cible et cliquez sur Point de vérification + pour créer une table de points de vérification.
-
création du traitement de réplication; Comme il s'agit d'une réplication unidirectionnelle, nous pouvons utiliser le processus Replicat parallèle pour de meilleures performances. Pour la réplication bidirectionnelle, seule la réplication classique est prise en charge.
Ne démarrez pas le processus Replicat, créez-le simplement. Nous le lancerons 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 les données de la source vers la cible à l'aide de copyInstance()
-
Effectuez une exécution à sec à 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):
-
S'il n'y a aucune erreur, supprimez l'option
dryRun
et réexécutez 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
Note : Notez le GTID exécuté affiché dans la sortie de
copyInstance()
et utilisez-le pour modifier le processus de réplication.
Tâche 9 : Modifier le processus de réplication et démarrer
Utilisez le numéro de fichier journal 000006
et le numéro de position de 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 dans le format pour générer le numéro CSN 000006:000000000000626
.
Modifiez le processus de réplication et cliquez sur Démarrer pour commencer.
Le statut de réplication est En cours d'exécution.
Note : Si vous avez utilisé la méthode 1 pour ajouter l'extraction, comme indiqué dans la tâche 7, la modification du processus de réplication n'est pas nécessaire. Dans cette démonstration de faisabilité, nous avons utilisé la méthode 2 pour ajouter l'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
-
Se connecter à GoldenGate pour Oracle Cloud Infrastructure à l'aide d'une adresse IP privée
-
MySQL : Préalables pour la configuration LDD basée sur un journal de transactions
-
MySQL : Types de données, objets et opérations pris en charge pour OCI GoldenGate
Remerciements
- Auteur - Chakradhar Jagganagari (Expert en mise en oeuvre d'ascenseur - Base de données)
Autres ressources d'apprentissage
Explorez d'autres laboratoires sur le site docs.oracle.com/learn ou accédez à plus de contenu d'apprentissage gratuit sur le canal Oracle Learning YouTube. De plus, visitez education.oracle.com/learning-explorer pour devenir un explorateur Oracle Learning.
Pour obtenir la documentation sur le produit, visitez Oracle Help Center.
Migrate On-Premises MySQL Database to Oracle HeatWave MySQL Managed Instance using OCI GoldenGate
G34890-01
Copyright ©2025, Oracle and/or its affiliates.