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_packet変数(デフォルト値は1MB)を設定して、クエリの制限を増やすことができます。クライアント側で最大パケットサイズを増やす必要がある場合もあります。パケットサイズの設定に関する詳細は、セクションC.5.2.10「パケットが大きすぎます」に記載されています。
非常に多くの行を挿入するINSERTまたはREPLACEステートメントも、この種のエラーを引き起こす可能性があります。これらのステートメントのいずれかは、挿入される行の数に関係なく、サーバーに単一の要求を送信します。したがって、INSERTまたはREPLACEごとに送信される行の数を減らすことにより、多くの場合エラーを回避できます。
勧告
デフォルトは1Mであるため、max_allowed_packetの値をはるかに大きくしてみてください。現在のデータセットにある最大の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;
試してみる !!!