1 つのテーブルのデータを取得する、1 つのテーブルを削除する、またはダンプ ファイル全体を個々のテーブルを含むファイルに分割する最も簡単な方法は何ですか? 私は通常、vi regex munging を大量に行うことになりますが、これらのことを awk/perl などを使用して行うより簡単な方法があるに違いありません。Google の検索結果の最初のページには、機能しない perl スクリプトが多数表示されます。
5 に答える
SQL ダンプから 1 つのテーブルを取得する必要がある場合は、grep、head、および tail を組み合わせて使用します。
例えば:
grep -n "CREATE TABLE" dump.sql
これにより、それぞれの行番号が得られるため、テーブルが 200 行目にあり、次のテーブルが 269 行目にある場合、次のようにします。
head -n 268 dump.sql > tophalf.sql
tail -n 69 tophalf.sql > yourtable.sql
これらの原則を拡張して、すべてをテーブルごとに 1 つのファイルに分割するスクリプトを作成できると思います。
ここでやりたい人いる?
bashループを開始するのに役立つかもしれない別のビット:
grep -n "CREATE TABLE " dump.sql | tr ':`(' ' ' | awk '{print $1, $4}'
これにより、次のような行番号とテーブル名の素敵なリストが得られます。
200 FooTable
269 BarTable
手間を省いて、mysqldump -T
可能であれば使用してください。
ドキュメントから:
--tab=パス、-T パス
タブ区切りのデータ ファイルを生成します。ダンプされたテーブルごとに、mysqldump は、テーブルを作成する CREATE TABLE ステートメントを含む tbl_name.sql ファイルと、そのデータを含む tbl_name.txt ファイルを作成します。オプション値は、ファイルを書き込むディレクトリです。
デフォルトでは、.txt データ ファイルは、列値の間にタブ文字を使用し、各行の終わりに改行を使用してフォーマットされます。--fields-xxx および --lines-terminated-by オプションを使用して、形式を明示的に指定できます。
注
このオプションは、mysqld サーバーと同じマシンで mysqldump を実行する場合にのみ使用してください。ユーザーには FILE 権限が必要であり、サーバーには、指定したディレクトリにファイルを書き込む権限が必要です。
このシェル スクリプトは、必要なテーブルを取得して に渡しますsplitted.sql
。
オプションを追加したので、正規表現を理解sed -r
できます。
また、MyDumpSplitter は、ダンプを個々のテーブル ダンプに分割できます。
Maatkitは、 mk-parallel-dumpとmk-parallel-restoreを使用すると、これに非常に適しているようです。
私はそれについて少し遅れていますが、それが誰かを助けることができるなら、データを別のMysqlサーバーにインポートするために巨大なSQLダンプファイルを分割しなければなりませんでした. 私がやったことは、システムコマンドを使用してダンプファイルを分割することでした。
split -l 1000 import.sql splited_file
上記は、1000 行ごとに sql ファイルを分割します。
これが誰かを助けることを願っています