Trabalhar com réplicas de leitura do MySQL - Amazon Relational Database Service

Trabalhar com réplicas de leitura do MySQL

A seguir, você pode encontrar informações específicas sobre como trabalhar com réplicas de leitura no RDS for MySQL. Para obter informações gerais sobre as réplicas de leitura e as instruções de como usá-las, consulte Como trabalhar com réplicas de leitura.

Configurar réplicas de leitura com o MySQL

Antes que uma instância de banco de dados do MySQL possa servir como uma fonte de replicação, certifique-se de habilitar os backups automáticos na instância de banco de dados de origem. Para fazer isso, defina o período de retenção de backup como um valor diferente de 0. Esse requisito também se aplica a uma réplica de leitura que seja a instância de banco de dados de origem de outra réplica de leitura. Os backups automáticos são compatíveis somente com réplicas de leitura que executam qualquer versão do MySQL 5.6 e posteriores. Você pode configurar a replicação com base nas coordenadas do log binário para uma instância de banco de dados MySQL.

No RDS for MySQL 5.7.23 e versões posteriores do MySQL 5.7 e no RDS for MySQL 8.0.26 e versões 8.0 posteriores, você pode configurar a replicação usando identificadores de transação globais (GTIDs). Para obter mais informações, consulte Usar a replicação baseada em GTID para o Amazon RDS for MySQL.

Você pode criar até cinco réplicas de leitura de uma instância de banco de dados. Para que a replicação funcione efetivamente, cada réplica de leitura deve ter a mesma quantidade de recursos de computação e de armazenamento que a instância de banco de dados de origem. Se você dimensionar a instância de banco de dados de origem, dimensione as réplicas de leitura também.

Se uma réplica de leitura estiver executando qualquer versão do MySQL 5.6 e posteriores, você poderá especificá-la como a instância de banco de dados de origem para outra réplica de leitura. Por exemplo, você pode criar a ReadReplica1 da MyDBInstance e criar a ReadReplica2 da ReadReplica1. As atualizações feitas à MyDBInstance são replicadas à ReadReplica1 e depois replicadas da ReadReplica1 à ReadReplica2. Não é possível ter mais do que quatro instâncias envolvidas em uma cadeia de replicação. Por exemplo, você pode criar a ReadReplica1 da MySourceDBInstance, criar a ReadReplica2 da ReadReplica1 e criar a ReadReplica3 da ReadReplica2, mas não é possível criar uma ReadReplica4 da ReadReplica3.

Se você promover uma réplica de leitura do MySQL que, por sua vez, seja replicada em outras réplicas de leitura, essas réplicas de leitura permanecerão ativas. Considere um exemplo em que a MyDBInstance1 replica para a MyDBInstance2, e a MyDBInstance2 replica para a MyDBInstance3. Se você promover a MyDBInstance2, a replicação a partir da MyDBInstance1 para a MyDBInstance2 não ocorrerá mais, mas a MyDBInstance2 ainda será replicada para a MyDBInstance3.

Para habilitar backups automáticos em uma réplica de leitura do RDS for MySQL versão 5.6 e posteriores, primeiro crie essa réplica de leitura. Depois modifique a réplica de leitura par habilitar backups automáticos.

É possível executar múltiplas ações simultâneas de criação ou exclusão para réplicas de leitura que referenciam a mesma instância de banco de dados de origem. Para fazer isso, permaneça dentro do limite de cinco réplicas de leitura para cada instância de origem.

Uma réplica de leitura de uma instância de banco de dados MySQL não pode usar uma versão de mecanismo de banco de dados inferior à sua instância de banco de dados de origem.

Preparar instâncias de banco de dados MySQL que usam MyISAM

Se sua instância de banco de dados MySQL usar um mecanismo não transacional, como o MyISAM, será necessário realizar as etapas a seguir para configurar sua réplica de leitura com sucesso. Essas etapas são necessárias para garantir que a réplica de leitura tenha uma cópia consistente de seus dados. Essas etapas não são necessárias caso todas as suas tabelas utilizem um mecanismo transacional como InnoDB.

  1. Interrompa todas as operações de linguagem de manipulação de dados (DML) e de linguagem de definição de dados (DDL) em tabelas não transacionais na instância de banco de dados de origem e aguarde pela conclusão delas. Comandos SELECIONAR podem continuar sendo executados.

  2. Descarregue e bloqueie as tabelas na instância do banco de dados de origem.

  3. Crie a réplica de leitura usando um dos métodos nas seções a seguir.

  4. Verifique o andamento da criação da réplica de leitura usando, por exemplo, a operação da API DescribeDBInstances. Após a réplica de leitura estar disponível, desbloqueie as tabelas da instância de banco de dados de origem e retome as operações de banco de dados normais.

