Tiga situasi kerap timbul:
- Sediakan skema untuk pementasan atau CI — anda mahu struktur jadual kosong supaya ujian boleh dijalankan terhadap lajur, indeks dan kekangan yang sebenar, tetapi anda pasti tidak mahu menghantar gigabait baris pengeluaran ke dalam persekitaran buangan.
- Data benih sahaja — skema sudah wujud dalam pangkalan data sasaran, dan anda cuma perlukan baris INSERT untuk mengisinya, tanpa penyata CREATE yang akan berlanggar dengan apa yang sudah ada.
- Hapuskan bising — dump membengkak oleh jadual
logs,sessions,audit_trailataucachedengan puluhan juta baris yang anda tidak pernah mahu import.
Mengapa mysqldump --no-data tidak mencukupi
Nasihat klasik ialah mysqldump --no-data (struktur sahaja) atau mysqldump --no-create-info (data sahaja). Kedua-duanya ialah bendera eksport: ia mengubah apa yang terkandung dalam dump baharu daripada pangkalan data yang sedang berjalan. Ia langsung tidak berbuat apa-apa untuk dump yang sudah tersedia di cakera anda sebagai fail .sql.
Dalam praktik, fail itu selalunya datang daripada orang lain, atau daripada kerja sandaran, atau daripada pelayan yang anda tidak lagi ada capaian langsung. Anda tidak boleh menjalankan semula mysqldump terhadap pangkalan data yang tidak dapat dihubungi — kelayakannya sudah tiada, pelayan sudah dinyahtauliah, atau fail itu sahajalah yang diserahkan kepada anda. Pada ketika itu bendera tersebut tidak berguna, dan anda terpaksa menyunting fail itu sendiri.
Cara manual
Langkah yang jelas ialah membuang baris dengan grep atau sed. Untuk mengekalkan struktur dan membuang data:
# simpan semua kecuali baris INSERT grep -v '^INSERT INTO' dump.sql > schema.sql # atau simpan hanya baris INSERT untuk fail data sahaja grep '^INSERT INTO' dump.sql > data.sql
Ini nampak elok pada dump kecil yang kemas — dan kemudian gagal pada yang sebenar:
- INSERT berbilang baris. Satu
INSERT INTO … VALUESboleh merentangi beribu-ribu baris.grepmemadankan baris pertama dan meninggalkan selebihnya nilai itu terbiar, menghasilkan fail yang rosak. - Insert lanjutan. mysqldump menggabungkan banyak baris ke dalam satu penyata gergasi. Penapis berasaskan baris tidak dapat menentukan di mana penyata sebegitu berakhir.
- Komen dan blok. Blok bersyarat
/*! … */,LOCK TABLES, dan komen--berselang-seli dengan data, jadi penapis naif sama ada menyimpan sampah atau memotong sesuatu yang diperlukan oleh import. - Data sahaja lebih teruk.
grep '^INSERT'tulen membuang penyataSETdanLOCKyang bergantung padanya baris-baris itu, dan mana-mana INSERT yang tidak bermula tepat pada lajur sifar akan hilang tanpa amaran.
Anda berakhir dengan menyahpepijat penapis anda sendiri dan bukannya mendapatkan skema anda.
Struktur sahaja atau data sahaja dengan DumpCleaner
DumpCleaner memahami penyata SQL dan bukannya memadankan baris, jadi ia mengasingkan struktur daripada data dengan boleh dipercayai — pada fail sebarang saiz:
- Seret dump
.sqlanda ke dalam DumpCleaner (MySQL, MariaDB atau PostgreSQL). Ia menghurai fail dengan menstrim, jadi dump berbilang gigabait dimuatkan dengan memori malar. - Togol jenis penyata yang anda mahu: CREATE TABLE, CREATE INDEX, INSERT INTO, ALTER, DROP, LOCK, SET. Nyahtanda INSERT INTO dan anda dapat struktur sahaja; nyahtanda CREATE TABLE / CREATE INDEX dan anda dapat data sahaja.
- Atau pilih pratetap — Struktur sahaja atau Data sahaja — untuk menetapkan setiap togol dalam satu langkah, kemudian perhalusi setiap jadual jika anda suka.
- Eksport. Anda dapat fail skema yang ringkas untuk pementasan atau CI, atau dump data sahaja yang bersih untuk mengisi benih.
Kerana penapis itu peka-penyata, INSERT lanjutan berbilang baris disimpan atau dibuang secara keseluruhan — tidak pernah dikerat di tengah.
Kuasa sebenarnya ialah penapisan berfungsi setiap jenis penyata dan setiap jadual, dan kedua-duanya bergabung. Anda boleh mengekalkan struktur setiap jadual tetapi menyertakan data INSERT hanya untuk tiga jadual yang anda benar-benar perlukan — meninggalkan jadual logs 89 juta baris sebagai kerangka kosong. Itulah sesuatu yang tiada bendera --no-data dapat luahkan.
Asingkan struktur daripada data dalam beberapa saat
DumpCleaner menapis dump sedia ada mengikut jenis penyata dan mengikut jadual — struktur sahaja, data sahaja, atau sebarang campuran — secara penstriman, dengan memori malar. Aplikasi asli macOS & iPadOS, pembelian sekali sahaja.
Muat turun di App StoreSoalan lazim
Bolehkah saya mengeksport data tanpa skema?
Ya. Lumpuhkan CREATE TABLE dan CREATE INDEX (atau pilih pratetap Data sahaja) dan kekalkan INSERT INTO. DumpCleaner mengeksport hanya baris-barisnya, sedia untuk dimuatkan ke dalam skema yang sudah wujud.
Adakah eksport struktur sahaja mengekalkan indeks dan kunci asing?
Ya. Struktur sahaja mengekalkan CREATE TABLE, CREATE INDEX, ALTER TABLE dan takrifan kunci asing — segala-galanya yang menakrifkan pangkalan data. Hanya baris data INSERT yang dibuang.
Bolehkah saya campur — struktur untuk semua jadual, data untuk sebahagian?
Ya. Penapisan adalah setiap jenis penyata dan setiap jadual, dan kedua-duanya bergabung. Kekalkan struktur setiap jadual tetapi sertakan data INSERT hanya untuk beberapa jadual yang anda benar-benar perlukan.
Adakah ini berfungsi dengan PostgreSQL?
Ya. DumpCleaner membaca dump MySQL, MariaDB dan PostgreSQL serta mengesan formatnya secara automatik, jadi eksport struktur sahaja dan data sahaja berfungsi dengan cara yang sama untuk fail pg_dump.
Skema tanpa data — atau data tanpa skema
Seret, togol jenis penyata, eksport. DumpCleaner mengasingkan sebarang dump kepada tepat bahagian yang anda perlukan.
Muat turun di App Store