リモートサーバーデータベースの特定のテーブルをダンプしたいのですが、正常に機能しますが、テーブルの1つが9m行であり、次のようになります。
Lost connection to MySQL server during query when dumping table `table_name` at row: 2002359
オンラインで読んだ後、max_allowed_packetを増やす必要があることを理解し、コマンドに追加することができます。
次のコマンドを実行してテーブルをダンプします。
mysqldump -uroot -h my.Host -p'mypassword' --max_allowed_packet=512M db_name table_name | gzip > dump_test.sql.gz
そして、何らかの理由で、私はまだ得ます:
Lost connection to MySQL server during query when dumping table `table_name` at row: 2602499
私は何か間違ったことをしていますか?
その奇妙な、たった9mのレコード...大きすぎない。
mysqldump
コマンドに--quick
オプションを追加してみてください。大きなテーブルでより効果的に機能します。テーブル全体を丸呑みして書き込むのではなく、結果セットから出力に行をストリーミングします。
mysqldump -uroot -h my.Host -p'mypassword' --quick --max_allowed_packet=512M db_name table_name | \
gzip > dump_test.sql.gz
Mysqldumpコマンドに--compress
オプションを追加してみることもできます。これにより、MySQLサーバーへのネットワークフレンドリーな圧縮接続プロトコルが使用されます。 gzip
パイプがまだ必要であることに注意してください。 MySQLの圧縮プロトコルでは、ダンプはmysqldump
圧縮された状態で出力されません。
サーバーがmysqldump
クライアントへの接続をタイムアウトしている可能性もあります。タイムアウト期間をリセットしてみてください。他の方法でサーバーに接続し、これらのクエリを発行してから、mysqldump
ジョブを実行します。
これらは、タイムアウトを1暦日に設定します。
SET GLOBAL wait_timeout=86400;
SET GLOBAL interactive_timeout=86400;
最後に、サーバーが(ルーターやファイアウォールを介して)マシンから遠く離れている場合、何かがmysqldump
の接続を妨害している可能性があります。一部の劣ったルーターとファイアウォールは、NAT(ネットワークアドレス変換))セッションに時間制限があります。それらは、使用中にこれらのセッションを存続させると想定されていますが、そうでないものもあります。会社が外部接続用に構成した時間またはサイズの制限に達しています。
サーバーに近いマシンにログインし、mysqldump
を実行してみてください。次に、他の手段(sftp?)を使用して、gzファイルを自分のマシンにコピーします。
または、このファイルのダンプをセグメント化する必要がある場合があります。このようなことを行うことができます(デバッグされません)。
mysqldump -uroot -h my.Host -p'mypassword' \
db_name table_name --skip-create-options --skip-add-drop-table \
--where="id>=0 AND id < 1000000" | \
gzip....
次に、これらの行でそれを繰り返します。
--where="id>=1000000 AND id < 2000000" | \
--where="id>=2000000 AND id < 3000000" | \
...
すべての行を取得するまで。首の痛みですが、うまくいきます。