Configurar filtros de replicação com MySQL

Você pode usar filtros de replicação para especificar quais bancos de dados e tabelas são replicados com uma réplica de leitura. Os filtros de replicação podem incluir bancos de dados e tabelas na replicação ou excluí-los da replicação.

Veja a seguir alguns casos de uso para filtros de replicação:

  • Para reduzir o tamanho de uma réplica de leitura. Com a filtragem de replicação, você pode excluir os bancos de dados e tabelas que não são necessários na réplica de leitura.

  • Para excluir bancos de dados e tabelas de réplicas de leitura por motivos de segurança.

  • Para replicar diferentes bancos de dados e tabelas para casos de uso específicos em diferentes réplicas de leitura. Por exemplo, você pode usar réplicas de leitura específicas para análise ou fragmentação.

  • Para uma instância de banco de dados que tenha réplicas de leitura em diferentes regiões da AWS, replicar diferentes bancos de dados ou tabelas em diferentes regiões da AWS.

nota

É possível usar filtros de replicação para especificar quais bancos de dados e tabelas serão replicados com uma instância de banco de dados primária do MySQL configurada como uma réplica em uma topologia de replicação de entrada. Para obter mais informações sobre essa configuração, consulte Configurar a replicação da posição do arquivo de log binário com uma instância de origem externa.

Configurar parâmetros de filtragem de replicação para o RDS for MySQL

Para configurar filtros de replicação, defina os seguintes parâmetros de filtragem de replicação na réplica de leitura:

  • replicate-do-db – Replicar alterações nos bancos de dados especificados. Quando você define esse parâmetro para uma réplica de leitura, somente os bancos de dados especificados no parâmetro são replicados.

  • replicate-ignore-db – Não replique as alterações nos bancos de dados especificados. Quando o parâmetro replicate-do-db é definido para uma réplica de leitura, esse parâmetro não é avaliado.

  • replicate-do-table – Replicar alterações nas tabelas especificadas. Quando você define esse parâmetro para uma réplica de leitura, somente as tabelas especificadas no parâmetro são replicadas. Além disso, quando o parâmetro replicate-do-db ou replicate-ignore-db estiver definido, certifique-se de incluir o banco de dados que inclui as tabelas especificadas na replicação com a réplica de leitura.

  • replicate-ignore-table – Não replique as alterações nas tabelas especificadas. Quando o parâmetro replicate-do-table é definido para uma réplica de leitura, esse parâmetro não é avaliado.

  • replicate-wild-do-table – Replicar tabelas com base nos padrões de nome de banco de dados e tabela especificados. Os caracteres curinga % e _ são compatíveis. Quando o parâmetro replicate-do-db ou replicate-ignore-db estiver definido, certifique-se de incluir o banco de dados que inclui as tabelas especificadas na replicação com a réplica de leitura.

  • replicate-wild-ignore-table – Não replique tabelas com base nos padrões de nome de banco de dados e tabela especificados. Os caracteres curinga % e _ são compatíveis. Quando o parâmetro replicate-do-table ou replicate-wild-do-table é definido para uma réplica de leitura, esse parâmetro não é avaliado.

Os parâmetros são avaliados na ordem em que estão listados. Para obter mais informações sobre como esses parâmetros funcionam, consulte a documentação do MySQL:

Por padrão, cada um desses parâmetros tem um valor vazio. Em cada réplica de leitura, você pode usar esses parâmetros para definir, alterar e excluir filtros de replicação. Quando você define um desses parâmetros, separe cada filtro dos outros com uma vírgula.

Você pode usar % os caracteres curinga _ e nos parâmetros replicate-wild-do-table e replicate-wild-ignore-table. O curinga % corresponde a qualquer número de caracteres e o caractere curinga _ corresponde apenas a um caractere.

