Partilhar via


Migrar o MySQL local para o Banco de Dados do Azure para MySQL: Migração de Dados

A migração de dados é um aspeto fundamental da transição de bancos de dados MySQL de ambientes locais para bancos de dados do Azure para MySQL. Este artigo aprofunda as complexidades da migração de dados, oferecendo um guia abrangente sobre as várias técnicas e práticas recomendadas para garantir uma transferência de dados perfeita. Você pode planejar e executar sua estratégia de migração com eficiência, compreendendo os diferentes métodos de migração de dados, como migração lógica e física, e abordando possíveis desafios, como integridade de dados e tempo de inatividade. Este guia fornece o conhecimento necessário para lidar com grandes conjuntos de dados, minimizar interrupções e usar os recursos robustos do Azure para otimizar o desempenho e a confiabilidade do banco de dados. Seja com o objetivo de modernizar sua infraestrutura ou aprimorar seus recursos de gerenciamento de dados, este artigo fornecerá os insights necessários para uma migração de dados bem-sucedida.

Pré-requisitos

Migrar o MySQL local para o Banco de Dados do Azure para MySQL: linhas de base de desempenho

Fazer backup do banco de dados

Como uma etapa prudente antes de atualizar ou migrar dados, exporte o banco de dados antes da atualização usando o MySQL Workbench ou manualmente através do mysqldump comando.

Offline vs. online

Antes de selecionar uma ferramenta de migração, deve ser determinado se a migração deve ser online ou offline.

  • As migrações offline fazem com que o sistema fique inativo enquanto a migração ocorre. Essa opção garante que nenhuma transação esteja ocorrendo e que o estado dos dados seja exatamente o esperado quando restaurado no Azure.

  • As migrações online migram os dados quase em tempo real. Essa opção é apropriada quando há pouco tempo de inatividade para os usuários ou aplicativos que consomem a carga de trabalho de dados. O processo envolve a replicação dos dados usando um método de replicação como binlog ou similar.

Para a Primeira Guerra Mundial, seu ambiente tem alguns requisitos complexos de rede e segurança que não permitem que as alterações apropriadas sejam aplicadas à conectividade de entrada e saída no período de migração de destino. Essas complexidades e requisitos essencialmente eliminam a abordagem on-line da consideração.

Nota

Consulte as seções Planejamento e Avaliação para obter mais detalhes sobre a migração Offline vs Online.

Desvio de dados

As estratégias de migração offline têm potencial para desvio de dados. O desvio de dados ocorre quando os dados de origem recém-modificados ficam fora de sincronia com os dados migrados. Quando isso acontece, é necessária uma exportação completa ou uma exportação delta. Você pode atenuar esse problema interrompendo todo o tráfego para o banco de dados e, em seguida, executando sua exportação. Se não for possível parar todo o tráfego de modificação de dados, você precisa levar em conta o desvio.

Determinar as alterações pode se tornar complicado se as tabelas do banco de dados não tiverem colunas, como chaves primárias baseadas em números, ou algum tipo de data de modificação e criação em cada tabela que precisa ser migrada.

Por exemplo, se uma chave primária baseada em números estiver presente e a migração estiver importando em ordem de classificação, é relativamente simples determinar onde a importação parou e reiniciá-la a partir dessa posição. Se nenhuma chave baseada em números estiver presente, poderá ser possível utilizar modificar e criar data e, novamente, importar de maneira ordenada para que você possa reiniciar a migração a partir da última data vista no destino.

Recomendações de desempenho

Exportar

  • Use uma ferramenta de exportação que possa ser executada em um modo multi-threaded, como mydumper

  • Ao usar o MySQL 8.0, use tabelas particionadas quando apropriado para aumentar a velocidade das exportações.

Importar

  • Crie índices clusterizados e chaves primárias depois de carregar dados. Carregue dados em ordem de chave primária, ou outra se chave primária alguma coluna de data (como modificar data ou criar data) em ordem classificada.

  • Atrase a criação de índices secundários até que os dados sejam carregados. Crie todos os índices secundários após o carregamento.

  • Desative as restrições de chave estrangeira antes de carregar. A desativação de verificações de chaves estrangeiras proporciona ganhos de desempenho significativos. Habilite as restrições e verifique os dados após a carga para garantir a integridade referencial.

  • Carregue dados em paralelo. Evite muito paralelismo que poderia causar contenção de recursos e monitore recursos usando as métricas disponíveis no portal do Azure.

