Nuolat pasikartoja trys situacijos:
- Paruošti schemą testinei ar CI aplinkai — norite tuščios lentelių struktūros, kad testai galėtų vykti su realiais stulpeliais, indeksais ir apribojimais, bet visiškai nenorite į laikiną aplinką kelti gigabaitų produkcinių eilučių.
- Tik pradiniai duomenys — schema tikslinėje duomenų bazėje jau egzistuoja, ir jums tereikia INSERT eilučių jai užpildyti, be CREATE sakinių, kurie susidurtų su tuo, kas jau yra.
- Atsikratyti triukšmo — išklotinę išpučia
logs,sessions,audit_trailarcachelentelės su dešimtimis milijonų eilučių, kurių niekada nenorite importuoti.
Kodėl mysqldump --no-data neužtenka
Klasikinis patarimas — mysqldump --no-data (tik struktūra) arba mysqldump --no-create-info (tik duomenys). Abu yra eksporto parametrai: jie keičia tai, ką turės nauja išklotinė iš veikiančios duomenų bazės. Jie nieko nepadeda išklotinei, kurią jau turite gulinčią diske kaip .sql failą.
Praktikoje failas dažnai ateina iš kito žmogaus, iš atsarginės kopijos užduoties arba iš serverio, prie kurio nebeturite tiesioginės prieigos. Negalite iš naujo paleisti mysqldump prieš duomenų bazę, kuri nepasiekiama — prisijungimo duomenys dingę, serveris nurašytas arba failas tiesiog yra viskas, ką jums perdavė. Tuomet parametrai bevertis, ir jums lieka redaguoti patį failą.
Rankinis būdas
Akivaizdus ėjimas — pašalinti eilutes su grep ar sed. Norėdami palikti struktūrą ir atmesti duomenis:
# palikti viską, išskyrus INSERT eilutes grep -v '^INSERT INTO' dump.sql > schema.sql # arba palikti tik INSERT eilutes tik duomenų failui grep '^INSERT INTO' dump.sql > data.sql
Mažoje, tvarkingoje išklotinėje tai atrodo tvarkingai — o tada lūžta ties tikra:
- Kelių eilučių INSERT. Vienas
INSERT INTO … VALUESgali užimti tūkstančius eilučių.grepatitinka pirmąją eilutę ir palieka likusias reikšmes „našlaitėmis“, sukurdamas sugadintą failą. - Išplėsti įterpimai. mysqldump sugrupuoja daug eilučių į vieną milžinišką sakinį. Į eilutes orientuoti filtrai negali pasakyti, kur toks sakinys baigiasi.
- Komentarai ir blokai. Sąlyginiai
/*! … */blokai,LOCK TABLESir--komentarai persipina su duomenimis, todėl naivus filtras arba palieka šiukšles, arba iškerpa tai, ko importui reikia. - Tik duomenys – dar blogiau. Grynas
grep '^INSERT'išmetaSETirLOCKsakinius, nuo kurių priklauso eilutės, o bet kuris INSERT, kuris neprasideda tiksliai nuliniame stulpelyje, tyliai dingsta.
Galiausiai užuot gavę savo schemą, derinsite savo paties filtrą.
Tik struktūra arba tik duomenys su DumpCleaner
DumpCleaner supranta SQL sakinius, o ne atitikinėja eilutes, todėl patikimai atskiria struktūrą nuo duomenų — bet kokio dydžio failuose:
- Nutempkite savo
.sqlišklotinę į DumpCleaner (MySQL, MariaDB ar PostgreSQL). Ji analizuoja failą srautiniu būdu, todėl kelių gigabaitų išklotinė įkeliama su pastoviu atminties naudojimu. - Perjunkite norimus sakinių tipus: CREATE TABLE, CREATE INDEX, INSERT INTO, ALTER, DROP, LOCK, SET. Atžymėkite INSERT INTO ir gausite tik struktūrą; atžymėkite CREATE TABLE / CREATE INDEX ir gausite tik duomenis.
- Arba pasirinkite šabloną — Tik struktūra arba Tik duomenys — kad vienu žingsniu nustatytumėte visus perjungiklius, tada, jei norite, patikslinkite pagal lentelę.
- Eksportuokite. Gaunate lieknesnį schemos failą testinei aplinkai ar CI arba švarų tik duomenų dump pradinių duomenų įkėlimui.
Kadangi filtras supranta sakinius, kelių eilučių išplėstas INSERT paliekamas arba atmetamas kaip visuma — niekada neperkerpamas per vidurį.
Tikroji galia ta, kad filtravimas veikia pagal sakinio tipą ir pagal lentelę, ir šie du deriniai jungiasi. Galite palikti kiekvienos lentelės struktūrą, bet įtraukti INSERT duomenis tik toms trims lentelėms, kurių jums iš tikrųjų reikia — palikdami 89 milijonų eilučių logs lentelę kaip tuščią kiautą. To negali išreikšti joks --no-data parametras.
Atskirkite struktūrą nuo duomenų per kelias sekundes
DumpCleaner filtruoja esamą išklotinę pagal sakinio tipą ir pagal lentelę — tik struktūra, tik duomenys ar bet koks derinys — srautiniu būdu, su pastoviu atminties naudojimu. Vietinė macOS ir iPadOS programa, vienkartinis pirkimas.
Atsisiųsti iš App StoreDažnai užduodami klausimai
Ar galiu eksportuoti duomenis be schemos?
Taip. Išjunkite CREATE TABLE ir CREATE INDEX (arba pasirinkite šabloną „Tik duomenys“) ir palikite INSERT INTO. DumpCleaner eksportuoja tik eilutes, pasiruošusias įkelti į jau egzistuojančią schemą.
Ar tik struktūros eksportas išsaugo indeksus ir išorinius raktus?
Taip. Tik struktūra išsaugo CREATE TABLE, CREATE INDEX, ALTER TABLE ir išorinių raktų apibrėžimus — viską, kas apibrėžia duomenų bazę. Pašalinamos tik INSERT duomenų eilutės.
Ar galiu maišyti — struktūrą visoms lentelėms, duomenis kai kurioms?
Taip. Filtravimas veikia pagal sakinio tipą ir pagal lentelę, ir abu deriniai jungiasi. Palikite kiekvienos lentelės struktūrą, bet įtraukite INSERT duomenis tik toms kelioms lentelėms, kurių iš tikrųjų reikia.
Ar tai veikia su PostgreSQL?
Taip. DumpCleaner skaito MySQL, MariaDB ir PostgreSQL išklotines bei automatiškai aptinka formatą, todėl tik struktūros ir tik duomenų eksportas pg_dump failams veikia lygiai taip pat.
Schema be duomenų — arba duomenys be schemos
Nutempkite, perjunkite sakinių tipus, eksportuokite. DumpCleaner padalina bet kokią išklotinę į būtent tą dalį, kurios jums reikia.
Atsisiųsti iš App Store