Не каждой задаче нужна вся база данных. Разрабатывая функцию локально, вы редко хотите, чтобы полный производственный дамп забивал диск и импортировался целый час. Вам нужна горстка таблиц, которых эта функция реально касается.
То же самое, когда вы отлаживаете одну таблицу — воспроизведение проблемы с данными в orders не требует остальных 126 таблиц — или делаете частичную миграцию, когда в новый сервис переезжает лишь несколько таблиц. Во всех этих случаях вопрос один: как достать именно эти таблицы из гигантского дампа, чисто и быстро?
Подход sed/grep и почему он ломается
Классический ответ — нарезать файл с помощью sed между заголовками секций, которые mysqldump пишет для каждой таблицы:
# вытащить таблицу users из файла mysqldump
sed -n '/-- Table structure for table `users`/,/-- Table structure for table/p' dump.sql > users.sql
Выглядит хитро, и на маленьком аккуратном дампе может даже сработать один раз. Но на реальном файле в 7 ГБ он разваливается множеством тонких способов:
- Многострочные INSERT-ы. Один
INSERT INTO ... VALUESможет занимать тысячи строк. Построчные инструменты вродеsedиgrepразрезают такие строки пополам и дают файл, который не парсится. - Обратные кавычки и спецсимволы. Значения столбцов содержат
--, точки с запятой, обратные кавычки, кавычки и переводы строк внутри строковых литералов. Ваш шаблон совпадает с текстом внутри данных, который никогда не был разделителем. - Имена таблиц как подстроки. Извлекая
user, вы также захватываетеuser_roles,user_sessionsиpassword_user, потому что это имя встречается как подстрока в других. - Комментарии и заголовки меняются. Точный текст комментариев различается между версиями MySQL, MariaDB и PostgreSQL, а
pg_dumpвообще использует другие заголовки — так что та же команда молча возвращает пустоту. - Нет учёта внешних ключей. Даже если вы идеально вырежете
orders, её строки ссылаются наusers.sedоб этом не знает, поэтому извлечённое не импортируется из-за ошибки внешнего ключа.
В итоге вы навешиваете awk на grep на sed, тестируете на подмножествах и всё равно не доверяете результату. Есть путь получше.
Извлечение таблиц с DumpCleaner
DumpCleaner парсит дамп как положено — он понимает границы инструкций, многострочные INSERT-ы, обратные кавычки и комментарии — поэтому всегда режет по правильным строкам. Извлечение нужных таблиц занимает четыре шага:
- Перетащите ваш дамп
.sql. DumpCleaner читает файл потоком, так что дамп на 7 ГБ открывается с постоянным расходом памяти, не загружая всё целиком. - Изучите автоматически определённый список таблиц. Каждая таблица разобрана и указана с числом строк и размером — не нужно прокручивать миллионы строк, чтобы понять, что там есть.
- Выберите нужные таблицы. Отметьте
users,ordersиproducts, или задайте регулярное выражение / шаблон исключения вроде*_logs, чтобы убрать целые группы за один раз. - Включите родителей по внешним ключам и экспортируйте. При желании автоматически подтяните таблицы, на которые есть ссылки, затем экспортируйте чистый, готовый к импорту файл.
Несколько вещей делают это гораздо менее возни, чем с утилитами оболочки:
- Шаблоны исключения вроде
*_logsили*_sessionsубирают шум аудита и сессий без снятия отметок с десятков таблиц вручную. - Regex-фильтры позволяют сопоставлять по префиксу, суффиксу или любому шаблону — например, оставить всё, что совпадает с
shop_*. - Живой предпросмотр показывает, какие именно таблицы попадут в вывод, по мере изменения выбора.
- Оценка размера вывода сообщает, насколько большим будет извлечение, ещё до экспорта, так что вы знаете, что оно поместится локально.
- Зависимости внешних ключей можно включать автоматически, так что выбор
ordersтихо тянет за собойusers, и извлечение импортируется без ошибок ограничений.
Только нужные таблицы — и ничего лишнего
DumpCleaner извлекает конкретные таблицы из дампов любого размера — потоково, с постоянным расходом памяти и с разрешёнными за вас внешними ключами. Нативное приложение для macOS и iPadOS, разовая покупка.
Загрузить в App StoreЧасто задаваемые вопросы
Можно ли извлечь несколько таблиц сразу?
Да. Отметьте сколько угодно таблиц — users, orders и products вместе — и DumpCleaner запишет их все в один файл за один проход.
Сохраняет ли программа зависимости внешних ключей?
При желании — да. Включите включить зависимости внешних ключей, и любая родительская таблица, на которую ссылается ваш выбор, будет подтянута автоматически, так что извлечение импортируется без ошибок ограничений.
Можно ли исключать таблицы по шаблону?
Да. Используйте шаблоны исключения вроде *_logs или *_sessions, либо регулярное выражение, чтобы убрать целые группы таблиц вместо снятия отметок по одной.
Работает ли это с PostgreSQL?
Да. DumpCleaner читает дампы MySQL, MariaDB и PostgreSQL (pg_dump) и обрабатывает имена со схемой вроде public.users при извлечении таблиц.
Перестаньте бороться с sed и grep
Перетащите, выберите таблицы, экспортируйте. DumpCleaner вытаскивает именно нужные вам таблицы — вместе с их внешними ключами — из любого дампа.
Загрузить в App Store