max_allowed_pa​​cketを変更しても「Packet Too Large」エラーが発生する


8

mysqldumpを使用して、バックアップ用のフラットファイルを作成します。このファイルを使用して、代替サーバーでデータベースを再作成しました。コマンドラインでsshを使用してインポートプロセスを実行したところ、複数のPacket too Largeエラーが発生しました。

より大きなmax_allowed_pa​​cket(つまり、1000M)でmysqlを再起動しても、エラーが発生しました。インポートファイルでmax_allowed_pa​​cketを設定しようとしても、エラーが発生しました。

max_allowed_pa​​cketが設定されていることを確認する方法や、この問題を引き起こさないファイルを作成するmysqldumpを使用する方法はありますか?

参考のために:

非圧縮のmysqldumpファイルは〜2GB

データベースタイプはINNODBです

回答:


5

最初に考えたのは、max_allowed_pa​​cketが実際に制御するものです。これが私が見つけたものです:

「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を参照してください。

そのmax_allowed_pa​​cketの定義を考慮して、次にServerFaultから何かを発見しました:innodb_log_file_sizeとinnodb_log_buffer_sizeの組み合わせは、大きなものがある場合、最大のblobオブジェクトの10倍より大きくなければなりません。

これら2つのことを念頭に置いて、/ etc / my.cnfのinnodb_log_file_sizeを、許可されている最大サイズの2047Mに増やします。もちろんこれには以下が必要です

service mysql stop
rm -f /var/lib/mysql/ib_logfile*
service mysql start

これにより、データに含まれる可能性のある大きなblobに対応できます。


その10xがどこから来るのか興味があります-それは単なる経験則ですか、それともMySQLに10個の固定バッファを割り当てるため、それらの1つが十分に大きいことを確認するために10個必要であるというコードがありますか?
Gaius

この本は権威がありますか?
Pacerier、2015

2

MySQL max_allowed_packetは、それを開始したシェルの制限内にある必要があります- ulimit -aそれdata seg sizeが無制限であることを示していますか?


2

何らかの理由で、max_allowed_packet-by designmysqldumpによって無視されますか?実際の補数はnet_buffer_lengthです。代わりに試してください

mysqldump --net_buffer_length=100k -u root -p databasename > dump.sql

それは非常に啓発的です!!! バグレポートでは、この問題に関連して拡張挿入について説明しているため、おそらく--skip-extended-insertを実行すると一部が補正される可能性がありますが、より大きなmysqldumpが生成されます。オラクルが死ぬために残すラフでこのダイヤモンドを見つけた+1 for You !!!
RolandoMySQLDBA

--skip-extended-insertは確実に機能しますが、私のデータベースでは復元が100倍遅くなり、使用できなくなりました。
Leopd、2011年

すみません、お悔やみ申し上げます。mysqldumpでCSVファイルを作成し、LOAD DATA INFILEを使用してそれらを再度ロードし、bulk_insert_buffer_sizeを1Gまたは2Gに増やしてみてください。ねえ、あなたは決して知りません!!!
RolandoMySQLDBA
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.