61

これは数回尋ねられましたが、問題の解決策が見つかりません。基本的に、MySQL Workbench 管理ツールの組み込みツールである mysqldump を使用する場合、拡張挿入を使用してデータベースをダンプすると、大量の長いデータ行が表示されます。データを1つのコマンドとして挿入することで挿入を高速化するため(特にInnoDBで)、なぜこれを行うのか理解していますが、フォーマットにより、ダンプファイル内のデータを実際に見たり、2つのファイルを差分ツールで比較したりすることが非常に困難になりますそれらをバージョン管理などに保存している場合。私の場合、ダンプファイルを使用して統合テストデータベースを追跡するため、バージョン管理に保存しています。

拡張挿入をオフにできることがわかったので、1 行に 1 つの挿入を取得できますが、これは機能しますが、ダンプ ファイルを使用して復元を行うときはいつでも遅くなります。

私の核となる問題は、ファイルをダンプするときに使用していた古いツール (MySQL Administrator) では、基本的に同じことを行いますが、INSERT ステートメントをフォーマットして、1 行に 1 つの挿入を行いながら、一括挿入を行うことです。したがって、これの代わりに:

INSERT INTO `coupon_gv_customer` (`customer_id`,`amount`) VALUES (887,'0.0000'),191607,'1.0300');

あなたはこれを得る:

INSERT INTO `coupon_gv_customer` (`customer_id`,`amount`) VALUES 
 (887,'0.0000'),
 (191607,'1.0300');

どのようなオプションを試しても、このようなダンプを取得できる方法はないようです。これは、両方の世界で本当に優れています。はい、もう少しスペースが必要ですが、ファイルを読み取るために人間が必要な状況では、はるかに便利になります.

何か不足していて、MySQLDump を使用してこれを行う方法がありますか?それとも、古い (現在は非推奨の) MySQL 管理者ツールのこの機能が利用できなくなったために、すべて逆行したのでしょうか?

4

9 に答える 9

42

次のオプションを使用してみてください: --skip-extended-insert

それは私のために働いた。

于 2013-08-02T07:06:16.493 に答える
38

デフォルトの mysqldump 形式では、ダンプされた各レコードは、ダンプ ファイル (つまり、sql ファイル) 内に個別の INSERT コマンドをそれぞれ独自の行に生成します。これはソース管理 (例: svn、git など) に最適です。これにより、差分とデルタの解決がより細かくなり、最終的にはより効率的なソース管理プロセスが実現します。ただし、非常に大きなサイズのテーブルの場合、これらすべての INSERT クエリを実行すると、SQL ファイルからの復元が非常に遅くなる可能性があります。

--extended-insert オプションを使用すると、ダンプされた sql ファイルの単一行ですべてのレコードを単一の INSERT コマンドにラップすることで、複数の INSERT の問題が修正されます。ただし、ソース管理プロセスは非常に非効率になります。テーブルの内容全体は sql ファイルの 1 行で表され、そのテーブルのどこかで 1 文字が変更されると、ソース管理は行全体 (テーブル全体) にバージョン間の差分としてフラグを立てます。また、大きなテーブルの場合、正式なソース管理システムを使用するメリットの多くが失われます。

したがって、理想的には、データベースを効率的に復元するために、SQL ファイルで、各テーブルを 1 つの INSERT で表す必要があります。効率的なソース管理プロセスのために、SQL ファイルでは、その INSERT コマンドの各レコードをそれぞれの行に配置する必要があります。

これに対する私の解決策は、次のバックアップ スクリプトです。

#!/bin/bash

cd my_git_directory/

ARGS="--host=myhostname --user=myusername --password=mypassword --opt --skip-dump-date"
/usr/bin/mysqldump $ARGS --database mydatabase | sed 's$VALUES ($VALUES\n($g' | sed 's$),($),\n($g' > mydatabase.sql

git fetch origin master
git merge origin/master
git add mydatabase.sql
git commit -m "Daily backup."
git push origin master

結果は、次のような SQL ファイルの INSERT コマンド形式になります。

