「Got an error reading communication packets」(通信パケットの読み込み中にエラーが発生しました) というエラーが表示されました。Amazon Relational Database Service (Amazon RDS) for MySQL または Amazon Aurora MySQL 互換エディションの DB インスタンスで、このエラーを解決したいと考えています。
簡単な説明
サーバーとクライアントの接続が切断された場合、不適切に閉じられた場合、または失敗した場合、Amazon RDS は aborted_clients または aborted_connects のいずれかのステータスカウンターを増やします。aborted_clients パラメータは、接続が適切に閉じられずにクライアントが停止したために中断bされた接続の数を示します。aborted_connects パラメータは、MySQL サーバーへの接続試行が失敗した回数を示します。
log_error_verbosity は、エラーログを対象とするイベントを処理するための詳細度を指定します。このパラメータの値が 2 を超えると、RDS for MySQL は次の情報をエラーログに書き込みます。
[Warning] Aborted connection xxx to db: '<database name>' user: '<user name>' host: '<host IP>' (Got an error reading communication packets)
この警告は、aborted_clients または aborted_connects メトリクス値のステータスカウンターが増やされるたびにトリガーされます。Amazon RDS は、データベースエラーログを使用してこの情報を取得します。詳細については、MySQL サーバー Web サイトの Communication errors and aborted connections を参照してください。
接続中断の警告が発生する要因には、以下が含まれます (ただし、これらに限定されません)。
- クライアントまたはドライバーの非互換性
- アイドル状態の接続の閉鎖または接続のブロックが可能な、ファイアウォールまたはプロキシ。
- クライアント/サーバー接続が不適切に閉じられた結果として生じる、RDS for MySQL 内でのスリープ状態の接続数の増加。
- 接続を不適切に終了したクライアントアプリケーション。接続が一定時間アイドル状態になると、MySQL はこれらの接続を強制的に閉じます。その後、接続中断のメッセージが表示されます。
- wait_timeout または interactive_timeout のしきい値を超えるアイドル状態の接続。
- 接続パケットの取得時に connect_timeout 秒のしきい値を超えるクライアント接続。
- 不十分なパラメータの値 (net_write_timeout、net_read_timeout など) 。
- パラメータの値 max_allowed_packet を超過。このパラメータの値が小さすぎる場合、またはクエリで RDS for MySQL に割り当てられているメモリよりも多くのメモリを必要とする場合、接続の中断警告が発生します。
解決方法
RDS for MySQL または Aurora MySQL 互換で接続の中断エラーが表示された場合は、MySQL パラメータ値を必ず確認してください。問題の根本原因を特定したら、MySQL エラーログをモニタリングしながら、パラメータを更新して新しい値をテストします。
Amazon RDS で接続の中断エラーのトラブルシューティングを行う場合は、次のアプローチを検討してください。
- Amazon RDS パラメータグループのデフォルト値を使用しているかどうかチェックします。接続タイムアウトに関連するパラメータのデフォルト値は、DB インスタンスに適していない場合があります。詳細については、「Amazon RDS for MySQL のパラメータを設定するためのベストプラクティス」の Parameters related to connectivity timeout (接続タイムアウトに関連するパラメータ) セクションを参照してください。
- connect_timeout に大きい値を設定して、この設定が接続の中断エラーメッセージの発生を減らすのに役立つかどうかを確認します。このパラメータは、MySQL サーバーインスタンスが不正なハンドシェイクで応答するまでの待機時間 (秒単位) を指定します。
- interactive_timeout と wait_timeout を変更します。接続プーリング (Java など) を使用するアプリケーションには、接続プールの設定に一致するタイムアウト値が必要です。
- インスタンスで大きなクエリを処理する必要がある場合は、max_allowed_packet の値を増やします。行にクライアントの max_allowed_packet 値よりも多くのデータがある場合、エラーが報告されます。大きな BLOB 列または長い文字列を使用している場合は、この値を増やします。詳細については、「Amazon RDS for MySQL のパラメータを設定するためのベストプラクティス」の max_allowed_packet セクションを参照してください。
- net_write_timeout と net_read_timeout の値を増やします。 注: これらの値は wait_timeout と同じ値に設定できます。
- RDS for MySQL または Aurora MySQL 互換の接続が適切に閉じられていることを確認してください。データベースを終了する前に、必ずクライアントアプリケーションから mysql_close () 関数を呼び出してください。
トラブルシューティングのヒント
接続の中断エラーメッセージが引き続き表示される場合は、次のトラブルシューティングのヒントをお試しください。
sudo tcpdump -vvv --interface eth0 port 3306 -W 10 -C 100
関連情報
Amazon RDS DB パラメータグループの値を変更するにはどうすればよいですか?
RDS DB インスタンスで DB への接続が切断されたのはなぜですか?
Aurora Serverless クラスターでログをオンにして、ログを表示およびダウンロードする方法を教えてください。