通信パケットの読み取りMySQLエラー


42

MySQLエラーログでは、次のような警告がかなり表示されます。

120611 16:12:30 [Warning] Aborted connection 2619503 to db: 'db_name' user: 'user_name' host: 'webapp_hostname' (Got an error reading communication packets)

データ自体の損失に気付いていないので、この警告が何を意味するのか、それが何を引き起こすのか、そしてこれらを引き起こす問題にどのように対処するのか疑問に思います。これは、RHEL 6.1およびMySQL Enterprise 5.5にあります。

回答:


50

MySQL Connectionsのサイレントキラーの1つはMySQLパケットです。

最初に、MySQLパケットとは何かを理解しましょう。

「MySQL内部の理解」(ISBN 0-596-00957-7)の99ページによると、MySQLパケットを説明する1〜3段落があります。

MySQLネットワーク通信コードは、クエリが常に合理的に短いため、MySQLの用語ではパケットと呼ばれる1つのチャンクでサーバーに送信および処理できるという前提で作成されました。サーバーは、パケットを格納するための一時バッファにメモリを割り当て、完全に収まるのに十分な量を要求します。このアーキテクチャでは、サーバーのメモリ不足を回避するための予防措置が必要です。このオプションでは、パケットサイズの上限を設定しています。

このオプションに関連する重要なコードは sql / net_serv.ccにあります。my_net_read()を見て、my_real_read()の呼び出しに従い、net_realloc()に特に注意を払って ください

この変数は、多くの文字列関数の結果の長さも制限します。詳細については、sql / field.ccおよび sql / intem_strfunc.ccを参照してください。

MySQLパケットについてこれを知ることにより、開発者/ DBAは、サイズが大きすぎても1つのパケット内に複数のBLOBを収容できるようにサイズを調整できます。間違いなく、小さすぎるパケットは、この点で開いている接続に問題を引き起こします。

MySQLドキュメントによると

  • 間違っているか大きすぎるクエリをサーバーに送信した場合にも、これらのエラーが発生する可能性があります。mysqldが受信したパケットが大きすぎるか、順序が乱れている場合、クライアントで何らかの問題が発生したと見なし、接続を閉じます。大きなクエリが必要な場合(たとえば、大きなBLOB列を使用している場合)、サーバーのmax_allowed_pa​​cket変数(デフォルト値は1MB)を設定して、クエリの制限を増やすことができます。クライアント側で最大パケットサイズを増やす必要がある場合もあります。パケットサイズの設定に関する詳細は、セクションC.5.2.10「パケットが大きすぎます」に記載されています。

  • 非常に多くの行を挿入するINSERTまたはREPLACEステートメントも、この種のエラーを引き起こす可能性があります。これらのステートメントのいずれかは、挿入される行の数に関係なく、サーバーに単一の要求を送信します。したがって、INSERTまたはREPLACEごとに送信される行の数を減らすことにより、多くの場合エラーを回避できます。

勧告

デフォルトは1Mであるため、max_allowed_pa​​cketの値をはるかに大きくしてみてください。現在のデータセットにある最大のTEXTフィールドまたはBLOBフィールドの約10倍をお勧めします。

max_allowed_pa​​cketを256Mに設定するには、/ etc / my.cnfまたはmy.iniに追加できます

[mysqld]
max_allowed_packet=256M

mysqldの将来の再起動をカバーします。サーバーに値を今すぐ​​インストールするには、次を実行してください:

SET GLOBAL max_allowed_packet = 1024 * 1024 * 256;

試してみる !!!


非常に良い説明。
ヴァシリスラウダス

4

ほとんどの場合、デフォルトでmax_connectionsは100になります。configパラメーターを増やしてみてください

max.connections = 400、my.cnfで設定した後、サーバーを再起動するか、動的に設定します。

    set @@global.max_connections = 400;

上記の推奨事項を試して、この警告メッセージを回避し、ネットワークにパケットドロップがないことを確認してください。


2

私は最近、MySQL Enterprise 5.1.xから5.7.xに移行した後にこの問題に遭遇しましたが、アプリケーションに大幅なコード変更を加えることなく、「メモ」が表示され始めました。

私の場合、「メモ」が表示される根本的な原因は、接続が開いたままでプログラムが終了したことです。接続が閉じられない状況はもう少し複雑で、MySQLに関連するものではなく、ACE、スレッド、TSSに関連していました。


0

このmy.ini行は私の問題を解決しました:

log_error_verbosity=1

参照このリンクを


16
根本的な問題を解決したとは思わないが、単にログに記録されるのを止めただけだ。
user19292

1
同じメッセージが「メモ」として報告されていました。log_error_verbosity = 2を使用すると、実際に「問題」が解決されます(ただし、「警告」に対処する必要がありますが、無視しないでください)
-xtian
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.