INSERT INTO `mytable` VALUES
(r1c1value, r1c2value, r1c3value),
(r2c1value, r2c2value, r2c3value),
(r3c1value, r3c2value, r3c3value);

いくつかのメモ:

  • コマンドラインのパスワード...私は知っていますが、安全ではなく、別の議論です。
  • --opt: 特に --extended-insert オプションをオンにします (つまり、テーブルごとに 1 つの INSERT)。
  • --skip-dump-date: mysqldump は通常、SQL ファイルの作成時に日付/時刻スタンプを挿入します。バージョン間の唯一の差分がその日付/時刻スタンプである場合、これはソース管理で厄介になる可能性があります。OS とソース管理システムは、ファイルとバージョンに日付/時刻のスタンプを付けます。SQLファイルでは実際には必要ありません。
  • git コマンドは基本的な質問 (SQL ファイルのフォーマット) の中心ではありませんが、SQL ファイルをソース管理に戻す方法を示しています。同様のことが svn で実行できます。この sql ファイル形式を選択したソース管理と組み合わせると、ユーザーが作業コピーを更新するときに、インターネット上でデルタ (つまり、変更されたレコード) を移動するだけでよく、diff ユーティリティを利用できることがわかります。データベース内のどのレコードが変更されたかを簡単に確認できます。
  • リモート サーバーに存在するデータベースをダンプする場合は、可能であれば、そのサーバーでこのスクリプトを実行して、各ダンプでネットワーク全体にデータベースの内容全体をプッシュしないようにします。
  • 可能であれば、このスクリプトを実行しているのと同じサーバー上に、SQL ファイル用の作業ソース管理リポジトリを確立します。そこからリポジトリにチェックインします。これにより、ダンプのたびにネットワーク全体にデータベース全体をプッシュする必要がなくなります。
于 2013-11-13T18:23:51.983 に答える
12

他の人が言っているように、"),(" を置き換えるために sed を使用するのは安全ではありません。これは、データベースのコンテンツとして表示される可能性があるためです。

$ mysqldump -u my_db_user -p -h 127.0.0.1 --skip-extended-insert my_database > my_database.sql
$ sed ':a;N;$!ba;s/)\;\nINSERT INTO `[A-Za-z0-9$_]*` VALUES /),\n/g' my_database.sql > my_database2.sql

「sed -i」を使用してインラインを置き換えることもできます。

このコードが行っていることは次のとおりです。

  1. --skip-extended-insert は、行ごとに 1 つの INSERT INTO を作成します。
  2. 次に、sed を使用してデータをクリーンアップします。sed を使用した通常の検索/置換は単一行に適用されるため、sed は一度に 1 行ずつ動作するため、「\n」文字を検出できないことに注意してください。そのため、「:a;N;$!ba;」と入力します。これは基本的に、複数行を検索して次の行をバッファリングするようにsedに指示します。

お役に立てれば

于 2014-11-07T19:50:27.227 に答える
6

これは不可能だと思います。古い MySQL Administrator で、mysqldump ツールから完全に独立した db オブジェクトをダンプするためのコードを作成したため、多数の追加オプション (このフォーマットや進行状況のフィードバックなど) を提供しました。MySQL Workbench では、代わりに mysqldump ツールを使用することが決定されました。これは、いくつかの点で後退し、バージョンの問題を引き起こすだけでなく、サーバーを常に最新の状態に保つという利点があります。

簡単に言えば、現在 mysqldump でフォーマットを行うことはできません。

于 2013-04-02T06:50:40.480 に答える
0

このツールは、拡張挿入を処理するのに非常に役立ちます: http://blog.lavoie.sl/2014/06/split-mysqldump-extended-inserts.html

mysqldump 出力を解析し、各レコードの後に​​改行を挿入しますが、より高速な拡張挿入を引き続き使用します。sed スクリプトとは異なり、正規表現が文字列内でたまたま一致した場合に、間違った場所で改行するリスクはありません。

于 2015-03-06T05:38:13.870 に答える