Warum ist meine AWS-DMS-CDC-Aufgabe mit einem 1236-Fehler bei der Verwendung von MySQL als Quelle fehlgeschlagen?

Lesedauer: 7 Minute
0

Ich verwende AWS Database Migration Service (AWS DMS), um meine Daten von einer MySQL-Quelldatenbank-Engine zu einer Ziel-Engine zu migrieren. Die Aufgabe schlägt jedoch mit einem 1236-Fehler fehl. Wie behebe ich dieses Problem?

Kurzbeschreibung

Mit AWS DMS können Sie einmalige Migrationen durchführen und laufende Änderungen replizieren, um Quellen und Ziele synchron zu halten. Um laufende Änderungen aus der Quelldatenbank zu lesen, verwendet AWS DMS Engine-spezifische API-Aktionen, um Änderungen aus den Transaktionsprotokollen der Quell-Engine zu lesen. Bei der Verwendung von MySQL als Quelle liest AWS DMS Änderungen aus den zeilenbasierten Binärprotokollen (Binlogs). AWS DMS migriert diese Änderungen dann auf das Ziel.

Fehler 1236 wird durch Probleme mit den Binärprotokollen verursacht. Stellen Sie daher vor der Fehlerbehebung sicher, dass alle binären Protokollierungsparameter korrekt konfiguriert sind, um AWS DMS CDC zu unterstützen. Weitere Informationen finden Sie unter Verwenden einer selbstverwalteten MySQL-kompatiblen Datenbank als Quelle für AWS DMS und Verwenden einer von AWS verwalteten MySQL-kompatiblen Datenbank als Quelle für AWS DMS.

Auflösung

Führen Sie die folgenden Schritte aus, abhängig von der Grundursache Ihres Fehlers.

Fehler 1236 (Der erste Protokolldateiname konnte in der binären Protokollindexdatei nicht gefunden werden) beim Lesen des Binlogs

Fehler in den Aufgabenprotokollen:

