Por que minha tarefa do CDC do AWS DMS falhou com um erro 1236 ao usar o MySQL como origem?

Data da última atualização: 13/09/2022

Estou usando o AWS Database Migration Service (AWS DMS) para migrar meus dados de um mecanismo de banco de dados MySQL de origem para um mecanismo de destino, mas a tarefa está falhando com um erro 1236. Como posso solucionar esse problema?

Breve descrição

Com o AWS DMS, você pode realizar migrações únicas e replicar alterações contínuas para manter as origens e os destinos em sincronia. Para ler as alterações contínuas do banco de dados de origem, o AWS DMS usa ações de API específicas do mecanismo para ler as alterações dos logs de transação do mecanismo de origem. Ao usar o MySQL como fonte, o AWS DMS lê as alterações dos logs binários baseados em linhas (binlogs). Em seguida, o AWS DMS migra essas alterações para o destino.

O erro 1236 é causado por problemas com os logs binários. Portanto, antes de solucionar problemas, certifique-se de que todos os parâmetros de log binário estejam configurados corretamente para oferecer suporte ao AWS DMS CDC. Para obter mais informações, consulte Usar um banco de dados compatível com MySQL autogerenciado como fonte para o AWS DMS e Usar um banco de dados compatível com MySQL gerenciado pela AWS como fonte para o AWS DMS.

Resolução

Siga as etapas abaixo, dependendo da causa raiz do seu erro.

Erro 1236 (Could not find first log file name in binary log index file) ao ler o log binário

Erro nos logs de tarefas:

[SOURCE_CAPTURE  ]I: Setting position in binlog 'mysql-bin-changelog.014448' at 119624570  (mysql_endpoint_capture.c:886)
[SOURCE_CAPTURE  ]I: Position was set in binlog 'mysql-bin-changelog.014448' at 119624570  (mysql_endpoint_capture.c:922)
[SOURCE_CAPTURE  ]E: Error 1236 (Could not find first log file name in binary log index file) reading binlog [1020493] 
[TASK_MANAGER    ]I: Task - ABCDXXXXXXXXXXXXXX is in ERROR state, updating starting status to AR_NOT_APPLICABLE

Esse erro indica que o log binário que o AWS DMS usa para replicar alterações de dados para o destino foi removido do banco de dados MySQL de origem. Isso acontece por dois motivos:

  • O período de retenção do log binário é muito baixo.
  • A tarefa do AWS DMS travou ou foi interrompida devido a um problema.

Execute estes comandos para confirmar se o log binário está disponível ou não.

Listar todos os arquivos de log binários:

mysql> SHOW BINARY LOGS;
mysql> SHOW MASTER STATUS;

Para resolver esse erro, primeiro revise o período de retenção de log binário no banco de dados MySQL de origem. Aumente o período de retenção, se necessário. Reinicie a tarefa do AWS DMS para executar a fase de carga completa novamente.

Siga estas etapas, dependendo do tipo de instância que você está usando.

Bancos de dados MySQL autogerenciados — no local ou no Amazon Elastic Compute Cloud (Amazon EC2)

Revise o valor de expire_logs_days para verificar o período de retenção de logs binários. É uma prática recomendada definir esse parâmetro para um valor de 1 ou maior em nível global.

Bancos de dados MySQL gerenciados pela AWS — Amazon Relational Database Service (Amazon RDS) para MySQL ou Amazon Aurora MySQL Compatible Edition

1.    Verifique as horas de retenção do log binário definidas no banco de dados MySQL executando o comando mysql.rds_show_configuration:

mysql> call mysql.rds_show_configuration;

2.    Para aumentar a retenção de log para 24 horas, execute o comando mysql.rds_set_configuration:

mysql> call mysql.rds_set_configuration('binlog retention hours', 24);

Erro 1236 (log event entry exceeded max_allowed_packet; increase max_allowed_packet on master;...)

Erro nos logs de tarefas:

[SOURCE_CAPTURE  ]I:  Position was set in binlog 'mysql-bin.056367' at 787323674  (mysql_endpoint_capture.c:922)
[SOURCE_CAPTURE  ]D:  net_safe_read error 1236 (log event entry exceeded max_allowed_packet; Increase max_allowed_packet on master; the first event 'mysql-bin.056367' at 787323674, the last event read from '/mnt/data/logs/mysql-bin.056367' at 123, the last byte read from '/mnt/data/logs/mysql-bin.056367' at 787323693.)  (mysql_endpoint_capture.c:1119)
[SOURCE_CAPTURE  ]I:  Error 1236 (log event entry exceeded max_allowed_packet; Increase max_allowed_packet on master; the first event 'mysql-bin.056367' at 787323674, the last event read from '/mnt/data/logs/mysql-bin.056367' at 123, the last byte read from '/mnt/data/logs/mysql-bin.056367' at 787323693.) reading binlog. Try reconnect  (mysql_endpoint_capture.c:1123)

Esse erro tem duas causas possíveis:

  1. O valor de max_allowed_packet na origem é menor do que o tamanho dos eventos de log binário na origem.
  2. O log binário está corrompido no banco de dados de origem.

Para resolver esses problemas, siga estas etapas:

1.    Na origem, defina max_allowed_packet para um valor mais alto. Ao fazer isso, você pode descartar tamanhos de eventos de log binário como uma possível causa do erro. Esse parâmetro pode ter um valor de até 1 GB.

