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) 

Haven “はデータ自体の損失に気づかなかったので、この警告が何を意味するのか、何が原因であるのか、そしてこれらの原因となる問題にどのように対処できるのか疑問に思っています。これはRHEL6.1とMySQLにあります。 Enterprise5.5。

回答

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

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

「MySQL内部について」(ISBN 0-596-00957)の99ページのによると-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は複数のBLOBに対応できるようにサイズを変更できます。たとえそれらが不愉快に大きいとしても、1つのパケットの中に。確かに、パケットが小さすぎると、この点で開いている接続に問題が発生します。

によるとMySQLドキュメント

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

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

推奨事項

max_allowed_packet は、デフォルトが1Mであるため、はるかに大きな数になります。 ldは、現在のデータセットにある最大のTEXTまたはBLOBフィールドの約10倍を提案します。

max_allowed_packetを256Mに設定するには、それを/etc/my.cnfまたはmy.iniに追加します

[mysqld] max_allowed_packet=256M 

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

SET GLOBAL max_allowed_packet = 1024 * 1024 * 256; 

試してみてください!!!

コメント

  • 非常に良い説明です。
  • @RolandoMySQLDBA上記のすべての解決策を試した後も、5.7.28でエラーが発生します。さらにトラブルシューティングするためのヒント

回答

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

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

 set @@global.max_connections = 400; 

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

回答

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

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

回答

ここでは言及されていないので、この問題の別の原因を含めています。私の場合、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; 

回答

MariaDB10.3.24で同じ問題が発生しました。警告は、上記のすべての理由といくつかの理由で発生する可能性があるようです。私の場合、フィールドの1つに空のディクショナリ値があるデータベーステーブルの1つのレコードが原因でした。

+ —- + ——– + | id |設定| + —- + ——– + | 3 | {} | + —- + ——– +

テストとして、「{}」を「()」に変更すると、メッセージが停止しました。誰かに役立つ場合に備えて。

回答

このmy.ini行で問題が解決しました:

log_error_verbosity=1 

参照このリンク

コメント

  • '根本的な問題を解決したとは思いませんが、ログに記録するのをやめただけです。
  • 同じメッセージが"注"。 log_error_verbosity = 2を使用すると、実際には"の問題"が解決されます(ただし、"警告"は、無視するのではなく、対処する必要があります)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です