Не кожне завдання потребує всієї бази даних. Коли ви розробляєте функцію локально, вам рідко потрібен повний продакшн-дамп, що заповнює диск і імпортується годину. Вам потрібна жменька таблиць, яких насправді торкається ця функція.
Те саме стосується налагодження однієї таблиці — відтворення проблеми з даними в 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або введіть regex / шаблон виключення на кшталт*_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