2. Se definir um valor max_allowed_packet mais alto não resolver o problema, os logs binários na origem podem estar corrompidos. A mensagem de erro contém este texto:

"the first event '/mnt/data/logs/mysql-bin.056367' at 123, the last event read from '/mnt/data/logs/mysql-bin.056367' at 787323693"

Assim, verifique mysql-bin.056367 quanto a corrupção executando estes comandos:

1.    Verifique se o log binário existe:

mysql> SHOW BINARY LOGS;
mysql> SHOW BINLOG EVENTS IN '<binlog file>' FROM <position>;
mysql> MYSQLBINLOG;

Erro 1236 (binlog truncated in the middle of event; consider out of disk space on master;...)

Erro nos logs de tarefas:

[SOURCE_CAPTURE ]I: Read next binary log event failed; net_safe_read error 1236 (binlog truncated in the middle of event; consider out of disk space on master; the first event 'mysql-bin-changelog.017672' at 486, the last event read from '/rdsdbdata/log/binlog/mysql-bin-changelog.017672' at 125, the last byte read from '/rdsdbdata/log/binlog/mysql-bin-changelog.017672' at 4756.) (mysql_endpoint_capture.c:1069)
[SORTER ]I: Transaction consistency reached (sorter_transaction.c:347)
[TASK_MANAGER ]I: Starting replication now (replicationtask.c:2774)
[TASK_MANAGER ]I: Task - MGLVRIRUJH6FE2GP6F7SW46BPBW6YKF2JUJPSVY is in RUNNING state, updating starting status to AR_RUNNING (repository.c:5110)

Há duas causas principais desse erro:

  1. Existe um sync_binlog != 1 no servidor primário. Isso significa que os eventos de logs binário podem não ser sincronizados no disco.
  2. O log binário está corrompido no banco de dados de origem.

Para resolver esse erro:

1.    Verifique o valor do parâmetro sync_binlog na origem.

2.    Modifique o valor de sync_binlog e defina-o como 1.

3.    Reinicie a tarefa.

Nota: Se o parâmetro sync_binlog já estiver definido como 1, revise o log binário quanto à corrupção usando as etapas anteriormente detalhadas para o Erro 1236 (log event entry exceeded max_allowed_packet; increase max_allowed_packet on master;...)

Erro 1236 (Client requested master to start replication from impossible position...)

Erro nos logs de tarefas:

[SOURCE_CAPTURE  ]I:  Position was set in binlog 'mysql-bin-changelog.007989' at 1631  (mysql_endpoint_capture.c:922)
[SOURCE_CAPTURE  ]I:  Read next binary log event failed; net_safe_read error 1236 (Client requested master to start replication from impossible position; the first event 'mysql-bin-changelog.007989' at 1631, the last event read from 'mysql-bin-changelog.007989' at 4, the last byte read from 'mysql-bin-changelog.007989' at 4.)  (mysql_endpoint_capture.c:1053)
[SOURCE_CAPTURE  ]D:  Error reading binary log. [1020493]  (mysql_endpoint_capture.c:3995)
[SOURCE_CAPTURE  ]E:  Error 1236 (Client requested master to start replication from impossible position; the first event 'mysql-bin-changelog.007989' at 1631, the last event read from 'mysql-bin-changelog.007989' at 4, the last byte read from 'mysql-bin-changelog.007989' at 4.) reading binlog events [1020493]  (mysql_endpoint_capture.c:1074)

Esse erro geralmente ocorre se o servidor de banco de dados MySQL de origem parar inesperadamente. Isso pode ser o resultado de uma falha de hardware, como um erro de disco ou uma perda de energia.

Para resolver esse erro, faça o seguinte, dependendo do tipo de tarefa do AWS DMS:

  • Tarefas de carga total e CDC: reinicie a tarefa do AWS DMS.
  • Tarefas somente CDC: inicie a tarefa do AWS DMS a partir da próxima posição de log binário

Erro 1236 (Client requested master to start replication from position > file size)

Erro nos logs de tarefas:

[SOURCE_CAPTURE  ]I:  Position was set in binlog 'binlog.000012' at 2179  (mysql_endpoint_capture.c:922)
[SOURCE_CAPTURE  ]I:  Read next binary log event failed; net_safe_read error 1236 (Client requested master to start replication from position > file size)  (mysql_endpoint_capture.c:1052

Esse erro pode ser causado por logs binários criptografados. Se o banco de dados MySQL de origem estiver executando o MySQL versão 8.0 e os logs binários estiverem criptografados, o AWS DMS não poderá ler os logs na inicialização da tarefa. Como resultado, os logs do AWS DMS registram esse erro. O AWS DMS não oferece suporte à replicação do CDC usando o MySQL 8.0 como fonte quando a criptografia de log binário está ativada.

1.    Verifique sua versão do MySQL:

mysql> SELECT VERSION();

2.    Verifique se binlog_encryption está LIGADO:

mysql> SELECT * FROM performance_schema.global_variables WHERE VARIABLE_NAME = 'binlog_encryption';

3.    Desative a criptografia de log binário:

mysql> SET GLOBAL binlog_encryption = OFF;

-ou-

Inicie a tarefa do AWS DMS com binlog_encryption desativada e ative binlog_encryption:

mysql> SET GLOBAL binlog_encryption = ON;