O formato de log binário da instância de banco de dados de origem é importante para replicação porque determina o registro de alterações de dados. A configuração do parâmetro binlog_format determina se a replicação é baseada em linha ou baseada em declaração. Para obter mais informações, consulte Configurar o registro em log binário do MySQL.

nota

Todas as instruções DDL (Data Definition Language, linguagem de definição de dados) são replicadas como instruções, independentemente da binlog_format configuração na instância de banco de dados de origem.

Limitações de filtragem de replicação do RDS for MySQL

As seguintes limitações aplicam-se à filtragem de replicação para o RDS for MySQL:

  • Cada parâmetro de filtragem de replicação tem um limite de 2.000 caracteres.

  • As vírgulas não são compatíveis em filtros de replicação.

  • O MySQL --binlog-do-db e --binlog-ignore-db as opções para filtragem de log binário não são compatíveis.

  • A filtragem de replicação não suporta transações XA.

    Para obter mais informações, consulte Restrictions on XA Transactions na documentação do MySQL.

  • A filtragem de replicação é compatível com o RDS for MySQL versão 8.0.17 e versões 8.0 posteriores e com a versão 5.7.26 e versões 5.7 posteriores.

  • A filtragem de replicação não é compatível com o RDS for MySQL versão 5.6.

Exemplos de filtragem de replicação do RDS for MySQL

Para configurar a filtragem de replicação para uma réplica de leitura, modifique os parâmetros de filtragem de replicação no parameter group associado à réplica de leitura.

nota

Não é possível modificar um grupo de parâmetros padrão. Se a réplica de leitura estiver usando um parameter group padrão, crie um novo parameter group e o associe à instância de banco de dados. Para obter mais informações sobre parameter groups de banco de dados, consulte Trabalhar com grupos de parâmetros.

Você pode definir parâmetros em um parameter group usando a AWS Management Console, a AWS CLI ou a API do RDS. Para obter informações sobre como configurar parâmetros, consulte Modificar parâmetros em um grupo de parâmetros de banco de dados. Quando você define parâmetros em um parameter group, todas as instâncias de banco de dados associadas ao parameter group usam as configurações de parâmetro. Se você definir os parâmetros de filtragem de replicação em um parameter group, verifique se o parameter group está associado apenas a réplicas de leitura. Deixe os parâmetros de filtragem de replicação vazios para instâncias de banco de dados de origem.

Os exemplos a seguir definem os parâmetros usando o AWS CLI. Estes exemplos definem ApplyMethod para immediate de modo que as mudanças do parâmetro ocorram imediatamente depois que o comando CLI termina. Se você quiser que uma alteração pendente seja aplicada depois que a réplica de leitura for reinicializada, defina como ApplyMethod pending-reboot.

Os exemplos a seguir definem filtros de replicação:

exemplo Incluir bancos de dados em replicação

O exemplo a seguir inclui os bancos de dados mydb1 e mydb2 na replicação.

Para Linux, macOS ou Unix:

aws rds modify-db-parameter-group \ --db-parameter-group-name myparametergroup \ --parameters "[{"ParameterName": "replicate-do-db", "ParameterValue": "mydb1,mydb2", "ApplyMethod":"immediate"}]"

Para Windows:

aws rds modify-db-parameter-group ^ --db-parameter-group-name myparametergroup ^ --parameters "[{"ParameterName": "replicate-do-db", "ParameterValue": "mydb1,mydb2", "ApplyMethod":"immediate"}]"

exemplo Incluir tabelas na replicação

O exemplo a seguir inclui as tabelas table1 e table2 no banco de dados mydb1 na replicação.

Para Linux, macOS ou Unix:

aws rds modify-db-parameter-group \ --db-parameter-group-name myparametergroup \ --parameters "[{"ParameterName": "replicate-do-table", "ParameterValue": "mydb1.table1,mydb1.table2", "ApplyMethod":"immediate"}]"

Para Windows:

aws rds modify-db-parameter-group ^ --db-parameter-group-name myparametergroup ^ --parameters "[{"ParameterName": "replicate-do-table", "ParameterValue": "mydb1.table1,mydb1.table2", "ApplyMethod":"immediate"}]"

