web-dev-qa-db-ja.com

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

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

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

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

参考のため:

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

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

8
Patrick

最初に考えたのは 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に対応できます。

5
RolandoMySQLDBA

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

2
Gaius

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

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