web-dev-qa-db-ja.com

max_allowed_pa​​cketパラメータを指定してmysqldumpを使用すると、mysqlへの接続が失われる

リモートサーバーデータベースの特定のテーブルをダンプしたいのですが、正常に機能しますが、テーブルの1つが9m行であり、次のようになります。

Lost connection to MySQL server during query when dumping table `table_name` at row: 2002359

オンラインで読んだ後、max_allowed_pa​​cketを増やす必要があることを理解し、コマンドに追加することができます。

次のコマンドを実行してテーブルをダンプします。

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のレコード...大きすぎない。

7
JohnBigs

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" | \
          ...

すべての行を取得するまで。首の痛みですが、うまくいきます。

1
O. Jones