exemplo Incluir tabelas na replicação usando caracteres curinga

O exemplo a seguir inclui tabelas com nomes que começam com orders e returns no banco de dados mydb na replicação.

Para Linux, macOS ou Unix:

aws rds modify-db-parameter-group \ --db-parameter-group-name myparametergroup \ --parameters "[{"ParameterName": "replicate-wild-do-table", "ParameterValue": "mydb.orders%,mydb.returns%", "ApplyMethod":"immediate"}]"

Para Windows:

aws rds modify-db-parameter-group ^ --db-parameter-group-name myparametergroup ^ --parameters "[{"ParameterName": "replicate-wild-do-table", "ParameterValue": "mydb.orders%,mydb.returns%", "ApplyMethod":"immediate"}]"

exemplo Caracteres de escape curinga em nomes

O exemplo a seguir mostra como usar o caractere de escape \ para liberar um caractere curinga que faz parte de um nome.

Suponha que você tenha vários nomes de tabela no banco de dados mydb1 que começam com my_table, e você deseja incluir essas tabelas na replicação. Os nomes das tabelas incluem um sublinhado, que também é um caractere curinga, portanto, o exemplo escapa ao sublinhado nos nomes das tabelas.

Para Linux, macOS ou Unix:

aws rds modify-db-parameter-group \ --db-parameter-group-name myparametergroup \ --parameters "[{"ParameterName": "replicate-wild-do-table", "ParameterValue": "my\_table%", "ApplyMethod":"immediate"}]"

Para Windows:

aws rds modify-db-parameter-group ^ --db-parameter-group-name myparametergroup ^ --parameters "[{"ParameterName": "replicate-wild-do-table", "ParameterValue": "my\_table%", "ApplyMethod":"immediate"}]"

exemplo Excluir bancos de dados da replicação

O exemplo a seguir exclui os bancos de dados mydb1 e mydb2 da replicação.

Para Linux, macOS ou Unix:

aws rds modify-db-parameter-group \ --db-parameter-group-name myparametergroup \ --parameters "[{"ParameterName": "replicate-ignore-db", "ParameterValue": "mydb1,mydb2", "ApplyMethod":"immediate"}]"

Para Windows:

aws rds modify-db-parameter-group ^ --db-parameter-group-name myparametergroup ^ --parameters "[{"ParameterName": "replicate-ignore-db", "ParameterValue": "mydb1,mydb2", "ApplyMethod":"immediate"}]"

exemplo Excluir tabelas da replicação

O exemplo a seguir exclui tabelas table1 e table2 no banco de dados mydb1 da replicação.

Para Linux, macOS ou Unix:

aws rds modify-db-parameter-group \ --db-parameter-group-name myparametergroup \ --parameters "[{"ParameterName": "replicate-ignore-table", "ParameterValue": "mydb1.table1,mydb1.table2", "ApplyMethod":"immediate"}]"

Para Windows:

aws rds modify-db-parameter-group ^ --db-parameter-group-name myparametergroup ^ --parameters "[{"ParameterName": "replicate-ignore-table", "ParameterValue": "mydb1.table1,mydb1.table2", "ApplyMethod":"immediate"}]"

exemplo Excluir tabelas da replicação usando caracteres curinga

O exemplo a seguir exclui tabelas com nomes que começam com orders e returns no banco de dados mydb da replicação.

Para Linux, macOS ou Unix:

aws rds modify-db-parameter-group \ --db-parameter-group-name myparametergroup \ --parameters "[{"ParameterName": "replicate-wild-ignore-table", "ParameterValue": "mydb.orders%,mydb.returns%", "ApplyMethod":"immediate"}]"

Para Windows:

aws rds modify-db-parameter-group ^ --db-parameter-group-name myparametergroup ^ --parameters "[{"ParameterName": "replicate-wild-ignore-table", "ParameterValue": "mydb.orders%,mydb.returns%", "ApplyMethod":"immediate"}]"

Visualizar os filtros de replicação para uma réplica de leitura

