すべての作業がデータベース全体を必要とするわけではありません。ローカルで機能を開発しているとき、ディスクを埋め尽くしインポートに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 のファイルでは、多くの微妙な形で崩れます:
- 複数行の INSERT。1つの
INSERT INTO ... VALUESが数千行にわたることがあります。sedやgrepのような行指向のツールはそうした行を途中で切り、パースできないファイルを作ってしまいます。 - バッククォートと特殊文字。列の値には文字列の中に
--、セミコロン、バッククォート、引用符、改行が含まれます。パターンが、区切り文字として意図されていないデータ内のテキストに一致してしまいます。 - 部分文字列としてのテーブル名。
userを抽出するとuser_roles、user_sessions、password_userまで拾ってしまいます。名前が他のものの部分文字列として現れるからです。 - コメントとヘッダーのズレ。正確なコメントの文言は MySQL、MariaDB、PostgreSQL のバージョンによって異なり、
pg_dumpはそもそも同じヘッダーを使いません。同じコマンドが何も返さず黙って終わります。 - 外部キーへの無理解。仮に
ordersを完璧に切り出せても、その行はusersを参照しています。sedはそれを知らないので、抽出結果は外部キーエラーでインポートに失敗します。
結局 grep の上に awk、その上に sed を積み重ね、サブセットでテストしても、結果をまだ信用できません。もっと良い方法があります。
DumpCleaner でテーブルを抽出する
DumpCleaner はダンプを正しくパースします。文の境界、複数行の INSERT、バッククォート、コメントを理解するので、常に正しい行で切り取ります。必要なテーブルの抽出は4ステップです:
.sqlダンプをドラッグして入れます。DumpCleaner はファイルをストリーミングするので、7 GB のダンプも全体を読み込まず一定のメモリで開きます。- 自動検出されたテーブル一覧を読みます。すべてのテーブルがパースされ、行数とサイズ付きで一覧表示されます。何百万行もスクロールして中身を探す必要はありません。
- 欲しいテーブルを選びます。
users、orders、productsにチェックを入れるか、*_logsのような正規表現/除外パターンを入力してグループ全体を一度に外します。 - 外部キーの親を含めてエクスポートします。必要なら参照先の親テーブルを自動的に取り込み、クリーンでインポート可能なファイルを書き出します。
シェルツールよりずっと手間が少なくなる点がいくつかあります:
- 除外パターン(
*_logsや*_sessionsなど)で、何十ものテーブルを手作業でチェック解除せずに監査ノイズやセッションノイズを取り除けます。 - 正規表現フィルタで、接頭辞・接尾辞・任意のパターンで一致させられます。たとえば
shop_*に一致するものをすべて残す、など。 - ライブプレビューが、選択を変えるたびに出力に含まれるテーブルを正確に表示します。
- 推定出力サイズが、エクスポート前に抽出物の大きさを教えてくれるので、ローカルに収まるか分かります。
- 外部キーの依存関係を自動的に含められるので、
ordersを選ぶとusersがそっと一緒に付いてきて、抽出物が制約エラーなしでインポートできます。
必要なテーブルだけ — それ以外は何も
DumpCleaner はどんなサイズのダンプからも特定のテーブルを抽出します。ストリーミングで、メモリ消費は一定、外部キーも解決済み。ネイティブの macOS & iPadOS アプリ、買い切り。
App Store でダウンロードよくある質問
複数のテーブルを一度に抽出できますか?
はい。好きなだけテーブルにチェックを入れられます — users、orders、products を一緒に — DumpCleaner はそれらすべてを1回のパスで1つのファイルに書き出します。
外部キーの依存関係は保たれますか?
任意で保てます。外部キーの依存関係を含めるをオンにすると、選択が参照する親テーブルが自動的に取り込まれ、抽出物が制約エラーなしでインポートできます。
パターンでテーブルを除外できますか?
はい。*_logs や *_sessions のような除外パターン、または正規表現を使って、1つずつチェックを外す代わりにテーブルのグループ全体を除外できます。
PostgreSQL でも動作しますか?
はい。DumpCleaner は MySQL、MariaDB、PostgreSQL(pg_dump)のダンプを読み込み、テーブル抽出時に public.users のようなスキーマ修飾名も扱います。
sed と grep との格闘をやめる
ドラッグして、テーブルを選び、エクスポート。DumpCleaner は必要なテーブルだけを — 外部キーごと — どんなダンプからも取り出します。
App Store でダウンロード