スキップしてコンテンツを表示

MySQL をソースとして使用したときに、AWS DMS CDC タスクが "Error 1236" で失敗した理由を教えてください。

所要時間5分
0

AWS Database Migration Service (AWS DMS) を使用して、データをソース MySQL データベースエンジンからターゲットエンジンに移行しました。しかし、変更データキャプチャ(CDC)タスクは "Error 1236" で失敗しました。

簡単な説明

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

バイナリログに問題がある場合は、"Error 1236" メッセージが表示されます。セルフマネージドまたは AWS マネージド MySQL 互換データベースを使用する場合は、AWS DMS CDC をサポートするようにすべてのバイナリロギングパラメータを正しく設定してください。

解決策

"Error 1236" をトラブルシューティングするには、表示されたエラーメッセージに基づいて次のアクションを実行してください。

"Could not find first log file name in binary log index file reading 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

上記のエラーは、ソース MySQL データベースが、AWS DMS がデータ変更をターゲットにレプリケートするために使用するバイナリログを削除したときに発生します。MySQL は次の理由でバイナリログを削除することがあります。

  • バイナリログの保持期間が短すぎる。
  • AWS DMS タスクが問題のためスタックまたは停止している。

バイナリログが使用可能かどうかを確認するには、次のコマンドを実行してすべてのバイナリログファイルを一覧表示します。

mysql> SHOW BINARY LOGS;

次に、次のコマンドを実行して、現在のバイナリログファイルと位置を一覧表示します。

mysql> SHOW MASTER STATUS;

前述のコマンドの詳細については、MySQL ウェブサイトの「SHOW BINARY LOGS statement」(SHOW BINARY LOGS ステートメント) と「SHOW MASTER STATUS statement」(SHOW MASTER STATUS ステートメント) を参照してください。

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

次に、データベースタイプに応じて次のアクションを実行します。

セルフマネージド MySQL データベース

オンプレミスまたは Amazon Elastic Compute Cloud (Amazon EC2) のバイナリログ保持期間を確認するには、expire_logs_days の値を確認してください。詳細については、MySQL Web サイトの「expire logs days」(ログの有効期限日数) を参照してください。

注: SET 変数のグローバルパラメータを 1 以上に設定することをお勧めします。詳細については、MySQL ウェブサイトの「SET syntax for variable assignment」(変数代入の SET 構文) を参照してください。

AWS マネージド MySQL データベース

Amazon Relational Database Service (Amazon RDS) for MySQL または Amazon Aurora MySQL 互換エディションデータベースに設定されているバイナリログ保持期間を確認してください。次のコマンドを実行します。

mysql> call mysql.rds_show_configuration;

ログ保持期間を 24 時間に増やすには、次のコマンドを実行します。

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

"Log event entry exceeded max_allowed_packet; increase max_allowed_packet on master..."(ログイベントエントリが 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)

上記のエラーは、次の理由で発生する場合があります。

  • 行には、ソースの max_allowed_packet の値を超えるデータがある。詳細については、MySQL のウェブサイトで「max_allowed_packet」を参照してください。
  • 1 つのトランザクションに大量のデータが含まれているか、1 つのトランザクションで複数の行の更新がある。
  • ソースデータベースでバイナリログが破損している。

バイナリラージオブジェクト (BLOB) 列または長い文字列を使用する場合は、max_allowed_packet 値を、使用する最大の BLOB に設定します。このパラメータには最大 1 GB の値を指定できます。詳細については、MySQL ウェブサイトの「The BLOB and TEXT types」(BLOB タイプと TEXT タイプ) を参照してください。

最大トランザクションのサイズを確認するには、バイナリログを確認してください。トランザクションサイズが max_allowed_packet のサイズを超えないようにしてください。大きなトランザクションを分割する方法については、MySQL ウェブサイトの「Packet too large」(パケットが大きすぎる) を参照してください。

それでもエラーが表示される場合は、ソースバイナリログが破損している可能性があります。

バイナリログに問題がないか確認するには、次の手順を実行します。

  1. 次のコマンドを実行して、バイナリログが存在するかどうかを確認します。

    mysql> SHOW BINARY LOGS;
  2. バイナリログのイベントを表示するには、次のコマンドを実行します。

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

    注: binlog file をバイナリログ名に、position をイベントが発生した位置に置き換えます。

  3. バイナリログをダウンロードするには、次のコマンドを実行します。

    shell> mysqlbinlog \
        --read-from-remote-server \
        --host=MySQLInstance1.cg034hpkmmjt.region.rds.amazonaws.com \
        --port=3306  \
        --user ReplUser \
        --password \
        --raw \
        --verbose \
        --result-file=/tmp/ \
        binlog.00098
  4. エラーメッセージに記載されているバイナリログに破損がないかどうかを確認します。

  5. バイナリログが破損している場合は、AWS サポートケースを作成してください

"Binlog truncated in the middle of event; consider out of disk space on master..." (Binlog はイベントの途中で切り詰められました。マスターのディスク容量不足が考えられます...)

タスクログのエラー例:

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

上記のエラーは、次の理由で発生する場合があります。

  • プライマリサーバーに sync_binlog != 1 がある。つまり、バイナリログイベントはディスク上で同期されない可能性があります。詳細については、MySQL のウェブサイトで「sync binlog」(バイナリログの同期) を参照してください。
  • ソースデータベースでバイナリログが破損している。

このエラーを解決するには、ソースの sync_binlog パラメータの値が 1 に設定されていることを確認してください。その後、タスクを再開します。

sync_binlog パラメータがすでに 1 に設定されている場合は、バイナリログに破損がないかどうかを確認してください。手順については、前述の「"Log event entry exceeded max_allowed_packet; increase max_allowed_packet on master..."」セクションをご覧ください。

"Client requested master to start replication from impossible position" (クライアントは、不可能な位置からレプリケーションを開始するようにマスターに要求しました)

タスクログのエラー例:

[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 タスクを次のバイナリログ位置から開始します。

"Client requested master to start replication from position > file size" (「クライアントがマスターに、位置 > ファイルサイズからレプリケーションを開始するように要求しました」)

タスクログのエラー例:

[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 はこのエラーをログに記録します。バイナリログ暗号化を有効にすると、MySQL 8.0 をソースとして使用する CDC レプリケーションを使用できなくなります。詳細については、MySQL ウェブサイトの「Encrypting Binary Log Files and Relay Log Files」(バイナリログファイルとリレーログファイルの暗号化) を参照してください。

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

  1. 次のコマンドを実行して MySQL のバージョンを確認します。

    mysql> SELECT VERSION();
  2. 次のコマンドを実行して、binlog_encryptionON になっているかどうかを確認します。

    mysql> SELECT * FROM performance_schema.global_variables WHERE VARIABLE_NAME = 'binlog_encryption';
  3. binlog_encryption を無効にするには、次のコマンドを実行します。

    mysql> SET GLOBAL binlog_encryption = OFF;

    または、
    binlog_encryption をオフにした状態で AWS DMS タスクを開始し、次のコマンドを実行して binlog_encryption を有効にします。

    mysql> SET GLOBAL binlog_encryption = ON;

関連情報

Aurora MySQL 互換をソースとして AWS DMS を使用する際に発生する、バイナリロギングに関するエラーをトラブルシューティングする方法を教えてください

コメントはありません

関連するコンテンツ