MySQL Connectionsのサイレントキラーの1つはMySQLパケットです。これにより、MySQLレプリケーションのI / Oスレッドも被害を受ける可能性があります。
MySQLドキュメントによると
間違っているか大きすぎるクエリをサーバーに送信した場合にも、これらのエラーが発生する可能性があります。mysqldが受信したパケットが大きすぎるか、順序が乱れている場合、クライアントで何らかの問題が発生したと見なし、接続を閉じます。大きなクエリが必要な場合(たとえば、大きなBLOB列を使用している場合)、サーバーのmax_allowed_packet変数(デフォルト値は1MB)を設定して、クエリの制限を増やすことができます。クライアント側で最大パケットサイズを増やす必要がある場合もあります。パケットサイズの設定に関する詳細は、セクションC.5.2.10「パケットが大きすぎます」に記載されています。
非常に多くの行を挿入するINSERTまたはREPLACEステートメントも、この種のエラーを引き起こす可能性があります。これらのステートメントのいずれかは、挿入される行の数に関係なく、サーバーに単一の要求を送信します。したがって、INSERTまたはREPLACEごとに送信される行の数を減らすことにより、多くの場合エラーを回避できます。
少なくとも、mysqldumpしたマシンとロードしているマシンの両方のパケットサイズが同じであることを確認する必要があります。
次の2つのアプローチがあります。
アプローチ#1:--skip-extended-insertを使用してmysqldumpを実行します
これにより、MySQLパケットが複数のBLOB、TEXTフィールドであふれないようにします。これにより、SQL INSERTは一度に1つずつ実行されます。主な欠点は
- mysqldumpははるかに大きい
- このようなダンプの再読み込みには、はるかに時間がかかります。
アプローチ#2:max_allowed_packetを増やす
これは、mysqlを再起動するだけなので、これが推奨される方法です。MySQLパケットが何であるかを理解すると、これが明らかになる場合があります。
「MySQL内部構造の理解」(ISBN 0-596-00957-7)の99ページによると、これを説明するパラグラフ1〜3があります。
MySQLネットワーク通信コードは、クエリは常に合理的に短いため、MySQL用語ではパケットと呼ばれる1つのチャンクでサーバーに送信および処理できるという仮定の下で作成されました。サーバーは、パケットを格納するための一時バッファにメモリを割り当て、完全に収まるのに十分な量を要求します。このアーキテクチャでは、サーバーのメモリ不足を回避するための予防措置が必要です。このオプションでは、パケットサイズの上限を設定しています。
このオプションに関連する重要なコードは
sql / net_serv.ccにあります。my_net_read()を見て、my_real_read()の呼び出しに従い、net_realloc()に特に注意を払って
ください。
この変数は、多くの文字列関数の結果の長さも制限します。詳細については、sql / field.ccおよび
sql / intem_strfunc.ccを参照してください。
この説明から、バルクINSERTを作成すると、MySQLパケットのロード/アンロードがかなり速くなります。これは、max_allowed_packetが与えられたデータの負荷に対して小さすぎる場合に特に当てはまります。
結論
MySQLのほとんどのインストールでは、通常これを256Mまたは512Mに設定します。データのロード時に「MySQLがなくなった」というエラーが発生した場合は、より大きな値で実験する必要があります。
max_allowed_packet
900Mに設定しようと しましたが、私は使用していました--skip-extended-insert
(そしてあなたは正しいです-それは巨大なdbダンプを作ります)が、それでも失敗します。おそらく回避できるので、ダンプ内の特定の行を疑っています。しかし、それはまだ奇妙です-ダンプは私のCentOSサーバーにうまくインポートできます。