Nota

Eseguire la migrazione di MySQL Database in locale all'istanza gestita Oracle HeatWave MySQL utilizzando OCI GoldenGate

Introduzione

Oracle Cloud Infrastructure GoldenGate (OCI GoldenGate) è un servizio completamente gestito che aiuta i data engineer a spostare i dati in tempo reale, su larga scala, da uno o più sistemi di gestione dei dati ai database OCI. Progetta, esegui, orchestra e monitora i task di replica dei dati in un'unica interfaccia senza dover allocare o gestire ambienti di computazione. OCI GoldenGate supporta diverse origini e destinazioni, tra cui il servizio di database MySQL e Oracle HeatWave MySQL.

In questa esercitazione viene illustrato come eseguire la migrazione del database MySQL in locale all'istanza gestita di Oracle HeatWave MySQL utilizzando OCI GoldenGate.

Obiettivi

Prerequisiti

Limiti

Task 1: Crea istanze MySQL di origine e destinazione

Task 2: Test delle connessioni tra istanze Bastion, On-Premises e Oracle Heatwave MySQL

  1. Installare il client MySQL e la utility Shell MySQL nell'host Bastion OCI.

  2. Eseguire il test della connessione da OCI Bastion all'istanza MySQL in locale di origine.

    [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. Eseguire il test della connessione dall'istanza gestita MySQL on premise di origine all'istanza gestita 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)
    

Task 3: Creare utenti per OCI GoldenGate

Task 4: Imposta parametri obbligatori nel database di origine per OCI GoldenGate

Non è obbligatorio attivare GTID sull'origine se la destinazione è standalone (non HA). Ma se il target è HA, si consiglia vivamente di attivare GTID sull'origine. È obbligatorio attivare la modalità binlog.

  1. Modificare il file /etc/my.cnf e aggiungere le righe seguenti.

    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. Riavviare il server MySQL.

    Systemctl stop mysqld
    Systemctl start mysqld
    Systemctl status mysqld
    

    Per un elenco completo o parametri, controllare le impostazioni e i requisiti del log delle transazioni. Per ulteriori informazioni, vedere Opzione B: utilizzare il bastion personale su OCI Compute.

  3. Eseguire il comando seguente per verificare che i log binari siano abilitati ora.

    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. Eseguire il comando seguente per verificare che la modalità GTID (gtid_mode) sia attiva.

    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
    

Nota: è comune che la prima query mostri valori NULL per GTID. Questo perché in MySQL versions 5.7 il valore GTID viene memorizzato solo nella tabella mysql.gtid_executed.

