Постоянно возникают три ситуации:
- Поднять схему для staging или 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-ы. Один
INSERT INTO … VALUESможет занимать тысячи строк.grepсовпадает с первой строкой и оставляет остальные значения осиротевшими, порождая сломанный файл. - Расширенные вставки. mysqldump объединяет много строк в одну гигантскую инструкцию. Построчные фильтры не могут понять, где такая инструкция заканчивается.
- Комментарии и блоки. Условные блоки
/*! … */,LOCK TABLESи комментарии--перемежаются с данными, поэтому наивный фильтр либо оставляет мусор, либо вырезает то, что нужно для импорта. - С данными хуже. Чистый
grep '^INSERT'выбрасывает инструкцииSETиLOCK, от которых зависят строки, а любой 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 — получите только данные.
- Или выберите пресет — Только структура или Только данные — чтобы задать все переключатели за один шаг, а затем при желании доработать по таблицам.
- Экспортируйте. Вы получаете компактный файл схемы для staging или CI, либо чистый дамп только с данными для наполнения.
Поскольку фильтр учитывает инструкции, многострочный расширенный INSERT сохраняется или отбрасывается целиком — никогда не разрезается посередине.
Настоящая сила в том, что фильтрация работает по типу инструкции и по таблице, и эти два измерения комбинируются. Вы можете сохранить структуру каждой таблицы, но включить данные INSERT только для трёх реально нужных таблиц — оставив таблицу logs на 89 миллионов строк пустой оболочкой. Такое не выразить никаким флагом --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