Condividi tramite


Eseguire la migrazione di MySQL in locale a Database di Azure per MySQL: Migrazione dei dati

SI APPLICA A:Database di Azure per MySQL - Server singolo Database di Azure per MySQL - Server flessibile

Prerequisiti

Baseline delle prestazioni

Eseguire il backup del database

Come passaggio prudente prima dell'aggiornamento o della migrazione dei dati, esportare il database prima dell'aggiornamento usando MySQL Workbench o manualmente tramite il mysqldump comando .

Offline e online

Prima di selezionare uno strumento di migrazione, deve essere determinato se la migrazione deve essere online o offline.

  • Le migrazioni offline causano l'arresto del sistema durante l'esecuzione della migrazione. Questa opzione garantisce che non si verifichino transazioni e che lo stato dei dati sia esattamente quello previsto quando viene ripristinato in Azure.

  • Le migrazioni online esegue la migrazione dei dati quasi in tempo reale. Questa opzione è appropriata quando si verificano tempi di inattività ridotti per gli utenti o le applicazioni che usano il carico di lavoro dei dati. Il processo prevede la replica dei dati usando un metodo di replica, binlog ad esempio o simile.

Per la seconda guerra mondiale, l'ambiente ha alcuni requisiti di rete e sicurezza complessi che non consentono l'applicazione delle modifiche appropriate per la connettività in ingresso e in uscita nell'intervallo di tempo di migrazione di destinazione. Queste complessità e requisiti eliminano essenzialmente l'approccio online dalla considerazione.

Nota

Per altre informazioni sulla migrazione offline e online, vedere le sezioni Pianificazione e valutazione.

Deriva dei dati

Le strategie di migrazione offline hanno il potenziale per la deriva dei dati. La deriva dei dati si verifica quando i dati di origine appena modificati non vengono sincronizzati con i dati migrati. In questo caso, è necessaria un'esportazione completa o un'esportazione differenziale. È possibile attenuare questo problema arrestando tutto il traffico verso il database e quindi eseguendo l'esportazione. Se non è possibile arrestare tutto il traffico di modifica dei dati, è necessario tenere conto della deriva.

Determinare le modifiche può diventare complicato se le tabelle di database non hanno colonne come chiavi primarie basate su numeriche o un tipo di modifica e di creazione della data in ogni tabella di cui è necessario eseguire la migrazione.

Ad esempio, se è presente una chiave primaria basata su numeriche e la migrazione viene importata nell'ordinamento, è relativamente semplice determinare dove l'importazione è stata arrestata e riavviarla da tale posizione. Se non è presente alcuna chiave numerica, potrebbe essere possibile utilizzare la modifica e la creazione della data e di nuovo importare in modo ordinato in modo da poter riavviare la migrazione dall'ultima data visualizzata nella destinazione.

Consigli sulle prestazioni

Esportazione

  • Usare uno strumento di esportazione che può essere eseguito in modalità multithread, ad esempio mydumper

  • Quando si usa MySQL 8.0, usare le tabelle partizionate quando appropriato per aumentare la velocità delle esportazioni.

Import

  • Creare indici cluster e chiavi primarie dopo il caricamento dei dati. Caricare i dati in ordine di chiave primaria o altro se la chiave primaria è una colonna data (ad esempio, modificare la data o crearne una) in ordine ordinato.

  • Ritardare la creazione di indici secondari fino al caricamento dei dati. Creare tutti gli indici secondari dopo il caricamento.

  • Disabilitare i vincoli di chiave esterna prima del caricamento. La disabilitazione dei controlli della chiave esterna offre miglioramenti significativi delle prestazioni. Abilitare i vincoli e verificare i dati dopo il caricamento per garantire l'integrità referenziale.

  • Caricare i dati in parallelo. Evitare un eccessivo parallelismo che potrebbe causare conflitti di risorse e monitorare le risorse usando le metriche disponibili nel portale di Azure.

Eseguire la migrazione

  • Eseguire il backup del database

  • Creare e verificare la zona di destinazione di Azure

  • Configurare i parametri del server di origine

  • Configurare i parametri del server di destinazione

  • Esportare gli oggetti di database (schema, utenti e così via)

  • Esportare i dati

  • Importare gli oggetti di database

  • Importare i dati

  • Convalida

  • Reimpostare i parametri del server di destinazione

  • Eseguire la migrazione delle applicazioni

Passaggi comuni

Nonostante il percorso eseguito, è necessario eseguire i passaggi comuni:

  • Eseguire l'aggiornamento a una versione di Azure MySQL supportata

  • Oggetti di database di inventario

  • Esportare utenti e autorizzazioni

Eseguire la migrazione alla versione più recente di MySQL

