MySQL ダンプから特定のテーブルを1つ抽出する

127 テーブルある 7 GB のダンプがあるが、ローカルで必要なのは3つだけ — usersordersproducts。よくある sed/grep のトリックがなぜ壊れるのか、そして必要なテーブルだけを(外部キーごと)数クリックで取り出す方法を解説します。

すべての作業がデータベース全体を必要とするわけではありません。ローカルで機能を開発しているとき、ディスクを埋め尽くしインポートに1時間かかる本番ダンプの全体が欲しいことはめったにありません。欲しいのは、その機能が実際に触れるわずかなテーブルだけです。

1つのテーブルをデバッグするときも同じです。orders のデータ問題を再現するのに、他の 126 テーブルは要りません。あるいは部分的な移行で、いくつかのテーブルだけを新しいサービスに移す場合も同様です。いずれの場合も問いは同じです。巨大なダンプからこのテーブルだけを、きれいに素早く取り出すにはどうすればいいのか?

sed/grep のアプローチと、それが壊れる理由

定番の答えは、mysqldump が各テーブルに書き出すセクションヘッダーの間を sed でファイルを切り取ることです:

# mysqldump ファイルから users テーブルを取り出す
sed -n '/-- Table structure for table `users`/,/-- Table structure for table/p' dump.sql > users.sql

巧妙に見えますし、小さくて整ったダンプなら一度はうまくいくかもしれません。しかし実際の 7 GB のファイルでは、多くの微妙な形で崩れます:

結局 grep の上に awk、その上に sed を積み重ね、サブセットでテストしても、結果をまだ信用できません。もっと良い方法があります。

DumpCleaner でテーブルを抽出する

DumpCleaner はダンプを正しくパースします。文の境界、複数行の INSERT、バッククォート、コメントを理解するので、常に正しい行で切り取ります。必要なテーブルの抽出は4ステップです:

  1. .sql ダンプをドラッグして入れます。DumpCleaner はファイルをストリーミングするので、7 GB のダンプも全体を読み込まず一定のメモリで開きます。
  2. 自動検出されたテーブル一覧を読みます。すべてのテーブルがパースされ、行数とサイズ付きで一覧表示されます。何百万行もスクロールして中身を探す必要はありません。
  3. 欲しいテーブルを選びます。usersordersproducts にチェックを入れるか、*_logs のような正規表現/除外パターンを入力してグループ全体を一度に外します。
  4. 外部キーの親を含めてエクスポートします。必要なら参照先の親テーブルを自動的に取り込み、クリーンでインポート可能なファイルを書き出します。

シェルツールよりずっと手間が少なくなる点がいくつかあります:

必要なテーブルだけ — それ以外は何も

DumpCleaner はどんなサイズのダンプからも特定のテーブルを抽出します。ストリーミングで、メモリ消費は一定、外部キーも解決済み。ネイティブの macOS & iPadOS アプリ、買い切り。

App Store でダウンロード

よくある質問

複数のテーブルを一度に抽出できますか?

はい。好きなだけテーブルにチェックを入れられます — usersordersproducts を一緒に — DumpCleaner はそれらすべてを1回のパスで1つのファイルに書き出します。

外部キーの依存関係は保たれますか?

任意で保てます。外部キーの依存関係を含めるをオンにすると、選択が参照する親テーブルが自動的に取り込まれ、抽出物が制約エラーなしでインポートできます。

パターンでテーブルを除外できますか?

はい。*_logs*_sessions のような除外パターン、または正規表現を使って、1つずつチェックを外す代わりにテーブルのグループ全体を除外できます。

PostgreSQL でも動作しますか?

はい。DumpCleaner は MySQL、MariaDB、PostgreSQL(pg_dump)のダンプを読み込み、テーブル抽出時に public.users のようなスキーマ修飾名も扱います。

sed と grep との格闘をやめる

ドラッグして、テーブルを選び、エクスポート。DumpCleaner は必要なテーブルだけを — 外部キーごと — どんなダンプからも取り出します。

App Store でダウンロード