Neustále se objevují tři situace:
- Postavit schéma pro staging nebo CI — chcete prázdnou strukturu tabulek, aby testy běžely proti skutečným sloupcům, indexům a omezením, ale rozhodně nechcete dopravit gigabajty produkčních řádků do prostředí na jedno použití.
- Jen naplnit daty (seed) — schéma už v cílové databázi existuje a potřebujete jen řádky INSERT, které jej naplní, bez příkazů CREATE, jež by kolidovaly s tím, co tam je.
- Zbavit se šumu — dump je nafouknutý tabulkami
logs,sessions,audit_trailnebocaches desítkami milionů řádků, které nikdy nechcete importovat.
Proč mysqldump --no-data nestačí
Klasická rada je mysqldump --no-data (jen struktura) nebo mysqldump --no-create-info (jen data). Oba jsou exportní přepínače: mění to, co obsahuje nový dump z běžící databáze. Pro dump, který už máte na disku jako soubor .sql, neudělají nic.
V praxi soubor často přijde od někoho jiného, ze zálohovací úlohy nebo ze serveru, ke kterému už nemáte živý přístup. Nemůžete znovu spustit mysqldump proti databázi, která není dostupná — přihlašovací údaje jsou pryč, server je vyřazen z provozu nebo je soubor prostě vše, co jste dostali. V tu chvíli jsou přepínače k ničemu a nezbývá než editovat samotný soubor.
Ruční způsob
Nasnadě je odstranit řádky pomocí grep nebo sed. Pro zachování struktury a zahození dat:
# ponechat vše kromě řádků INSERT grep -v '^INSERT INTO' dump.sql > schema.sql # nebo ponechat pouze řádky INSERT pro soubor jen s daty grep '^INSERT INTO' dump.sql > data.sql
Na malém, úhledném dumpu to vypadá dobře — a pak to na reálném selže:
- Víceřádkové INSERTy. Jediný
INSERT INTO … VALUESse může táhnout přes tisíce řádků.grepse shoduje s prvním řádkem a zbytek hodnot nechá osiřelý, čímž vznikne poškozený soubor. - Rozšířené inserty. mysqldump sdružuje mnoho řádků do jednoho obřího příkazu. Řádkové filtry nedokážou poznat, kde takový příkaz končí.
- Komentáře a bloky. Podmíněné bloky
/*! … */,LOCK TABLESa komentáře--se proplétají s daty, takže naivní filtr buď ponechá smetí, nebo odřízne něco, co import potřebuje. - Jen data je ještě horší. Čistý
grep '^INSERT'zahodí příkazySETaLOCK, na kterých řádky závisí, a jakýkoli INSERT, který nezačíná přesně na nultém sloupci, tiše zmizí.
Skončíte tak, že ladíte svůj vlastní filtr místo toho, abyste dostali své schéma.
Jen struktura nebo jen data s DumpCleaner
DumpCleaner rozumí SQL příkazům místo shody na řádcích, takže odděluje strukturu od dat spolehlivě — u souborů libovolné velikosti:
- Přetáhněte svůj
.sqldump do DumpCleaner (MySQL, MariaDB nebo PostgreSQL). Parsuje soubor streamováním, takže se vícegigabajtový dump načte s konstantní pamětí. - Přepněte typy příkazů, které chcete: CREATE TABLE, CREATE INDEX, INSERT INTO, ALTER, DROP, LOCK, SET. Odškrtněte INSERT INTO a dostanete jen strukturu; odškrtněte CREATE TABLE / CREATE INDEX a dostanete jen data.
- Nebo zvolte přednastavení — Jen struktura nebo Jen data — a nastavte všechny přepínače v jednom kroku, poté případně dolaďte pro jednotlivé tabulky.
- Exportujte. Dostanete štíhlý soubor se schématem pro staging nebo CI, nebo čistý dump jen s daty pro naplnění.
Protože filtr respektuje jednotlivé příkazy, víceřádkový rozšířený INSERT se zachová nebo zahodí jako celek — nikdy se nerozsekne uprostřed.
Skutečná síla spočívá v tom, že filtrování funguje podle typu příkazu a podle tabulky a obojí se kombinuje. Můžete ponechat strukturu každé tabulky, ale zahrnout data INSERT jen pro tři tabulky, které skutečně potřebujete — a nechat 89milionovou tabulku logs jako prázdnou schránku. To žádný přepínač --no-data nedokáže vyjádřit.
Oddělte strukturu od dat během několika sekund
DumpCleaner filtruje existující dump podle typu příkazu a podle tabulky — jen struktura, jen data nebo jakákoli kombinace — streamovaně, s konstantní pamětí. Nativní aplikace pro macOS a iPadOS, jednorázový nákup.
Stáhnout z App StoreČasté dotazy
Mohu exportovat data bez schématu?
Ano. Vypněte CREATE TABLE a CREATE INDEX (nebo zvolte přednastavení Jen data) a ponechte INSERT INTO. DumpCleaner vyexportuje jen řádky, připravené k načtení do schématu, které už existuje.
Zachová export jen struktury indexy a cizí klíče?
Ano. Jen struktura zachová CREATE TABLE, CREATE INDEX, ALTER TABLE a definice cizích klíčů — vše, co definuje databázi. Odstraní se pouze datové řádky INSERT.
Mohu to kombinovat — struktura pro všechny tabulky, data pro některé?
Ano. Filtrování je podle typu příkazu a podle tabulky a obojí se kombinuje. Ponechte strukturu každé tabulky, ale zahrňte data INSERT jen pro těch pár tabulek, které skutečně potřebujete.
Funguje to s PostgreSQL?
Ano. DumpCleaner čte dumpy MySQL, MariaDB a PostgreSQL a formát rozpozná automaticky, takže exporty jen struktury a jen dat fungují stejně i pro soubory pg_dump.
Schéma bez dat — nebo data bez schématu
Přetáhnout, přepnout typy příkazů, exportovat. DumpCleaner rozdělí libovolný dump přesně na tu část, kterou potřebujete.
Stáhnout z App Store