Tri situacije se ponavljajo:
- Postavite shemo za pripravljalno okolje ali CI — želite prazno strukturo tabel, da lahko testi tečejo proti pravim stolpcem, indeksom in omejitvam, nikakor pa nočete v okolje za enkratno uporabo pošiljati gigabajtov produkcijskih vrstic.
- Samo semenski podatki — shema v ciljni bazi podatkov že obstaja in potrebujete le INSERT vrstice, da jo napolnite, brez CREATE stavkov, ki bi trčili s tem, kar je že tam.
- Znebite se šuma — izvoz je napihnjen s tabelami
logs,sessions,audit_trailalicachez več deset milijoni vrstic, ki jih nikoli ne želite uvoziti.
Zakaj mysqldump --no-data ni dovolj
Klasičen nasvet je mysqldump --no-data (samo struktura) ali mysqldump --no-create-info (samo podatki). Oba sta zastavici za izvoz: spremenita, kaj vsebuje svež izvoz iz delujoče baze podatkov. Za izvoz, ki ga že imate na disku kot datoteko .sql, ne naredita ničesar.
V praksi datoteka pogosto pride od nekoga drugega ali iz varnostnega kopiranja ali s strežnika, do katerega nimate več živega dostopa. mysqldump ne morete znova zagnati proti bazi podatkov, ki ni dosegljiva — poverilnice so izginile, strežnik je razgrajen ali pa je datoteka preprosto vse, kar so vam izročili. Na tej točki so zastavice neuporabne, vi pa urejate datoteko samo.
Ročni način
Očitna poteza je, da vrstice odstranite z grep ali sed. Da obdržite strukturo in izpustite podatke:
# obdrži vse razen INSERT vrstic grep -v '^INSERT INTO' dump.sql > schema.sql # ali obdrži samo INSERT vrstice za datoteko samo s podatki grep '^INSERT INTO' dump.sql > data.sql
To izgleda v redu na majhnem, urejenem izvozu — nato pa se pokvari na pravem:
- Večvrstični INSERT stavki. En sam
INSERT INTO … VALUESlahko obsega na tisoče vrstic.grepse ujame s prvo vrstico, ostale vrednosti pa pusti osirotele in ustvari pokvarjeno datoteko. - Razširjeni vstavki. mysqldump veliko vrstic združi v en velikanski stavek. Vrstično zasnovani filtri ne morejo prepoznati, kje se tak stavek konča.
- Komentarji in bloki. Pogojni bloki
/*! … */,LOCK TABLESin komentarji--se prepletajo s podatki, zato naiven filter bodisi obdrži smeti bodisi odreže nekaj, kar uvoz potrebuje. - Samo podatki je še slabše. Čisti
grep '^INSERT'zavržeSETinLOCKstavke, od katerih so vrstice odvisne, vsak INSERT, ki se ne začne natanko na ničtem stolpcu, pa tiho izgine.
Na koncu razhroščujete svoj lasten filter, namesto da bi dobili svojo shemo.
Samo struktura ali samo podatki z DumpCleaner
DumpCleaner razume SQL stavke, namesto da bi ujemal vrstice, zato zanesljivo loči strukturo od podatkov — na datotekah katere koli velikosti:
- Povlecite svoj
.sqlizvoz v DumpCleaner (MySQL, MariaDB ali PostgreSQL). Datoteko razčleni s pretakanjem, zato se izvoz velikosti več gigabajtov naloži s konstantnim pomnilnikom. - Preklopite vrste stavkov, ki jih želite: CREATE TABLE, CREATE INDEX, INSERT INTO, ALTER, DROP, LOCK, SET. Odkljukajte INSERT INTO in dobite samo strukturo; odkljukajte CREATE TABLE / CREATE INDEX in dobite samo podatke.
- Ali izberite prednastavitev — Samo struktura ali Samo podatki — da v enem koraku nastavite vsak preklop, nato pa po želji prilagodite po tabeli.
- Izvozite. Dobite vitko datoteko sheme za pripravljalno okolje ali CI ali čist izvoz samo s podatki za polnjenje.
Ker se filter zaveda stavkov, se večvrstični razširjeni INSERT obdrži ali izpusti kot celota — nikoli prerezan na sredini.
Prava moč je v tem, da filtriranje deluje po vrsti stavka in po tabeli, obe pa se kombinirata. Lahko obdržite strukturo vsake tabele, INSERT podatke pa vključite le za tri tabele, ki jih dejansko potrebujete — tabelo logs z 89 milijoni vrstic pustite kot prazno lupino. To je nekaj, česar nobena zastavica --no-data ne more izraziti.
Ločite strukturo od podatkov v nekaj sekundah
DumpCleaner filtrira obstoječ izvoz po vrsti stavka in po tabeli — samo struktura, samo podatki ali poljubna mešanica — pretočno, s konstantnim pomnilnikom. Domača aplikacija za macOS in iPadOS, enkraten nakup.
Prenesi v trgovini App StorePogosta vprašanja
Ali lahko izvozim podatke brez sheme?
Da. Onemogočite CREATE TABLE in CREATE INDEX (ali izberite prednastavitev Samo podatki) in obdržite INSERT INTO. DumpCleaner izvozi le vrstice, pripravljene za nalaganje v že obstoječo shemo.
Ali izvoz samo strukture ohrani indekse in tuje ključe?
Da. Samo struktura obdrži CREATE TABLE, CREATE INDEX, ALTER TABLE in definicije tujih ključev — vse, kar določa bazo podatkov. Odstranijo se le INSERT podatkovne vrstice.
Ali lahko mešam — struktura za vse tabele, podatki za nekatere?
Da. Filtriranje poteka po vrsti stavka in po tabeli, obe pa se kombinirata. Obdržite strukturo vsake tabele, INSERT podatke pa vključite le za nekaj tabel, ki jih dejansko potrebujete.
Ali to deluje s PostgreSQL?
Da. DumpCleaner bere izvoze MySQL, MariaDB in PostgreSQL ter samodejno zazna format, zato izvoza samo strukture in samo podatkov delujeta enako tudi za datoteke pg_dump.
Shema brez podatkov — ali podatki brez sheme
Povlecite, preklopite vrste stavkov, izvozite. DumpCleaner razdeli kateri koli izvoz natanko na del, ki ga potrebujete.
Prenesi v trgovini App Store