Stále sa objavujú tri situácie:
- Postavte schému pre staging alebo CI — chcete prázdnu štruktúru tabuliek, aby testy mohli bežať proti skutočným stĺpcom, indexom a obmedzeniam, ale rozhodne nechcete posielať gigabajty produkčných riadkov do jednorazového prostredia.
- Len seed dáta — schéma už v cieľovej databáze existuje a potrebujete len riadky INSERT na jej naplnenie, bez príkazov CREATE, ktoré by kolidovali s tým, čo tam je.
- Zbavte sa šumu — dump je nafúknutý tabuľkami
logs,sessions,audit_trailalebocaches desiatkami miliónov riadkov, ktoré nikdy nechcete importovať.
Prečo mysqldump --no-data nestačí
Klasická rada je mysqldump --no-data (len štruktúra) alebo mysqldump --no-create-info (len dáta). Oba sú exportné parametre: menia to, čo obsahuje čerstvý dump z bežiacej databázy. Pre dump, ktorý už máte na disku ako súbor .sql, neurobia nič.
V praxi súbor často prichádza od niekoho iného, zo zálohovacej úlohy alebo zo servera, ku ktorému už nemáte živý prístup. Nemôžete znova spustiť mysqldump proti databáze, ktorá nie je dostupná — prihlasovacie údaje sú preč, server je vyradený z prevádzky, alebo je súbor jednoducho všetko, čo vám odovzdali. V tom momente sú parametre zbytočné a zostane vám úprava samotného súboru.
Ručný spôsob
Zrejmým krokom je odstrániť riadky pomocou grep alebo sed. Na zachovanie štruktúry a zahodenie dát:
# ponechať všetko okrem riadkov INSERT grep -v '^INSERT INTO' dump.sql > schema.sql # alebo ponechať len riadky INSERT pre súbor iba s dátami grep '^INSERT INTO' dump.sql > data.sql
Na malom, upratanom dumpe to vyzerá v poriadku — a potom sa na skutočnom pokazí:
- Viacriadkové INSERTy. Jediný
INSERT INTO … VALUESsa môže rozprestierať cez tisíce riadkov.grepzhoduje prvý riadok a zvyšok hodnôt nechá osirelý, čím vytvorí pokazený súbor. - Rozšírené inserty. mysqldump zbalí mnoho riadkov do jedného obrovského príkazu. Riadkové filtre nedokážu rozpoznať, kde takýto príkaz končí.
- Komentáre a bloky. Podmienené bloky
/*! … */,LOCK TABLESa komentáre--sa prekladajú s dátami, takže naivný filter buď ponechá odpad, alebo odseknie niečo, čo import potrebuje. - Len dáta je horšie. Čistý
grep '^INSERT'zahodí príkazySETaLOCK, od ktorých riadky závisia, a každý INSERT, ktorý nezačína presne na nultom stĺpci, ticho zmizne.
Skončíte tak, že ladíte svoj vlastný filter namiesto toho, aby ste získali schému.
Iba štruktúra alebo iba dáta s DumpCleaner
DumpCleaner rozumie SQL príkazom namiesto zhody riadkov, takže spoľahlivo oddelí štruktúru od dát — na súboroch akejkoľvek veľkosti:
- Pretiahnite svoj
.sqldump do DumpCleaner (MySQL, MariaDB alebo PostgreSQL). Parsuje súbor prúdovo, takže viacgigabajtový dump sa načíta s konštantnou pamäťou. - Prepnite typy príkazov, ktoré chcete: CREATE TABLE, CREATE INDEX, INSERT INTO, ALTER, DROP, LOCK, SET. Odškrtnite INSERT INTO a dostanete len štruktúru; odškrtnite CREATE TABLE / CREATE INDEX a dostanete len dáta.
- Alebo vyberte predvoľbu — Iba štruktúra alebo Iba dáta — na nastavenie všetkých prepínačov v jednom kroku a potom podľa potreby doladiť pre jednotlivé tabuľky.
- Exportujte. Dostanete štíhly súbor schémy pre staging či CI, alebo čistý dump iba s dátami na seedovanie.
Keďže filter zohľadňuje príkazy, viacriadkový rozšírený INSERT sa ponechá alebo zahodí ako celok — nikdy sa nereže uprostred.
Skutočná sila je v tom, že filtrovanie funguje na typ príkazu aj na tabuľku, a oba sa kombinujú. Môžete ponechať štruktúru každej tabuľky, ale zahrnúť dáta INSERT len pre tri tabuľky, ktoré naozaj potrebujete — a nechať tabuľku logs s 89 miliónmi riadkov ako prázdnu škrupinu. To je niečo, čo žiadny parameter --no-data nedokáže vyjadriť.
Oddeľte štruktúru od dát za pár sekúnd
DumpCleaner filtruje existujúci dump podľa typu príkazu a podľa tabuľky — iba štruktúra, iba dáta alebo akákoľvek kombinácia — prúdovo, s konštantnou pamäťou. Natívna aplikácia pre macOS a iPadOS, jednorazová kúpa.
Stiahnuť v App StoreČasto kladené otázky
Môžem exportovať dáta bez schémy?
Áno. Vypnite CREATE TABLE a CREATE INDEX (alebo vyberte predvoľbu Iba dáta) a ponechajte INSERT INTO. DumpCleaner exportuje len riadky pripravené na načítanie do už existujúcej schémy.
Zachováva export iba štruktúry indexy a cudzie kľúče?
Áno. Iba štruktúra zachováva CREATE TABLE, CREATE INDEX, ALTER TABLE a definície cudzích kľúčov — všetko, čo definuje databázu. Odstránia sa len dátové riadky INSERT.
Môžem to zmiešať — štruktúru pre všetky tabuľky, dáta pre niektoré?
Áno. Filtrovanie je na typ príkazu a na tabuľku a oba sa kombinujú. Ponechajte štruktúru každej tabuľky, ale zahrňte dáta INSERT len pre tých pár tabuliek, ktoré naozaj potrebujete.
Funguje to s PostgreSQL?
Áno. DumpCleaner číta dumpy MySQL, MariaDB a PostgreSQL a formát deteguje automaticky, takže exporty iba štruktúry a iba dát fungujú rovnako aj pre súbory pg_dump.
Schéma bez dát — alebo dáta bez schémy
Pretiahnite, prepnite typy príkazov, exportujte. DumpCleaner rozdelí akýkoľvek dump presne na tú časť, ktorú potrebujete.
Stiahnuť v App Store