Você pode visualizar os filtros de replicação de uma réplica de leitura das seguintes maneiras:

  • Verifique as configurações dos parâmetros de filtragem de replicação no parameter group associado à réplica de leitura.

    Para obter instruções, consulte Visualizar valores de parâmetros para um grupo de parâmetros de banco de dados.

  • Em um cliente MySQL, conecte-se à réplica de leitura e execute a instrução SHOW REPLICA STATUS.

    Na saída, os campos a seguir mostram os filtros de replicação para a réplica de leitura:

    • Replicate_Do_DB

    • Replicate_Ignore_DB

    • Replicate_Do_Table

    • Replicate_Ignore_Table

    • Replicate_Wild_Do_Table

    • Replicate_Wild_Ignore_Table

    Para obter mais informações sobre esses campos, consulte Verificar o status da replicação na documentação do MySQL.

    nota

    As versões anteriores do MySQL usavam SHOW SLAVE STATUS em vez de SHOW REPLICA STATUS. Se você estiver usando uma versão do MySQL anterior à 8.0.23, use SHOW SLAVE STATUS.

Configurar replicação atrasada com o MySQL

Você pode usar a replicação atrasada como uma estratégia para a recuperação de desastres. Com a replicação atrasada, você especifica o tempo mínimo, em segundos, para atrasar a replicação da origem para a réplica de leitura. Em caso de um desastre, como uma tabela excluída acidentalmente, você executa as seguintes etapas para recuperar-se rapidamente do desastre:

nota
  • No RDS for MySQL 8.0, a replicação atrasada tem suporte para o MySQL 8.0.26 e versões posteriores. No RDS for MySQL 5.7, a replicação atrasada tem suporte para o MySQL 5.7.22 e versões posteriores. No RDS for MySQL 5.6, a replicação atrasada tem suporte para o MySQL 5.6.40 e versões posteriores.

  • Use procedimentos armazenados para configurar a replicação atrasada. Você não pode configurar a replicação atrasada com o AWS Management Console, a AWS CLI ou a API do Amazon RDS.

  • No RDS for MySQL 5.7.23 e versões posteriores do MySQL 5.7 e no RDS for MySQL 8.0.26 e versões 8.0 posteriores, é possível utilizar a replicação com base em identificadores de transações globais (GTIDs) em uma configuração de replicação atrasada. Caso você use a replicação baseada em GTID, use o procedimento armazenado mysql.rds_start_replication_until_gtid em vez do procedimento armazenado mysql.rds_start_replication_until. Para obter mais informações sobre a replicação baseada em GTID, consulte Usar a replicação baseada em GTID para o Amazon RDS for MySQL.

Configurar replicação atrasada durante a criação da réplica de leitura

Para configurar a replicação atrasada para qualquer réplica de leitura futura criada a partir de uma instância de banco de dados, execute o procedimento armazenado mysql.rds_set_configuration com o parâmetro target delay.

Para configurar a replicação atrasada durante a criação da réplica de leitura

  1. Usando um cliente MySQL, conecte-se à instância de banco de dados MySQL que será a origem para réplicas de leitura como o usuário mestre.

  2. Execute o procedimento armazenado mysql.rds_set_configuration com o parâmetro target delay.

    Por exemplo, execute o procedimento armazenado a seguir para especificar que a replicação é atrasada em pelo menos uma hora (3,600 segundos) para qualquer réplica de leitura criada a partir da instância de banco de dados atual.

    call mysql.rds_set_configuration('target delay', 3600);
    nota

    Após executar esse procedimento armazenado, qualquer réplica de leitura que você criar usando a AWS CLI ou a API do Amazon RDS será configurada com a replicação atrasada pelo número de segundos especificado.

Modificar replicação atrasada de uma réplica de leitura existente

Para modificar a replicação atrasada para uma réplica de leitura existente, execute o procedimento armazenado mysql.rds_set_source_delay.

Para modificar a replicação atrasada para uma réplica de leitura existente

  1. Usando um cliente do MySQL, conecte-se à réplica de leitura como o usuário mestre.

  2. Use o procedimento armazenado mysql.rds_stop_replication para interromper a replicação.

  3. Execute o procedimento armazenado mysql.rds_set_source_delay.

    Por exemplo, execute o procedimento armazenado a seguir para especificar que a replicação para a réplica de leitura é atrasada em pelo menos uma hora (3.600 segundos) para qualquer réplica de leitura criada a partir da instância de banco de dados atual.

    call mysql.rds_set_source_delay(3600);
  4. Use o procedimento armazenado mysql.rds_start_replication para iniciar a replicação.

