从 SQL 转储中只导出表结构(Schema)

你磁盘上有一份完整转储,但只想要结构——CREATE TABLE、索引、外键——而不要那些 8900 万行的日志表。或者恰好相反:只要数据,不要 CREATE 语句。本文讲清常用的那些转储参数为何帮不了一个现有文件,以及如何一键把结构和数据分开。

有三种情形反复出现:

为什么 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)。它以流式解析文件,所以一个几 GB 的转储以恒定内存加载。
  2. 切换你想要的语句类型:CREATE TABLE、CREATE INDEX、INSERT INTO、ALTER、DROP、LOCK、SET。取消勾选 INSERT INTO 就得到只含结构的文件;取消勾选 CREATE TABLE / CREATE INDEX 就得到只含数据的文件。
  3. 或者选一个预设——仅结构仅数据——一步设好每一个开关,随后如需要再逐表微调。
  4. 导出。你得到一个精简的结构文件用于预发布或 CI,或一个干净的仅含数据的转储用于灌入种子数据。

由于筛选是语句感知的,一条多行的扩展 INSERT 会被整条保留或整条丢弃——绝不会从中间切开。

真正强大之处在于,筛选是按语句类型按表进行的,而且二者可以组合。你可以保留每一张表的结构,却只为你确实需要的那三张表包含 INSERT 数据——把那张 8900 万行的 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 下载