Poiché il database wwi conference è in esecuzione 5.5, è necessario eseguire un aggiornamento. Il CIO ha chiesto di eseguire l'aggiornamento alla versione più recente di MySQL (attualmente 8.0).

Esistono due modi per eseguire l'aggiornamento alla versione 8.0:

  • Sul posto

  • Esportazione/Importazione

Quando si decide di eseguire un aggiornamento, è importante eseguire lo strumento di controllo dell'aggiornamento per determinare se sono presenti conflitti. Ad esempio, quando si esegue l'aggiornamento a MySQL Server 8.0, lo strumento verifica i conflitti seguenti:

  • Nomi di oggetti di database in conflitto con parole riservate in MySQL 8.0

  • Utilizzo del set di caratteri utf8mb3

  • Utilizzo degli attributi del tipo di lunghezza ZEROFILL/display

  • Nomi di tabella in conflitto con le tabelle nella versione 8.0

  • Utilizzo del tipo temporale

  • Nomi di vincoli di chiave esterna più lunghi di 64 caratteri

Se il controllo dell'aggiornamento non segnala problemi, è possibile eseguire un aggiornamento sul posto sostituendo i file binari MySQL. I database con problemi devono essere esportati e i problemi risolti.

Scenario WWI

Dopo aver eseguito correttamente la migrazione dell'istanza di MySQL alla versione 8.0, il team di migrazione wwi ha realizzato il percorso di migrazione Servizio Migrazione del database (DMS) originale non può più essere usato come strumento servizio Migrazione del database attualmente supporta solo 5.6 e 5.7. Servizio Migrazione del database richiede l'accesso alla rete. Il team di migrazione wwi non era pronto a gestire i problemi di rete complessi. Questi problemi ambientali hanno limitato la scelta dello strumento di migrazione a MySQL Workbench.

Oggetti di database

Come descritto nella sezione Piani di test, è necessario eseguire un inventario degli oggetti di database prima e dopo la migrazione per assicurarsi di aver eseguito la migrazione di tutti gli elementi.

Se si vuole eseguire una stored procedure per generare queste informazioni, è possibile usare un codice simile al seguente:

DELIMITER //
CREATE PROCEDURE `Migration_PerformInventory`(IN schemaName CHAR(64))
BEGIN

        DECLARE finished INTEGER DEFAULT 0;
          DECLARE tableName varchar(100) DEFAULT "";

        #get all tables
            DECLARE curTableNames
                CURSOR FOR
                    SELECT TABLE_NAME FROM information_schema.tables where TABL
E_SCHEMA = schemaName;

            -- declare NOT FOUND handler
            DECLARE CONTINUE HANDLER
                FOR NOT FOUND SET finished = 1;

            DROP TABLE IF EXISTS MIG_INVENTORY;

                CREATE TABLE MIG_INVENTORY
                (
                      REPORT_TYPE VARCHAR(1000),
                      OBJECT_NAME VARCHAR(1000),
                  PARENT_OBJECT_NAME VARCHAR (1000),
                      OBJECT_TYPE VARCHAR(1000),
                      COUNT INT
                )
                ROW_FORMAT=DYNAMIC,
                ENGINE='InnoDB';
              INSERT INTO MIG_INVENTORY (REPORT_TYPE,OBJECT_NAME, OBJECT_TYPE, COUNT)
                SELECT
                     'OBJECTCOUNT', 'TABLES', 'TABLES', COUNT(*)
              FROM
                     information_schema.tables
                where
                     TABLE_SCHEMA = schemaName;
                #### Constraints
              INSERT INTO MIG_INVENTORY (REPORT_TYPE,OBJECT_NAME, OBJECT_TYPE, COUNT)
                SELECT
                      'OBJECTCOUNT', 'STATISTICS', 'STATISTICS', COUNT(*)
                FROM
                      information_schema.STATISTICS
                WHERE
                      TABLE_SCHEMA = schemaName;
                INSERT INTO MIG_INVENTORY (REPORT_TYPE,OBJECT_NAME, OBJECT_TYPE, COUNT)
                SELECT
                      'OBJECTCOUNT', 'VIEWS', 'VIEWS', COUNT(*)
                FROM
                      information_schema.VIEWS
                WHERE
                      ROUTINE_TYPE = 'FUNCTION' and
                      ROUTINE_SCHEMA = schemaName;

                INSERT INTO MIG_INVENTORY (REPORT_TYPE,OBJECT_NAME, OBJECT_TYPE, COUNT)
                SELECT
                      'OBJECTCOUNT', 'PROCEDURES', 'PROCEDURES', COUNT(*)
                FROM
                      information_schema.ROUTINES
                WHERE
                      ROUTINE_TYPE = 'PROCEDURE' and
                      ROUTINE_SCHEMA = schemaName;

                INSERT INTO MIG_INVENTORY (REPORT_TYPE,OBJECT_NAME, OBJECT_TYPE, COUNT)
                SELECT
                       'OBJECTCOUNT', 'EVENTS', 'EVENTS', COUNT(*)
                FROM
                       information_schema.EVENTS
                WHERE
                       EVENT_SCHEMA = schemaName;

                INSERT INTO MIG_INVENTORY (REPORT_TYPE,OBJECT_NAME, OBJECT_TYPE, COUNT)
                SELECT
                       'OBJECTCOUNT', 'USER DEFINED FUNCTIONS', 'USER DEFINED FUNCTIONS'
        , COUNT(*)
                FROM
                        mysql.func;

                INSERT INTO MIG_INVENTORY (REPORT_TYPE,OBJECT_NAME, OBJECT_TYPE, COUNT)
                SELECT
                        'OBJECTCOUNT', 'USERS', 'USERS', COUNT(*)
                FROM
                        mysql.user
                WHERE
                        user <> '' order by user;

                OPEN curTableNames;

                getTableName: LOOP
                        FETCH curTableNames INTO tableName;
                        IF finished = 1 THEN
                              LEAVE getTableName;
                        END IF;

                   SET @s = CONCAT('SELECT COUNT(*) into @TableCount FROM ', schemaName,
'.', tableName);
        #SELECT @s;
            PREPARE stmt FROM @s;
        EXECUTE stmt;
        INSERT INTO MIG_INVENTORY (REPORT_TYPE,OBJECT_NAME, OBJECT_TYPE, COUNT)

                SELECT
                    'TABLECOUNT', tableName, 'TABLECOUNT', @TableCount;
        DEALLOCATE PREPARE stmt;

     END LOOP getTableName;
     CLOSE curTableNames;

   SELECT * FROM MIG_INVENTORY;
