Ne kiekvienam darbui reikia visos duomenų bazės. Kai lokaliai kuriate funkciją, retai norite pilnos produkcinės išklotinės, užimančios diską ir importuojamos valandą. Norite tik tų kelių lentelių, kurias funkcija iš tikrųjų liečia.
Tas pats galioja, kai derinate vieną lentelę — atkartoti duomenų problemai lentelėje orders nereikia kitų 126 lentelių — arba atliekate dalinę migraciją, kai į naują paslaugą perkeliamos vos kelios lentelės. Visais šiais atvejais klausimas tas pats: kaip iš milžiniškos išklotinės švariai ir greitai gauti būtent šias lenteles?
sed/grep būdas ir kodėl jis lūžta
Klasikinis atsakymas — supjaustyti failą su sed tarp skyrių antraščių, kurias mysqldump rašo kiekvienai lentelei:
# ištraukti users lentelę iš mysqldump failo
sed -n '/-- Table structure for table `users`/,/-- Table structure for table/p' dump.sql > users.sql
Atrodo išmoningai ir mažoje, tvarkingoje išklotinėje netgi gali suveikti vieną kartą. Tikrame 7 GB faile jis subyra daugybe subtilių būdų:
- Kelių eilučių INSERT. Vienas
INSERT INTO ... VALUESgali užimti tūkstančius eilučių. Į eilutes orientuoti įrankiai kaipsedirgrepperkerta tas eilutes per pusę ir sukuria failą, kuris nepasiduoda analizei. - Atbuliniai kabliakabliai ir specialūs simboliai. Stulpelių reikšmėse yra
--, kabliataškiai, atbuliniai kabliakabliai, kabutės ir eilučių lūžiai eilutėse. Jūsų šablonas atitinka tekstą duomenų viduje, kuris niekada nebuvo skirtas būti skirtuku. - Lentelių pavadinimai kaip poeilutės. Ištraukiant
usertaip pat pagriebiamauser_roles,user_sessionsirpassword_user, nes pavadinimas atsiranda kaip kitų poeilutė. - Komentarų ir antraščių svyravimai. Tikslus komentaro tekstas skiriasi tarp MySQL, MariaDB ir PostgreSQL versijų, o
pg_dumpapskritai nenaudoja tų pačių antraščių — todėl ta pati komanda tyliai negrąžina nieko. - Nesuvokia išorinių raktų. Net jei tobulai supjaustysite
orders, jos eilutės nurodousers.sedto nesupranta, todėl ištrauka importuojantis suklysta su išorinio rakto klaida.
Galiausiai krausite awk ant grep ant sed, testuosite su poaibiais ir vis tiek nepasitikėsite rezultatu. Yra geresnis būdas.
Ištraukti lenteles su DumpCleaner
DumpCleaner tinkamai analizuoja išklotinę — jis supranta sakinių ribas, kelių eilučių INSERT sakinius, atbulinius kabliakablius ir komentarus — todėl visada pjauna teisingose eilutėse. Reikalingų lentelių ištraukimas užtrunka keturis žingsnius:
- Nutempkite savo
.sqlišklotinę. DumpCleaner skaito failą srautiniu būdu, todėl 7 GB išklotinė atsiveria su pastoviu atminties naudojimu, o ne įkeliant viską. - Peržiūrėkite automatiškai aptiktą lentelių sąrašą. Kiekviena lentelė išanalizuojama ir išvardijama su savo eilučių skaičiumi ir dydžiu — nereikia slinkti per milijonus eilučių ieškant, kas ten yra.
- Pasirinkite norimas lenteles. Pažymėkite
users,ordersirproductsarba įveskite reguliarųjį reiškinį / atmetimo šabloną, pvz.*_logs, kad iškart atmestumėte ištisas grupes. - Įtraukite išorinių raktų pirmines lenteles ir eksportuokite. Norėdami, automatiškai įtraukite nurodytas pirmines lenteles, tada eksportuokite švarų, importuojamą failą.
Kelios savybės daro tai kur kas mažiau varginančiu nei apvalkalo įrankiai:
- Atmetimo šablonai kaip
*_logsar*_sessionspašalina audito ir sesijų triukšmą, nenuimant varnelių nuo dešimčių lentelių rankomis. - Reguliariųjų reiškinių filtrai leidžia atitikti pagal priešdėlį, priesagą ar bet kokį šabloną — pavyzdžiui, palikite viską, kas atitinka
shop_*. - Tiesioginė peržiūra keičiant pasirinkimą tiksliai parodo, kurios lentelės pateks į išvestį.
- Numatomas išvesties dydis pasako, koks bus ištraukos dydis dar prieš eksportuojant, todėl žinote, kad jis tilps lokaliai.
- Išorinių raktų priklausomybės gali būti įtrauktos automatiškai, todėl pasirinkus
orderstyliai atsinešamas irusers, ir ištrauka importuojasi be apribojimų klaidų.
Tik tos lentelės, kurių jums reikia — nieko daugiau
DumpCleaner ištraukia konkrečias lenteles iš bet kokio dydžio išklotinių — srautiniu būdu, su pastoviu atminties naudojimu ir su už jus išspręstais išoriniais raktais. Vietinė macOS ir iPadOS programa, vienkartinis pirkimas.
Atsisiųsti iš App StoreDažnai užduodami klausimai
Ar galiu ištraukti kelias lenteles vienu metu?
Taip. Pažymėkite tiek lentelių, kiek norite — users, orders ir products kartu — ir DumpCleaner įrašys jas visas į vieną failą per vieną eigą.
Ar išsaugomos išorinių raktų priklausomybės?
Norėdami, taip. Įjunkite įtraukti išorinių raktų priklausomybes, ir bet kuri jūsų pasirinkimo nurodyta pirminė lentelė bus įtraukta automatiškai, todėl ištrauka importuojasi be apribojimų klaidų.
Ar galiu atmesti lenteles pagal šabloną?
Taip. Naudokite atmetimo šablonus, pvz. *_logs ar *_sessions, arba reguliarųjį reiškinį, kad atmestumėte ištisas lentelių grupes, užuot nuiminėję varneles po vieną.
Ar tai veikia su PostgreSQL?
Taip. DumpCleaner skaito MySQL, MariaDB ir PostgreSQL (pg_dump) išklotines ir ištraukiant lenteles tvarko schema kvalifikuotus pavadinimus, pvz. public.users.
Nustokite kovoti su sed ir grep
Nutempkite, pasirinkite lenteles, eksportuokite. DumpCleaner iš bet kokios išklotinės ištraukia būtent tas lenteles, kurių jums reikia — su jų išoriniais raktais.
Atsisiųsti iš App Store