web-dev-qa-db-ja.com

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

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にあります。

46
KM.

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

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

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

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

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

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

MySQLパケットについてこれを知ることにより、開発者/ DBAは、それらが不愉快に大きい場合でも、1つのパケット内の複数のBLOBに対応するようにサイズを上げることができます。確かに、小さすぎるパケットは、この点で開いている接続に問題を引き起こします。

MySQL Documentation によれば

  • 正しくないか大きすぎるクエリをサーバーに送信した場合にも、これらのエラーが発生する可能性があります。 mysqldが受信したパケットが大きすぎるか、順序が乱れている場合、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;

試してみる !!!

54
RolandoMySQLDBA

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

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

    set @@global.max_connections = 400;

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

4
Gopinath

MySQL Enterprise5.1.xから5.7.xに移動した後、この問題に最近遭遇しましたが、アプリケーションに大きなコード変更はありません「note」が表示され始めました。

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

2
Voltaire

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

log_error_verbosity=1

参照 this リンク

0
JeWoPeR

ここでは言及されていないため、この問題の別の原因を含めます。私の場合、mysqlコマンドラインクライアントを使用しているときに、エラーはinteractive_timeoutの30秒という低い値が原因で発生しました。
https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_interactive_timeout
これはセッション全体で持続しますが、サーバーの再起動はしません。

SET GLOBAL interactive_timeout=6000;
0
lainatnavi