Configurar um local para interromper a replicação para uma réplica de leitura

Após interromper a replicação para a réplica de leitura, você pode começar a replicação e interrompê-la em um local especificado do arquivo de log binário usando o procedimento armazenado mysql.rds_start_replication_until.

Para iniciar a replicação para uma Réplica de leitura e interrompê-la em um local específico

  1. Usando um cliente do MySQL, conecte-se à instância de banco de dados MySQL de origem como o usuário mestre.

  2. Execute o procedimento armazenado mysql.rds_start_replication_until.

    O exemplo a seguir inicia a replicação e replica as alterações até que ela atinja o local 120 no arquivo de log binário mysql-bin-changelog.000777. Em um cenário de recuperação de desastres, suponha que o local 120 é imediatamente antes do desastre.

    call mysql.rds_start_replication_until( 'mysql-bin-changelog.000777', 120);

A replicação é interrompida automaticamente quando o ponto de interrupção é atingido. O seguinte evento do RDS é gerado: Replication has been stopped since the replica reached the stop point specified by the rds_start_replication_until stored procedure.

Promover uma réplica de leitura

Após a replicação ser interrompida, em um cenário de recuperação de desastres, você pode promover uma réplica de leitura para ser a nova instância de banco de dados de origem. Para obter informações sobre como promover uma réplica de leitura, consulte Promoção de uma réplica de leitura a uma instância de banco de dados autônoma.

Atualizar réplicas de leitura com o MySQL

As réplicas de leitura foram projetadas para oferecer suporte a consultas de leitura, mas você pode precisar fazer atualizações ocasionais. Por exemplo, talvez seja necessário adicionar um índice para otimizar tipos específicos de consultas que acessam a réplica. Você pode habilitar as atualizações configurando o parâmetro read_only como 0 no grupo de parâmetros de banco de dados da réplica de leitura. Tenha cuidado ao desabilitar o recurso somente leitura em uma réplica de leitura, pois isso poderá causar problemas se a réplica de leitura se tornar incompatível com a instância de banco de dados de origem. Altere o valor do parâmetro read_only de volta para 1 o mais rápido possível.

Trabalhar com implantações de réplicas de leitura multi-AZ com o MySQL

É possível criar uma réplica de leitura a partir de implantações de instâncias de banco de dados single-AZ ou Multi-AZ. Você pode usar implantações Multi-AZ para melhorar a durabilidade e a disponibilidade de dados essenciais. No entanto, não é possível usar o Multi-AZ secundário para atender a consultas somente leitura. Em vez disso, crie réplicas de leitura de instâncias de banco de dados Multi-AZ de alto tráfego para descarregar consultas somente leitura. Se a instância de origem de uma implantação Multi-AZ falhar na secundária, todas as réplicas de leitura associadas serão automaticamente alteradas para usar a secundária (não a primária) como a origem de replicação. Para obter mais informações, consulte Implantações Multi-AZ para alta disponibilidade.

É possível criar uma réplica de leitura como uma instância de banco de dados Multi-AZ. O Amazon RDS cria um em modo de espera de sua réplica em outra zona de disponibilidade para suporte a failover da réplica. Você pode criar a réplica de leitura como uma instância de banco de dados Multi-AZ independentemente de o banco de dados de origem ser ou não uma instância de banco de dados Multi-AZ.

nota

Para criar uma réplica de leitura como uma instância de banco de dados Multi-AZ, a instância de banco de dados deve ser MySQL 5.6 ou superior.

Monitorar réplicas de leitura do MySQL

Para as réplicas de leitura do MySQL, você pode monitorar o atraso da replicação no Amazon CloudWatch visualizando a métrica ReplicaLag do Amazon RDS. A métrica ReplicaLag relata o valor do campo Seconds_Behind_Master do comando SHOW REPLICA STATUS.

nota

As versões anteriores do MySQL usavam SHOW SLAVE STATUS em vez de SHOW REPLICA STATUS. Se você estiver usando uma versão do MySQL anterior à 8.0.23, use SHOW SLAVE STATUS.

