Mysqldumpを使用して、バックアップ用のフラットファイルを作成します。このファイルを使用して、代替サーバーでデータベースを再作成しました。コマンドラインでsshを使用してインポートプロセスを実行したところ、複数のPacket too Large
エラー。
Mysqlをはるかに大きなmax_allowed_packet(つまり、1000M)で再起動しても、エラーが発生しました。インポートファイルでmax_allowed_packetを設定しようとしても、エラーが発生しました。
Max_allowed_packetが設定されていることを確認する方法や、この問題を引き起こさないファイルを作成するmysqldumpを使用する方法はありますか?
参考のため:
非圧縮のmysqldumpファイルは〜2GB
データベースタイプはINNODBです
最初に考えたのは max_allowed_packet が実際に制御するものでした。これが私が見つけたものです:
「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_packetの定義を前提として、次に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に対応できます。
MySQLのmax_allowed_packet
は、それを開始したシェルの制限内である必要があります-ulimit -a
表示data seg size
は無制限ですか?
何らかの理由で、 max_allowed_packet
はmysqldump
によって無視されます (design によって?実際の補数はnet_buffer_length
。代わりに試してください
mysqldump --net_buffer_length=100k -u root -p databasename > dump.sql