SQL ダンプからスキーマ(構造)だけをエクスポートする

ディスク上に完全なダンプがあるが、欲しいのは構造だけ — CREATE TABLE、インデックス、外部キー — 8,900 万行のログテーブル抜きで。あるいはその逆で、CREATE 文なしのデータだけ。よくあるダンプのフラグがなぜ既存ファイルに役立たないのか、そしてワンクリックで構造とデータを分ける方法を解説します。

3つの状況が繰り返し出てきます:

なぜ mysqldump --no-data では不十分なのか

定番のアドバイスは mysqldump --no-data(構造のみ)または mysqldump --no-create-info(データのみ)です。どちらもエクスポート用のフラグです。稼働中のデータベースから取る新しいダンプの中身を変えるだけで、すでにディスク上に .sql ファイルとしてあるダンプには何もしません。

実際には、ファイルは他人から届いたり、バックアップジョブから来たり、もうライブアクセスできないサーバーから来たりすることがよくあります。到達できないデータベースに対して mysqldump を再実行することはできません。認証情報がなくなっている、サーバーが廃止された、あるいは渡されたのがそのファイルだけ、というわけです。その時点でフラグは無用となり、ファイル自体を編集するしかなくなります。

手作業でのやり方

分かりやすい手は grepsed で行を取り除くことです。構造を残してデータを落とすには:

# INSERT 行以外をすべて残す
grep -v '^INSERT INTO' dump.sql > schema.sql

# または データのみのファイルにするため INSERT 行だけを残す
grep '^INSERT INTO' dump.sql > data.sql

これは小さくて整ったダンプでは問題なく見えます。そして実際のものでは壊れます:

結局、スキーマを手に入れる代わりに、自作のフィルタをデバッグする羽目になります。

DumpCleaner で構造のみ・データのみに分ける

DumpCleaner は行を照合するのではなく SQL 文を理解するので、構造とデータを確実に分けます — どんなサイズのファイルでも:

  1. .sql ダンプを DumpCleaner にドラッグします(MySQL、MariaDB、PostgreSQL)。ストリーミングでファイルをパースするので、数ギガバイトのダンプも一定のメモリで読み込みます。
  2. 欲しい文の種類を切り替えます: CREATE TABLE、CREATE INDEX、INSERT INTO、ALTER、DROP、LOCK、SET。INSERT INTO のチェックを外せば構造のみ、CREATE TABLE / CREATE INDEX のチェックを外せばデータのみになります。
  3. または、プリセット — 構造のみまたはデータのみ — を選んで、すべての切り替えを一度に設定し、好みに応じてテーブルごとに調整します。
  4. エクスポートします。ステージングや 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 でダウンロード