As causas comuns para o atraso da replicação do MySQL são as seguintes:

  • Uma queda de rede.

  • Gravação em tabelas com índices diferentes em uma réplica de leitura. Se o parâmetro read_only estiver definido como 0 na réplica de leitura, a replicação poderá ser interrompida se a réplica de leitura torna-se incompatível com a instância de banco de dados de origem. Depois de realizar tarefas de manutenção na réplica de leitura, recomendamos que você defina o parâmetro read_only de volta para 1.

  • Uso de um mecanismo de armazenamento não transacional, como o MyISAM. A replicação só é compatível com o mecanismo de armazenamento InnoDB no MySQL.

Quando a métrica ReplicaLag chega a 0, isso mostra que a réplica alcançou a instância do banco de dados de origem. Se a métrica ReplicaLag retornar -1, então a replicação não está ativa no momento. ReplicaLag = -1 é equivalente a Seconds_Behind_Master = NULL.

Início e interrupção de replicação com réplicas de leitura do MySQL

Você pode interromper e reiniciar o processo de replicação em uma instância de banco de dados do Amazon RDS ao chamar os procedimentos armazenados do sistema mysql.rds_stop_replication e mysql.rds_start_replication. Você pode fazer isso ao replicar entre duas instâncias do Amazon RDS para operações de longa duração, como a criação de índices grandes. Você também precisa interromper e iniciar a replicação ao importar ou exportar bancos de dados. Para obter mais informações, consulte Importar dados para uma instância de banco de dados MariaDB ou MySQL do Amazon RDS com tempo de inatividade reduzido e Exportar dados de uma instância de banco de dados MySQL usando replicação.

Se a replicação for interrompida por mais de 30 dias consecutivos, seja manualmente ou devido a um erro de replicação, o Amazon RDS a encerrará entre a instância de banco de dados de origem e todas as réplicas de leitura. Isso acontece para evitar um aumento nos requisitos de armazenamento da instância de banco de dados de origem e nos tempos de failover prolongado. A instância de banco de dados da réplica de leitura ainda está disponível. No entanto, a replicação não pode ser retomada porque os logs binários exigidos pela réplica de leitura são excluídos da instância de banco de dados de origem após a conclusão da replicação. Você pode criar uma nova réplica de leitura para a instância de banco de dados de origem a fim de restabelecer a replicação.

Solucionar problemas de uma réplica de leitura do MySQL

Para instâncias de bancos de dados MySQL, em alguns casos as réplicas de leitura apresentam erros de replicação ou inconsistências de dados entre a réplica de leitura e sua fonte da instância de banco de dados. Esse problema ocorre quando alguns eventos de log binário (binlog) ou logs redo do InnoDB não são liberados durante uma falha da réplica de leitura ou da instância de banco de dados de origem. Nesses casos, exclua e recrie manualmente as réplicas de leitura. Você pode reduzir a chance disso acontecer definindo os seguintes valores de parâmetro: sync_binlog=1 e innodb_flush_log_at_trx_commit=1. Essas configurações podem reduzir a performance, portanto, teste o impacto delas antes de implantar as alterações em um ambiente de produção.

Atenção

No grupo de parâmetros associado à fonte da instância de banco de dados, recomendamos manter esses valores de parâmetros: sync_binlog=1 e innodb_flush_log_at_trx_commit=1. Esses parâmetros são dinâmicos. Se você não quiser usar essas configurações, recomendamos definir temporariamente esses valores antes de executar qualquer operação na fonte da instância de banco de dados que possa fazer com que ela seja reiniciada. Essas operações incluem, entre outras, a reinicialização, a reinicialização com failover, a atualização da versão do banco de dados e a alteração da classe de instância de banco de dados ou seu armazenamento. A mesma recomendação se aplica à criação de novas réplicas de leitura para a fonte da instância de banco de dados.

Não seguir essa orientação aumenta o risco de réplicas de leitura apresentarem erros de replicação ou inconsistências de dados (ou ambas) entre a réplica de leitura e sua fonte da instância de banco de dados.

