Mitte iga töö ei vaja kogu andmebaasi. Kui ehitad funktsiooni lokaalselt, ei taha sa harva täielikku tootmistõmmist, mis täidab su ketta ja võtab importimiseks tunni aega. Sa tahad seda peotäit tabeleid, mida funktsioon tegelikult puudutab.
Sama kehtib ka siis, kui silud üksikut tabelit — andmeprobleemi taastootmine orders-is ei nõua ülejäänud 126 tabelit — või teed osalist migreerimist, kus vaid mõned tabelid liiguvad uude teenusesse. Kõigil neil juhtudel on küsimus sama: kuidas saada ainult need tabelid hiiglaslikust tõmmisest välja, puhtalt ja kiiresti?
Sed/grep lähenemine ja miks see katkeb
Klassikaline vastus on lõigata fail sed-iga sektsioonipäiste vahelt, mida mysqldump iga tabeli jaoks kirjutab:
# tõmba tabel users välja mysqldump-failist
sed -n '/-- Table structure for table `users`/,/-- Table structure for table/p' dump.sql > users.sql
See tundub nutikas ja väikese, korraliku tõmmise peal võib see isegi korra toimida. Tõelise 7 GB faili peal laguneb see paljudel peentel viisidel koost:
- Mitmerealised INSERT-id. Üksainus
INSERT INTO ... VALUESvõib ulatuda tuhandete ridade üle. Reapõhised tööriistad nagusedjagreplõikavad need read pooleks ja toodavad faili, mis ei parsi. - Tagurpidi ülakomad ja erimärgid. Veeruväärtused sisaldavad
--, semikooloneid, tagurpidi ülakomasid, jutumärke ja reavahetusi stringide sees. Sinu muster sobitub tekstiga andmete sees, mis polnud kunagi mõeldud eraldajaks. - Tabelinimed alamstringidena.
usereraldamine haarab kaasa kauser_roles,user_sessionsjapassword_user, sest nimi esineb teiste alamstringina. - Kommentaaride ja päiste triiv. Kommentaari täpne tekst erineb MySQL-i, MariaDB ja PostgreSQL-i versioonide vahel ning
pg_dumpei kasuta üldse samu päiseid — nii et sama käsk tagastab vaikselt mitte midagi. - Puudub välisvõtme teadlikkus. Isegi kui lõikad
orderstäiuslikult, viitavad selle readusers-ile.sed-il pole aimugi, seega ei õnnestu eraldust importida välisvõtme veaga.
Lõpuks kuhjad awk-i grep-i peale, grep-i sed-i peale, testid alamhulkadel ja ikka ei usalda tulemust. On olemas parem viis.
Eralda tabelid DumpCleaneriga
DumpCleaner parsib tõmmise korralikult — see mõistab lausepiire, mitmerealisi INSERT-e, tagurpidi ülakomasid ja kommentaare — seega lõikab alati õigetel ridadel. Vajalike tabelite eraldamine võtab neli sammu:
- Lohista oma
.sql-tõmmis sisse. DumpCleaner voogedastab faili, seega 7 GB tõmmis avaneb konstantse mäluga, mitte laadides kogu asja. - Loe automaatselt tuvastatud tabeliloendit. Iga tabel parsitakse välja ja loetletakse koos ridade arvu ja suurusega — pole vaja kerida läbi miljonite ridade, et leida, mis seal on.
- Vali tabelid, mida soovid. Märgi
users,ordersjaproductsvõi sisesta regulaaravaldis / välistusmuster nagu*_logs, et viia terved rühmad korraga välja. - Kaasa välisvõtme vanemad ja ekspordi. Soovi korral tõmba automaatselt sisse viidatud vanemtabelid, seejärel ekspordi puhas, imporditav fail.
Mõned asjad muudavad selle palju vähem nokitsevaks kui shell-tööriistad:
- Välistusmustrid nagu
*_logsvõi*_sessionseemaldavad auditi ja seansi müra, ilma et peaksid käsitsi kümnetelt tabelitelt märke maha võtma. - Regulaaravaldiste filtrid lasevad sobitada prefiksi, sufiksi või mis tahes mustri järgi — hoia näiteks kõike, mis sobib
shop_*-iga. - Reaalajas eelvaade näitab täpselt, millised tabelid väljundisse satuvad, kui valikut muudad.
- Hinnanguline väljundi suurus ütleb enne eksportimist, kui suur eraldus tuleb, nii et tead, kas see mahub lokaalselt ära.
- Välisvõtme sõltuvused saab automaatselt kaasata, nii et
ordersvalimine toob vaikseltusers-i kaasa ja eraldus imporditakse ilma piirangute vigadeta.
Ainult vajalikud tabelid — ei midagi muud
DumpCleaner eraldab kindlad tabelid mis tahes suurusega tõmmistest — voogedastades, konstantse mäluga ja välisvõtmed sinu eest lahendatuna. Natiivne macOS-i ja iPadOS-i rakendus, ühekordne ost.
Laadi alla App Store'istKorduma kippuvad küsimused
Kas ma saan mitu tabelit korraga eraldada?
Jah. Märgi nii palju tabeleid, kui soovid — users, orders ja products koos — ja DumpCleaner kirjutab need kõik ühte faili ühe käiguga.
Kas see säilitab välisvõtme sõltuvused?
Soovi korral jah. Lülita sisse kaasa välisvõtme sõltuvused ja iga vanemtabel, millele su valik viitab, tõmmatakse automaatselt sisse, nii et eraldus imporditakse ilma piirangute vigadeta.
Kas ma saan tabeleid mustri järgi välistada?
Jah. Kasuta välistusmustreid nagu *_logs või *_sessions või regulaaravaldist, et viia terved tabelirühmad välja, selle asemel et neilt ükshaaval märke maha võtta.
Kas see toimib PostgreSQL-iga?
Jah. DumpCleaner loeb MySQL-i, MariaDB ja PostgreSQL-i (pg_dump) tõmmiseid ning käsitseb tabelite eraldamisel skeemiga kvalifitseeritud nimesid nagu public.users.
Lõpeta sedi ja grepiga võitlemine
Lohista, vali oma tabelid, ekspordi. DumpCleaner tõmbab täpselt vajalikud tabelid — koos nende välisvõtmetega — mis tahes tõmmisest välja.
Laadi alla App Store'ist