[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

Dieser Fehler weist darauf hin, dass das Binärprotokoll, das AWS DMS zum Replizieren von Datenänderungen auf das Ziel verwendet, aus der MySQL-Quelldatenbank gelöscht wurde. Dies geschieht aus zwei Gründen:

  • Die Aufbewahrungsdauer für binäre Protokolle ist zu niedrig.
  • Die AWS-DMS-Aufgabe blieb hängen oder wurde aufgrund eines Problems angehalten.

Führen Sie diese Befehle aus, um zu überprüfen, ob das Binärprotokoll verfügbar ist oder nicht.

Alle binären Protokolldateien auflisten:

mysql> SHOW BINARY LOGS;

Listet die aktuelle binäre Protokolldatei und Position auf:

mysql> SHOW MASTER STATUS;

Um diesen Fehler zu beheben, überprüfen Sie zunächst den Aufbewahrungszeitraum für Binärprotokolle in der MySQL-Quelldatenbank. Erhöhen Sie bei Bedarf die Aufbewahrungsdauer. Starten Sie die AWS-DMS-Aufgabe neu, um die Volllastphase erneut auszuführen.

Befolgen Sie diese Schritte, je nachdem, welchen Instance-Typ Sie verwenden.

Selbstverwaltete MySQL-Datenbanken – lokal oder Amazon Elastic Compute Cloud (Amazon EC2)

Überprüfen Sie den Wert von expire_logs_days, um den Aufbewahrungszeitraum für Binärprotokolle zu überprüfen. Es ist eine bewährte Methode, diesen Parameter auf globaler Ebene auf einen Wert von 1 oder höher zu setzen.

Von AWS verwaltete MySQL-Datenbanken – Amazon Relational Database Service (Amazon RDS) für MySQL- oder Amazon-Aurora-MySQL-kompatible Edition

1.    Überprüfen Sie die in der MySQL-Datenbank festgelegten Binlog-Aufbewahrungszeiten, indem Sie den Befehl mysql.rds_show_configuration ausführen:

mysql> call mysql.rds_show_configuration;

2.    Um die Protokollspeicherung auf 24 Stunden zu erhöhen, führen Sie den Befehl mysql.rds_set_configuration aus:

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

Fehler 1236 (Protokollereigniseintrag hat max_allowed_packet überschritten; max_allowed_packet auf Master erhöhen;...)

Fehler in den Aufgabenprotokollen:

[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)

Dieser Fehler hat zwei mögliche Ursachen:

  1. Der Wert von max_allowed_packet auf der Quelle ist kleiner als die Größe von binlog-Ereignissen auf der Quelle.
  2. Das Binlog in der Quelldatenbank ist beschädigt.

Gehen Sie folgendermaßen vor, um diese Probleme zu beheben:

1.    Setzen Sie in der Quelle max_allowed_packet auf einen höheren Wert. Auf diese Weise können Sie Binlog-Ereignisgrößen als mögliche Fehlerursache ausschließen. Dieser Parameter kann einen Wert von bis zu 1 GB haben.

  1. Wenn das Problem durch Festlegen eines höheren max_allowed_packet-Werts nicht behoben wird, sind die Binlogs auf der Quelle möglicherweise beschädigt. Die Fehlermeldung enthält diesen Text:

„das erste Ereignis „/mnt/data/logs/mysql-bin.056367“ bei 123, das letzte Ereignis, das aus „/mnt/data/logs/mysql-bin.056367“ bei 787323693 gelesen wurde“

Überprüfen Sie also mysql-bin.056367 auf Beschädigung, indem Sie die folgenden Befehle ausführen:

1.    Prüfen Sie, ob das Binlog existiert:

mysql> SHOW BINARY LOGS;

2.    Zeigen Sie die Ereignisse im Binärprotokoll an:

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

3.    Laden Sie die Binärprotokolle herunter:

mysql> MYSQLBINLOG;

Fehler 1236 (Binlog wurde mitten im Ereignis abgeschnitten; nicht genügend Speicherplatz auf dem Master berücksichtigen;...)

Fehler in den Aufgabenprotokollen:

[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)

Es gibt zwei Hauptursachen für diesen Fehler:

  1. Es gibt ein sync_binlog != 1 auf dem Primärserver. Dies bedeutet, dass binäre Protokollereignisse möglicherweise nicht auf der Festplatte synchronisiert werden.
  2. Das Binlog in der Quelldatenbank ist beschädigt.

So beheben Sie diesen Fehler:

1.    Überprüfen Sie den Wert des Parameters sync_binlog auf der Quelle.

2.    Ändern Sie den Wert von sync_binlog und setzen Sie ihn auf 1.

3.    Starten Sie die Aufgabe neu.

Hinweis: Wenn der Parameter sync_binlog bereits auf 1 gesetzt ist, überprüfen Sie das Binärprotokoll anhand der Schritte, die zuvor für Fehler Fehler 1236 beschrieben wurden, auf Beschädigung (Protokollereigniseintrag hat max_allowed_packet überschritten; max_allowed_packet auf master erhöhen;...)

Fehler 1236 (Client hat den Master angefordert, die Replikation von einer unmöglichen Position aus zu starten ...)

Fehler in den Aufgabenprotokollen:

[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)

Dieser Fehler tritt normalerweise auf, wenn der MySQL-Quelldatenbankserver unerwartet beendet wird. Dies kann auf einen Hardwarefehler wie einen Festplattenfehler oder einen Stromausfall zurückzuführen sein.

Gehen Sie je nach Ihrem AWS-DMS-Aufgabentyp wie folgt vor, um diesen Fehler zu beheben:

  • Volllast- und CDC-Aufgaben – Starten Sie die AWS-DMS-Aufgabe neu.
  • Nur-CDC-Aufgaben – Starten Sie die AWS-DMS-Aufgabe von der nächsten binären Protokollposition aus

Fehler 1236 (Der Client hat den Master angefordert, die Replikation von Position > Dateigröße aus zu starten)

Fehler in den Aufgabenprotokollen:

[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

Dieser Fehler kann durch verschlüsselte Binärprotokolle verursacht werden. Wenn in Ihrer MySQL-Quelldatenbank MySQL Version 8.0 ausgeführt wird und die Binärprotokolle verschlüsselt sind, kann AWS DMS die Protokolle bei der Aufgabeninitialisierung nicht lesen. Daher protokolliert AWS DMS diesen Fehler. AWS DMS unterstützt keine CDC-Replikation mit MySQL 8.0 als Quelle, wenn die Verschlüsselung von Binärprotokollen aktiviert ist.

1.    Prüfen Sie Ihre MySQL-Version:

mysql> SELECT VERSION();

2.    Prüfen Sie, ob binlog_encryption eingeschaltet ist:

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

3.    Binlog-Verschlüsselung ausschalten:

mysql> SET GLOBAL binlog_encryption = OFF;

-oder-

Starten Sie die AWS-DMS-Aufgabe mit deaktiviertem binlog_encryption, und aktivieren Sie dann binlog_encryption:

mysql> SET GLOBAL binlog_encryption = ON;

Relevante Informationen

Wie behebe ich Fehler bei der binären Protokollierung, die ich bei Verwendung von AWS DMS mit Aurora MySQL als Quelle erhalte?

AWS OFFICIAL
AWS OFFICIALAktualisiert vor einem Jahr