web-dev-qa-db-ja.com

接続の中断(通信パケットの読み取りエラーが発生しました)Amazon RDS上のMySQL

MySQLで次の警告が表示されます。

接続の中断(通信パケットの読み取りエラーが発生しました)

MySQLホスティングにAmazon RDSを使用しています。 MyISAMとInnoDBの両方のストレージエンジンが使用されています(少し変だと思いますが、レガシーコードです)。データベースはPHPアプリケーションのストレージとして使用されます。MySQLのバージョンは5.5.27です。PHP古いmysql拡張を使用してMySQLに接続します( http: //www.php.net/manual/en/ref.mysql.php

私が試したこと:

  1. max_allowed_packetを1Gに増やします( MySQL Error Reading Communication Packets で推奨)。
  2. innodb_log_file_sizeおよびinnodb_log_buffer_sizeを変更しようとしました( MySQL:通信パケットの読み取りエラー で提案されています)。残念ながら、Amazon RDSではinnodb_log_file_sizeを変更できません。 innodb_log_buffer_sizeを可能な最大値(4294967295)に変更しようとすると、互換性のない設定が原因でデータベースインスタンスが起動しませんでした。
  3. このデータベースを使用するPHPアプリケーションは、すべてのリクエストにデータを挿入し、それが問題を引き起こす可能性があると考えたため、すべてのリクエストで実行されるINSERTステートメントを削除しましたが、結果は同じです。
  4. PHPアプリケーションは、実行するクエリごとに新しいMySQL接続を作成することがわかりました。変更しましたので、すべてのクエリに同じ接続を使用します。
  5. Amazon RDSインスタンスを、PHPアプリケーションを含むEC2インスタンスが配置されているのと同じアベイラビリティーゾーンに移動しました。
  6. データベースインスタンスをdb.m1.smallからdb.m1.mediumにアップグレードしました。
  7. max_connections設定を128から256に変更しました。

これらのすべての手順は、問題の解決に役立ちませんでした。

また、このエラーは常に15分ごとまたは30分ごとに発生することに気付きました。エラーログから:

140528 16:30:00 [警告]データベースへの接続8709が中止されました: 'multisite5'ユーザー: 'uo_proxy'ホスト: 'ip-10-180-232-23.ec2.internal'(通信パケットの読み取りエラーが発生しました)

140528 16:30:00 [警告]データベースへの接続8706が中止されました: 'uoserver'ユーザー: 'uo_proxy'ホスト: 'ip-10-180-232-23.ec2.internal'(通信パケットの読み取りエラーが発生しました)

140528 16:30:00 [警告]データベースへの接続8708を中止しました: 'uoserver'ユーザー: 'uo_proxy'ホスト: 'ip-10-180-232-23.ec2.internal'(通信パケットの読み取りエラーが発生しました)

140528 16:45:00 [警告]データベースへの接続11675を中止しました: 'multisite5'ユーザー: 'uo_proxy'ホスト: 'ip-10-180-232-23.ec2.internal'(通信パケットの読み取りエラーが発生しました)

140528 16:45:00 [警告]データベースへの接続11674を中止しました: 'uoserver'ユーザー: 'uo_proxy'ホスト: 'ip-10-180-232-23.ec2.internal'(通信パケットの読み取りエラーが発生しました)

エラーがいくつかのcronスクリプトによってトリガーされると私は考えていました。理論をテストするためにすべてのcronスクリプトを無効にしましたが、それでもエラーは発生します。

おそらく、RDSの制限のためにサーバー側でこの問題を解決することは不可能ですが、どのタイプのSQLクエリがこのエラーをトリガーできるのでしょうか?たとえば、SQLクエリで大きなBLOBフィールドを使用する場合、または1つのステートメントに多くの行を挿入する場合、誰かがmax_allowed_packetを増やしたいと思う可能性があることを読んだことがあります。だから問題は-MySQLサーバーをinnodb_log_file_sizeinnodb_log_buffer_sizeの現在の値で満足させるために何を変更できるか?多分それは遅いクエリ、または多すぎる同時接続、または何か他のものですか?残念ながら、データベースをRDSからEC2に移動することは、私が選択する最後のオプションです。なぜなら、私が言ったように、データベースチューニングの経験がないため、バックアップやレプリケーションなどをセットアップするのが難しいからです。

さらに詳細を提供する必要がある場合はお知らせください。私はデータベースの専門家ではないため、重要な情報を見逃す可能性があります。

前もって感謝します!

上記の手順を試したので、あなたのこだわりは変更できないもののようです。

2012年8月に投稿しました( ローカルデータベースvs Amazon RDS )。DB接続の数とバッファーサイズがRDSサーバーモデルでそれぞれ固定され不変であることに言及しています。また、トランザクションログは128Mに固定されていることにも言及しました。使用するRDSサーバーモデルに関係なく

提案:親切にしてください。 RDSからEC2にDBを移行します。次に、InnoDBインフラストラクチャを変更するために必要な柔軟性が得られます。したがって、自分でバックアップを作成し、レプリケーションを手動でセットアップする必要があります。

EC2に行くことが最後の手段だとおっしゃっていましたね。 RDS環境ではInnoDBを効果的に調整できないため、次の論理的なステップはEC2です。

2
RolandoMySQLDBA