Не всяка задача се нуждае от цялата база данни. Когато разработвате функционалност локално, рядко искате пълен продукционен дъмп да пълни диска ви и да отнема час за импорт. Искате шепата таблици, които функционалността действително използва.
Същото важи, когато дебъгвате една таблица — възпроизвеждането на проблем с данните в 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 GB се разпада по много незабележими начини:
- Многоредови 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 GB се отваря с постоянна памет, вместо да зарежда цялото нещо. - Прочетете автоматично засечения списък с таблици. Всяка таблица е парсната и изброена с броя редове и размера си — без превъртане през милиони редове, за да откриете какво има.
- Изберете таблиците, които искате. Отметнете
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