END //

DELIMITER ;

CALL Migration_PerformInventory('reg_app');
  • La chiamata a questa procedura nel database di origine rivela quanto segue (output troncato):

Screenshot dell'output troncato.

  • Il risultato della routine del database di destinazione dovrebbe essere simile all'immagine seguente dopo aver completato la migrazione. Si noti che nel database non sono presenti funzioni. Le funzioni sono state eliminate prima della migrazione.

Screenshot di Funzioni di database.

Utenti e autorizzazioni

Una migrazione corretta richiede la migrazione di utenti e autorizzazioni associati all'ambiente di destinazione.

Esportare tutti gli utenti e le relative concessioni usando lo script di PowerShell seguente:

$username = "yourusername";
$password = "yourpassword";
mysql -u$username -p$password --skip-column-names -A -e"SELECT CONCAT('SHOW G
RANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user<>''" > Show
Grants.sql;

$lines = get-content "ShowGrants.sql"

foreach ($line in $lines)
{
mysql -u$username -p$password --skip-column-names -A -e"$line" >> AllGrants.sql
}
  • Creare un nuovo script di PowerShell usando PowerShell ISE (vedere il documento di installazione)

  • Impostare il nome utente su root e la password sulla password dell'utente radice

È quindi possibile eseguire lo AllGrants.sql script destinato al nuovo Database di Azure per MySQL:

$username = "yourusername";
$password = "yourpassword";
$server = "serverDNSname";
$lines = get-content "AllGrants.sql"

foreach ($line in $lines)
{
mysql -u$username -p$password -h$server --ssl-ca=c:\temp\BaltimoreCyberTrus
tRoot.crt.cer --skip-column-names -A -e"$line"
}

È anche possibile creare utenti in Database di Azure per MySQL usando PowerShell: /en-us/azure/mysql/howto-create-users

Eseguire la migrazione

Con i componenti di migrazione di base, è ora possibile procedere con la migrazione dei dati. In precedenza erano stati introdotti diversi strumenti e metodi. Per WWI, utilizzeranno il percorso di MySQL Workbench per esportare i dati e quindi importarli in Database di Azure per MySQL.

Elenco di controllo per la migrazione dei dati

  • Comprendere la complessità dell'ambiente e se un approccio online è fattibile.

  • Tenere conto della deriva dei dati. L'arresto del servizio di database può eliminare potenziali deviazioni dei dati.

  • Configurare i parametri di origine per l'esportazione rapida.

  • Configurare i parametri di destinazione per l'importazione rapida.

  • Testare tutte le migrazioni con una versione di origine diversa rispetto alla destinazione.

  • Eseguire la migrazione di oggetti non basati su dati, ad esempio nomi utente e privilegi.

  • Assicurarsi che tutte le attività siano documentate e controllate durante l'esecuzione della migrazione.

Passaggio successivo