Три ситуации възникват постоянно:
- Създаване на схема за 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