MySQL をソースとして使用しているときに、AWS DMS CDC タスクが 1236 エラーで失敗するのはなぜですか?

所要時間4分
0

AWS Database Migration Service (AWS DMS) を使用して、データをソース MySQL データベースエンジンからターゲットエンジンに移行しています。しかし、タスクは 1236 エラーで失敗します。この問題をトラブルシューティングするにはどうすればよいですか?

簡単な説明

AWS DMS を使用すると、1 回限りの移行を実行でき、進行中の変更をレプリケートしてソースとターゲットの同期を維持できます。ソースデータベースから進行中の変更を読み取るために、AWS DMS はエンジン固有の API アクションを使用して、ソースエンジンのトランザクションログから変更を読み取ります。MySQL をソースとして使用する場合、AWS DMS は行ベースのバイナリログ (binlog) から変更を読み取ります。その後、AWS DMS はそれらの変更をターゲットに移行します。

エラー 1236 は、バイナリログの問題が原因で発生します。そのため、トラブルシューティングを行う前に、すべてのバイナリログパラメータが AWS DMS CDC をサポートするように正しく設定されていることを確認してください。詳細については、「セルフマネージド MySQL 互換データベースを AWS DMS のソースとして使用する」および「AWS マネージド MySQL 互換データベースを AWS DMS のソースとして使用する」を参照してください。

解決方法

エラーの根本原因に応じて、次の手順に従います。

エラー 1236 (バイナリログインデックスファイルで最初のログファイル名が見つかりませんでした) binlog の読み込み

タスクログにエラー:

[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

このエラーは、AWS DMS がターゲットへのデータ変更をレプリケートするために使用するバイナリログが、ソース MySQL データベースから削除されたことを示します。これには次の 2 つの理由があります。

  • バイナリログの保持期間が短すぎる。
  • AWS DMS タスクが停止したか、問題が原因で停止した。

これらのコマンドを実行して、バイナリログが使用可能かどうかを確認します。

すべてのバイナリログファイルを一覧表示します

mysql> SHOW BINARY LOGS;

現在のバイナリログファイルと位置を一覧表示します

mysql> SHOW MASTER STATUS;

このエラーを解決するには、まずソース MySQL データベースのバイナリログの保持期間を確認します。必要に応じて保持期間を延長します。AWS DMS タスクを再起動して、全ロードフェーズを再実行します。

使用しているインスタンスのタイプに応じて、次の手順に従います。

セルフマネージド MySQL データベース - オンプレミスまたは Amazon Elastic Compute Cloud (Amazon EC2)

expire_logs_days の値を確認して、バイナリログの保持期間を確認します。このパラメータは、グローバルレベルで 1 以上の値に設定するのがベストプラクティスです。

AWS マネージド MySQL データベース - MySQL または Amazon Aurora MySQL 互換エディション向け Amazon Relational Database Service (Amazon RDS)

1.    mysql.rds_show_configuration コマンドを実行して、MySQL データベースに設定されているバイナリログの保持時間を確認します。

mysql> call mysql.rds_show_configuration;

2.    ログの保持期間を 24 時間に延長するには、 mysql.rds_set_configuration コマンドを実行します。

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

エラー 1236 (ログイベントエントリが max_allowed_packet を超えました。マスターの max_allowed_packet を増やしてください...)

タスクログにエラー:

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

このエラーには、次の 2 つの原因が考えられます。

  1. ソースの max_allowed_packet の値が、ソースの binlog イベントのサイズよりも小さくなっている。
  2. ソースデータベースの binlog が破損していまる。

これらの問題を解決するには、次の手順を実行します。

1.    ソースで、max_allowed_packet をより高い値に設定します。これにより、エラーの原因として考えられるバイナリログイベントサイズを除外できます。このパラメータには最大 1 GB の値を指定できます。

2.max_allowed_packet 値を大きく設定しても問題が解決しない場合は、ソースの binlog が破損している可能性があります。エラーメッセージには次のテキストが含まれています。

「最初のイベント '/mnt/data/logs/mysql-bin.056367' は 123 で、最後のイベントは 787323693 の '/mnt/data/logs/mysql-bin.056367' から読み込まれました」

そのため、次のコマンドを実行して、mysql-bin.056367 が破損していないか確認してください。

1.    binlog が存在するか確認します

mysql> SHOW BINARY LOGS;

2.    バイナリログのイベントを表示します

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

3.    バイナリログをダウンロードします

mysql> MYSQLBINLOG;

エラー 1236 (イベントの途中でバイナリログが切り捨てられます。マスターのディスク容量不足を検討してください...)

タスクログにエラー:

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

このエラーの主な原因には、次の 2 つがあります。

  1. プライマリサーバで sync_binlog!= 1 があります。これは、バイナリログイベントがディスク上で同期されない可能性があることを意味します。
  2. ソースデータベースの binlog が破損していまる。

このエラーを解決するには:

1.    ソースの sync_binlog パラメータの値を確認します。

2.    sync_binlog の値を変更し、1 に設定します。

3.    タスクを再開します。

注意:sync_binlog パラメータが既に 1 に設定されている場合は、エラー Error 1236 (ログ イベント エントリが max_allowed_packet を超えました。マスターで max_allowed_packet を増やしてください...) について前述した手順を使用して、バイナリログの破損を確認します。

エラー 1236 (クライアントが不可能な位置からレプリケーションを開始するようにマスターに要求しました...)

タスクログにエラー:

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

このエラーは通常、ソース MySQL データベースサーバーが予期せず停止した場合に発生します。これは、ディスクエラーや停電などのハードウェア障害の結果である可能性があります。

このエラーを解決するには、AWS DMS タスクタイプに応じて以下を実行します。

  • 全ロードと CDC タスク - AWS DMS タスクを再開します。
  • CDC のみのタスク - 次のバイナリログ位置から AWS DMS タスクを開始する

エラー 1236 (クライアントが、位置 > ファイルサイズからレプリケーションを開始するようにマスターに要求しました)

タスクログにエラー:

[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

このエラーは、暗号化されたバイナリログが原因である可能性があります。ソース MySQL データベースが MySQL バージョン 8.0 を実行していて、バイナリログが暗号化されている場合、AWS DMS はタスクの初期化時にログを読み取ることができません。その結果、AWS DMS はこのエラーを記録します。AWS DMS は、バイナリログ暗号化が有効になっている場合、MySQL 8.0 をソースとして使用する CDC レプリケーションをサポートしていません。

1.    MySQL のバージョンを確認します。

mysql> SELECT VERSION();

2.    binlog_encryption がオンになっているか確認してください。

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

3.    バイナリログ暗号化をオフにします。

mysql> SET GLOBAL binlog_encryption = OFF;
  • または -

binlog_encryption をオフにして AWS DMS タスクを開始してから、binlog_encryption をオンにします。

mysql> SET GLOBAL binlog_encryption = ON;

関連情報

Aurora MySQL をソースとして AWS DMS を使用するときに受け取ったバイナリログ記録エラーをトラブルシューティングするにはどうすればよいですか?

AWS公式
AWS公式更新しました 2年前
コメントはありません