Task 5: Creare lo schema airportdb (solo metadati) nel database di destinazione

  1. Estrai i metadati dello schema dal database di origine.

    [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. Importare i metadati dello schema nel database di destinazione.

    [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
    

Task 6: Impostare la distribuzione OCI GoldenGate e aggiungere connessioni

Esistono diversi blog e esercitazioni su come impostare le distribuzioni OCI GoldenGate, pertanto in questa sezione verranno illustrati alcuni passi.

  1. Eseguire il login a OCI Console e selezionare GoldenGate Distribuzioni.

  2. Fare clic su Crea distribuzione e immettere le informazioni necessarie come mostrato nell'immagine riportata di seguito.

    Immagine che mostra come creare la distribuzione Golden Gate

  3. Aggiungere i dettagli di connessione di origine e destinazione nella pagina Crea distribuzione.

    Immagine che mostra come creare una connessione Golden Gate per l'origine

    Immagine che mostra come creare una connessione Golden Gate per la destinazione

    Immagine che mostra entrambe le connessioni aggiunte in GG

  4. Assegnare le connessioni alla distribuzione OCI GoldenGate. Fare clic sul nome della connessione, quindi su Assegna distribuzione.

    Immagine che mostra come assegnare la distribuzione a una connessione

    Immagine che mostra la connessione di origine assegnata alla distribuzione

    Immagine che mostra la connessione di destinazione assegnata alla distribuzione

  5. Utilizzando il servizio OCI Bastion, impostare l'inoltro delle porte per la porta 443, quindi eseguire il login alla console OCI GoldenGate.

    Immagine che mostra l'URL della home page goldengate

  6. Convalidare le connessioni al database dalla console OCI GoldenGate.

    1. Fare clic sul menu Hamburger e le due connessioni aggiunte alla distribuzione verranno visualizzate nel task 6.4.

    2. Fare clic su Connetti per convalidare le connessioni. Se le connessioni hanno esito positivo, verrà visualizzata l'opzione per creare la tabella dei checkpoint facendo clic su Checkpoint +.

      Si consiglia di aggiungere le connessioni utilizzando la distribuzione OCI GoldenGate in OCI in quanto aggiungerà automaticamente il DNS agli indirizzi IP, senza questi DNS le connessioni di test non riusciranno.

      Immagine che mostra le connessioni goldengate e le connessioni di test

Task 7: Crea processi Extract e Replicat

  1. Prima di creare il processo Extract, assicurarsi che gtid_mode sia ON nel database di origine, soprattutto se la destinazione è HA.

    Esistono due metodi per aggiungere Extract:

    • Metodo 1: è possibile aggiungere Extract dopo che il caricamento iniziale (istanza di copia o dump) è stato completato e utilizzare un metodo di creazione delle istanze preciso. Per ulteriori informazioni, vedere Creazione di un'istanza precisa per MySQL in MySQL mediante le utility Shell MySQL e Oracle GoldenGate.

      Per aggiungere Extract e avviarlo per eseguire l'acquisizione dei dati da quel particolare GTID o binlog come mostrato nell'immagine seguente. Oracle consiglia di utilizzare questo metodo.

      Immagine che mostra la configurazione dell'estrazione del goldengate

      Nota: qui il set GTID viene preso dal file JSON del comando dumpInstance o dall'output dei comandi copyInstance.

    • Metodo 2: è possibile aggiungere Extract all'inizio prima ancora di avviare il caricamento iniziale dei dati e poi modificare Replicat per iniziare con una particolare posizione gtidexecuted/binlog# e binlog visualizzata nel file JSON del file dumpInstance() o nell'output di copyInstance().

      Utilizzare il parametro HANDLECOLLISION con questo metodo per evitare problemi di dati duplicati.

      Nota: per questo sommario, è stato utilizzato il metodo 2.

      Modificare il file dei parametri di estrazione:

      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.*;
      

      Nota: se si aggiunge DDL INCLUDE MAPPED al file dei parametri Extract, verrà visualizzato un errore che indica che la replica DDL non è supportata per MySQL version 5.7.4.

  2. Avviare il processo Extract.

    Immagine che mostra l'esecuzione dell'estrazione del goldengate

  3. Extract è in esecuzione e genera il file trail, ora crea Replicat.

    1. Creare prima la tabella di checkpoint. Andare alla sezione Configurazione, selezionare il database di destinazione e fare clic su Checkpoint + per creare la tabella di checkpoint.

      Immagine che mostra la creazione della tabella dei checkpoint del goldengate

    2. Crea il processo Replicat. Poiché si tratta di una replica unidirezionale, possiamo utilizzare Replicat parallelo per ottenere prestazioni migliori. Per la replica bidirezionale è supportato solo Replicat classico.

      Non avviare il processo Replicat, ma crearlo. Verrà avviato dopo l'importazione dei dati.

      Immagine che mostra la creazione della replica del goldengate

    3. Modificare il file dei parametri. È inoltre possibile aggiungere parametri PARALLEL oppure verrà utilizzato il parallelismo predefinito.

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

Task 8: Copia dati da origine a destinazione mediante copyInstance()

  1. Eseguire una lavorazione a secco utilizzando l'opzione dryRun:"true" di 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. Se non si verificano errori, rimuovere l'opzione dryRun ed eseguire di nuovo il caricamento dei dati. L'output finale dovrebbe essere il seguente: Nessun errore segnalato.

    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
    

Nota: prendere nota del GTID eseguito mostrato nell'output di copyInstance() e utilizzarlo per modificare il Replicat.

Task 9: Modifica Replicat e Start

Utilizzare il numero di file di log che è 000006 e il numero di posizione di log che è 626 come mostrato nell'output di copyInstance() nel task 8. Questo file di log e questa posizione di log devono essere utilizzati nel formato per generare CSN 000006:000000000000626.

Modificare Replicat e fare clic su Avvia per iniziare. Immagine che mostra come modificare il replicato

Stato Replicat visualizzato come In esecuzione.

Immagine che mostra lo stato della replica

Nota: se è stato utilizzato il metodo 1 per aggiungere Extract come mostrato nel task 7, la modifica di Replicat non sarà necessaria. In questo POC, è stato utilizzato il metodo 2 per aggiungere Extract. Entrambi i metodi funzionano bene.

Task 10: Esegui test DML

Eseguire il test della replica eseguendo l'attività DML sull'origine.

Conferme

Altre risorse di apprendimento

Esplora altri laboratori su docs.oracle.com/learn o accedi a più contenuti di formazione gratuiti sul canale YouTube di Oracle Learning. Inoltre, visitare education.oracle.com/learning-explorer per diventare Oracle Learning Explorer.

Per la documentazione del prodotto, visitare Oracle Help Center.