Executar a migração

  • Fazer backup do banco de dados

  • Criar e verificar a zona de aterrissagem do Azure

  • Configurar parâmetros do servidor de origem

  • Configurar parâmetros do servidor de destino

  • Exportar os objetos do banco de dados (esquema, usuários, etc.)

  • Exportar os dados

  • Importar os objetos de banco de dados

  • Importar os dados

  • Validação

  • Redefinir parâmetros do servidor de destino

  • Migrar um ou mais aplicativos

Medidas comuns

Apesar do caminho percorrido, existem passos comuns que devem ser realizados:

  • Atualizar para uma versão suportada do Azure MySQL

  • Objetos de banco de dados de inventário

  • Exportar usuários e permissões

Migrar para a versão mais recente do MySQL

Como o banco de dados da Conferência Mundial está executando a versão 5.5, é necessário executar uma atualização. O CIO pediu que eles atualizassem para a versão mais recente do MySQL (atualmente 8.0).

Há duas maneiras de atualizar para a versão 8.0:

  • No local

  • Exportação/Importação

Ao decidir fazer uma atualização, é importante executar a ferramenta de verificação de atualização para determinar se há conflitos. Por exemplo, ao atualizar para o MySQL Server 8.0, a ferramenta verifica os seguintes conflitos:

  • Nomes de objetos de banco de dados que entram em conflito com palavras de reserva no MySQL 8.0

  • Uso do charset utf8mb3

  • Uso dos atributos de tipo de comprimento ZEROFILL/display

  • Nomes de tabelas que entram em conflito com tabelas na versão 8.0

  • Uso do tipo temporal

  • Nomes de restrição de chave estrangeira com mais de 64 caracteres

Se o verificador de atualização não relatar problemas, é seguro fazer uma atualização in-loco substituindo os binários do MySQL. As bases de dados com problemas têm de ser exportadas e as questões abordadas.

Cenário da Primeira Guerra Mundial

Depois de migrar com êxito a instância do MySQL para 8.0, a equipe de migração da Primeira Guerra Mundial percebeu que o caminho de migração original Migrar o MySQL local para o Banco de Dados do Azure para MySQL não poderia mais ser usado, pois a ferramenta DMS atualmente suporta apenas 5.6 e 5.7. DMS necessário acesso à rede. A equipe de migração da Primeira Guerra Mundial não estava pronta para lidar com seus complexos problemas de rede. Esses problemas ambientais restringiram a escolha da ferramenta de migração para o MySQL Workbench.

Objetos da base de dados

Conforme descrito na seção Planos de teste, um inventário de objetos de banco de dados deve ser feito antes e depois da migração para garantir que você tenha migrado tudo.

Se você gostaria de executar um procedimento armazenado para gerar essas informações, você pode usar algo semelhante ao seguinte:

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');
  • Chamar este procedimento no banco de dados de origem revela o seguinte (saída truncada):

Captura de tela da saída truncada.

  • O resultado do procedimento do banco de dados de destino deve ser semelhante à imagem abaixo após a conclusão da migração. Observe que não há funções no banco de dados. As funções foram eliminadas antes da migração.

Screenshot de Funções de BD.

Utilizadores e permissões

Uma migração bem-sucedida requer a migração de usuários associados e permissões para o ambiente de destino.

Exporte todos os usuários e suas concessões usando o seguinte script do PowerShell:

$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
}
  • Criar um novo script do PowerShell usando o ISE do PowerShell (consulte o documento de Instalação)

  • Defina seu nome de usuário para root e sua senha para a senha do usuário root

Em seguida, você pode executar o AllGrants.sql script direcionado ao novo Banco de Dados do Azure para 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"
}

Você também pode criar usuários no Banco de Dados do Azure para MySQL usando o PowerShell: /azure/mysql/howto-create-users

Executar migração

Com os componentes básicos de migração implementados, agora é possível prosseguir com a migração de dados. Foram introduzidas várias ferramentas e métodos anteriormente. Para a Primeira Guerra Mundial, eles utilizarão o caminho do MySQL Workbench para exportar os dados e, em seguida, importá-los para o Banco de Dados do Azure para MySQL.

Lista de verificação de migração de dados

  • Compreender a complexidade do ambiente e se uma abordagem online é viável.

  • Contabilize o desvio de dados. Parar o serviço de banco de dados pode eliminar possíveis desvios de dados.

  • Configure parâmetros de origem para exportação rápida.

  • Configure parâmetros de destino para importação rápida.

  • Teste todas as migrações que tenham uma versão de origem diferente vs o destino.

  • Migre quaisquer objetos não baseados em dados, como nomes de usuário e privilégios.

  • Certifique-se de que todas as tarefas estão documentadas e com check-off à medida que a migração é executada.

Próximo passo