As tecnologias de replicação do MySQL são assíncronas. Como são assíncronas, são esperados ocasionais aumentos de BinLogDiskUsage na instância de banco de dados de origem e ReplicaLag na réplica de leitura. Por exemplo, um volume elevado de operações de gravação para a instância de banco de dados de origem pode ocorrer em paralelo. Por outro lado, as operações de gravação na réplica de leitura são serializadas usando um único thread de E/S, o que pode ocasionar um atraso entre a instância de origem e a réplica de leitura. Para obter mais informações sobre réplicas somente leitura na documentação do MySQL, consulte Detalhes de implantação da replicação.

Você pode fazer várias coisas para reduzir o atraso entre as atualizações de uma instância de banco de dados de origem e as atualizações subsequentes da réplica de leitura, como o seguinte:

  • Dimensionar uma réplica de leitura para ter um tamanho de armazenamento e uma categoria de instância de banco de dados comparáveis à da instância de banco de dados de origem.

  • Assegurar-se de que as configurações de parâmetros nos grupos de parâmetros de banco de dados utilizados pela instância de banco de dados de origem e pela réplica de leitura são compatíveis. Para mais informações e um exemplo, consulte a discussão sobre o parâmetro max_allowed_packet posteriormente nesta seção.

O Amazon RDS monitora o status de replicação de suas réplicas de leitura e atualiza o campo Replication State da instância da réplica de leitura para Error caso a replicação seja interrompida por qualquer motivo. Um exemplo pode ser se as consultas DML forem executadas no seu conflito de réplica de leitura com as atualizações feitas na instância de banco de dados de origem.

Você pode analisar os detalhes do erro associado gerado pelo mecanismo do MySQL visualizando o campo Replication Error. Os eventos que indicam o status da réplica de leitura também são gerados, incluindo RDS-EVENT-0045, RDS-EVENT-0046 e RDS-EVENT-0047. Para mais informações sobre eventos e como se inscrever neles, consulte Trabalhar com a notificação de eventos do Amazon RDS. Se for retornada uma mensagem de erro do MySQL, analise o número de erro na documentação de mensagens de erro do MySQL.

Um problema comum que pode causar erros de replicação é quando o valor do parâmetro max_allowed_packet para uma réplica de leitura é menor que o do parâmetro max_allowed_packet para a instância de banco de dados de origem. O parâmetro max_allowed_packet é um parâmetro personalizado que você pode definir em um grupo de parâmetros de banco de dados. Use o max_allowed_packet para especificar o tamanho máximo do código DML que pode ser executado no banco de dados. Em alguns casos, o valor do max_allowed_packet no grupo de parâmetros de banco de dados associado a uma réplica de leitura é menor do que o valor de max_allowed_packet no grupo de parâmetros de banco de dados associado à instância de banco de dados de origem. Nesses casos, o processo de replicação pode lançar o erro Packet bigger than 'max_allowed_packet' bytes e interromper a replicação. Para corrigir o erro, faça com que a instância de banco de dados de origem e a réplica de leitura usem grupos de parâmetros de banco de dados com os mesmos valores de parâmetro max_allowed_packet

Outras situações comuns que podem causar erros de replicação incluem o seguinte:

  • A gravação em tabelas em uma réplica de leitura. Em alguns casos, é possível criar índices em uma réplica de leitura diferentes dos índices na instância de banco de dados da origem. Se você fizer isso, defina o parâmetro read_only como 0 para criar índices. Se você gravar em tabelas na réplica de leitura, isso poderá interromper a replicação se a réplica de leitura tornar-se incompatível com a instância de banco de dados de origem. Depois de realizar tarefas de manutenção na réplica de leitura, recomendamos que você defina o parâmetro read_only de volta para 1.

  • Uso de um mecanismo de armazenamento não transacional, como o MyISAM. As réplicas de leitura exigem um mecanismo de armazenamento transacional. A replicação só é compatível com o mecanismo de armazenamento InnoDB no MySQL.

  • Usando consultas não deterministas inseguras, como SYSDATE(). Para obter mais informações, consulte Determinação de instruções seguras e inseguras no registro de logs binários.

Se você acreditar que pode ignorar um erro com segurança, siga as etapas descritas na seção Ignorar o erro de replicação atual. Caso contrário, você pode excluir a réplica de leitura primeiro. Crie uma instância usando o mesmo identificador de instância de banco de dados para que o endpoint permaneça o mesmo que o da sua antiga réplica de leitura. Se um erro de replicação for corrigido, o Replication State mudará para replicating.