3つの状況が繰り返し出てきます:
- ステージングや CI 用にスキーマを立ち上げる — テストが実際の列・インデックス・制約に対して実行できるよう空のテーブル構造が欲しいが、使い捨ての環境に何ギガバイトもの本番行を送り込むのは絶対に避けたい。
- データだけを投入する — スキーマはすでにターゲットのデータベースに存在し、必要なのはそれを埋める INSERT 行だけ。既存のものと衝突する CREATE 文は不要。
- ノイズを取り除く — ダンプが数千万行の
logs、sessions、audit_trail、cacheテーブルで肥大化していて、それらは一切インポートしたくない。
なぜ mysqldump --no-data では不十分なのか
定番のアドバイスは mysqldump --no-data(構造のみ)または mysqldump --no-create-info(データのみ)です。どちらもエクスポート用のフラグです。稼働中のデータベースから取る新しいダンプの中身を変えるだけで、すでにディスク上に .sql ファイルとしてあるダンプには何もしません。
実際には、ファイルは他人から届いたり、バックアップジョブから来たり、もうライブアクセスできないサーバーから来たりすることがよくあります。到達できないデータベースに対して mysqldump を再実行することはできません。認証情報がなくなっている、サーバーが廃止された、あるいは渡されたのがそのファイルだけ、というわけです。その時点でフラグは無用となり、ファイル自体を編集するしかなくなります。
手作業でのやり方
分かりやすい手は grep や sed で行を取り除くことです。構造を残してデータを落とすには:
# INSERT 行以外をすべて残す grep -v '^INSERT INTO' dump.sql > schema.sql # または データのみのファイルにするため INSERT 行だけを残す grep '^INSERT INTO' dump.sql > data.sql
これは小さくて整ったダンプでは問題なく見えます。そして実際のものでは壊れます:
- 複数行の INSERT。1つの
INSERT INTO … VALUESが数千行にわたることがあります。grepは最初の行に一致し、残りの値を孤立させて、壊れたファイルを作ります。 - 拡張 INSERT。mysqldump は多数の行を1つの巨大な文にまとめます。行ベースのフィルタは、そのような文がどこで終わるのか判別できません。
- コメントとブロック。条件付きの
/*! … */ブロック、LOCK TABLES、--コメントがデータの間に挟まっているので、素朴なフィルタはゴミを残すか、インポートに必要なものを切り落とすかのどちらかになります。 - データのみはもっと厄介です。純粋な
grep '^INSERT'は、行が依存するSETやLOCK文を捨ててしまい、列0番目ちょうどから始まらない INSERT は黙って消えます。
結局、スキーマを手に入れる代わりに、自作のフィルタをデバッグする羽目になります。
DumpCleaner で構造のみ・データのみに分ける
DumpCleaner は行を照合するのではなく SQL 文を理解するので、構造とデータを確実に分けます — どんなサイズのファイルでも:
.sqlダンプを DumpCleaner にドラッグします(MySQL、MariaDB、PostgreSQL)。ストリーミングでファイルをパースするので、数ギガバイトのダンプも一定のメモリで読み込みます。- 欲しい文の種類を切り替えます: CREATE TABLE、CREATE INDEX、INSERT INTO、ALTER、DROP、LOCK、SET。INSERT INTO のチェックを外せば構造のみ、CREATE TABLE / CREATE INDEX のチェックを外せばデータのみになります。
- または、プリセット — 構造のみまたはデータのみ — を選んで、すべての切り替えを一度に設定し、好みに応じてテーブルごとに調整します。
- エクスポートします。ステージングや CI 用のすっきりしたスキーマファイル、あるいは投入用のクリーンなデータのみのダンプが得られます。
フィルタが文単位で認識するので、複数行の拡張 INSERT はまるごと残されるかまるごと落とされるかのどちらかで、決して途中で切られることはありません。
本当の強みは、フィルタリングが文の種類ごとにもテーブルごとにも効き、両者が組み合わさることです。すべてのテーブルの構造を残しつつ、実際に必要な3つのテーブルだけに INSERT データを含めることができます。8,900 万行の logs テーブルは空の殻として残せます。これはどんな --no-data フラグでも表現できないことです。
構造とデータを数秒で分ける
DumpCleaner は既存のダンプを文の種類ごと・テーブルごとにフィルタリングします — 構造のみ、データのみ、あるいは任意の組み合わせ。ストリーミングで、メモリ消費は一定。ネイティブの macOS & iPadOS アプリ、買い切り。
App Store でダウンロードよくある質問
スキーマなしでデータだけをエクスポートできますか?
はい。CREATE TABLE と CREATE INDEX を無効化し(またはデータのみのプリセットを選び)、INSERT INTO を残します。DumpCleaner は行だけをエクスポートし、すでに存在するスキーマに読み込む準備が整います。
構造のみのエクスポートでインデックスと外部キーは保たれますか?
はい。構造のみは CREATE TABLE、CREATE INDEX、ALTER TABLE、外部キー定義 — データベースを定義するすべて — を残します。取り除かれるのは INSERT のデータ行だけです。
組み合わせられますか — 全テーブルの構造と、一部のテーブルのデータ?
はい。フィルタリングは文の種類ごと・テーブルごとで、両者が組み合わさります。すべてのテーブルの構造を残しつつ、実際に必要な数テーブルだけに INSERT データを含められます。
PostgreSQL でも動作しますか?
はい。DumpCleaner は MySQL、MariaDB、PostgreSQL のダンプを読み込み、フォーマットを自動検出するので、構造のみ・データのみのエクスポートは pg_dump ファイルでも同じように動作します。
データ抜きのスキーマ — またはスキーマ抜きのデータ
ドラッグして、文の種類を切り替え、エクスポート。DumpCleaner はどんなダンプも必要な部分だけに分けます。
App Store でダウンロード