Sürekli üç durum karşımıza çıkıyor:
- Staging veya CI için bir şema kurmak — testlerin gerçek sütunlara, indekslere ve kısıtlamalara karşı çalışabilmesi için boş tablo yapısını istersiniz ama gigabaytlarca üretim satırını tek kullanımlık bir ortama göndermeyi kesinlikle istemezsiniz.
- Yalnızca tohum veri — şema zaten hedef veritabanında mevcut ve onu doldurmak için sadece INSERT satırlarına ihtiyacınız var, mevcut olanla çakışacak CREATE ifadeleri olmadan.
- Gürültüden kurtulmak — dump, hiçbir zaman içe aktarmak istemeyeceğiniz onlarca milyon satırlık
logs,sessions,audit_trailya dacachetablolarıyla şişmiştir.
mysqldump --no-data neden yeterli değil
Klasik tavsiye mysqldump --no-data (yalnızca yapı) ya da mysqldump --no-create-info (yalnızca veri) kullanmaktır. İkisi de dışa aktarma bayraklarıdır: çalışan bir veritabanından alınan yeni bir dump'ın ne içerdiğini değiştirirler. Diskinizde .sql dosyası olarak zaten duran bir dump için hiçbir şey yapmazlar.
Uygulamada dosya çoğu zaman başka birinden, bir yedekleme işinden ya da artık canlı erişiminizin olmadığı bir sunucudan gelir. Ulaşılamayan bir veritabanına karşı mysqldump'ı yeniden çalıştıramazsınız — kimlik bilgileri gitmiştir, sunucu hizmet dışı bırakılmıştır ya da dosya elinizdeki tek şeydir. O noktada bayraklar işe yaramaz ve dosyanın kendisini düzenlemekle baş başa kalırsınız.
Manuel yol
Bariz hamle, satırları grep ya da sed ile ayıklamaktır. Yapıyı tutup veriyi çıkarmak için:
# INSERT satırları hariç her şeyi tut grep -v '^INSERT INTO' dump.sql > schema.sql # veya yalnızca veri dosyası için sadece INSERT satırlarını tut grep '^INSERT INTO' dump.sql > data.sql
Bu, küçük ve düzenli bir dump'ta iyi görünür — ve sonra gerçek bir dump'ta bozulur:
- Çok satırlı INSERT'ler. Tek bir
INSERT INTO … VALUESbinlerce satıra yayılabilir.grepilk satırla eşleşir ve değerlerin geri kalanını yetim bırakarak bozuk bir dosya üretir. - Genişletilmiş insert'ler. mysqldump birçok satırı tek bir devasa ifadede toplar. Satır tabanlı filtreler böyle bir ifadenin nerede bittiğini anlayamaz.
- Yorumlar ve bloklar. Koşullu
/*! … */blokları,LOCK TABLESve--yorumları veriyle iç içe geçer, bu yüzden naif bir filtre ya çöp tutar ya da içe aktarımın ihtiyaç duyduğu bir şeyi keser. - Yalnızca veri daha kötüdür. Saf bir
grep '^INSERT', satırların bağlı olduğuSETveLOCKifadelerini atar ve tam olarak sütun sıfırdan başlamayan her INSERT sessizce kaybolur.
Sonunda şemanızı almak yerine kendi filtrenizi hata ayıklamakla uğraşırsınız.
DumpCleaner ile yalnızca yapı veya yalnızca veri
DumpCleaner satırları eşleştirmek yerine SQL ifadelerini anlar, bu yüzden yapıyı veriden güvenilir şekilde ayırır — her boyuttaki dosyada:
.sqldump'ınızı DumpCleaner'a sürükleyin (MySQL, MariaDB veya PostgreSQL). Dosyayı akış halinde ayrıştırır, böylece çok gigabaytlık bir dump sabit bellekle yüklenir.- İstediğiniz ifade türlerini açıp kapatın: CREATE TABLE, CREATE INDEX, INSERT INTO, ALTER, DROP, LOCK, SET. INSERT INTO'nun işaretini kaldırın, yalnızca yapı elde edin; CREATE TABLE / CREATE INDEX'in işaretini kaldırın, yalnızca veri elde edin.
- Ya da bir hazır ayar seçin — Yalnızca yapı veya Yalnızca veri — her düğmeyi tek adımda ayarlamak için, ardından isterseniz tablo bazında ince ayar yapın.
- Dışa aktarın. Staging veya CI için yalın bir şema dosyası ya da tohumlama için temiz, yalnızca veri içeren bir dump elde edersiniz.
Filtre ifade duyarlı olduğu için çok satırlı genişletilmiş bir INSERT bir bütün olarak tutulur ya da çıkarılır — asla ortasından kesilmez.
Asıl güç, filtrelemenin ifade türüne göre ve tabloya göre çalışması ve ikisinin birleşmesidir. Her tablonun yapısını tutup INSERT verisini yalnızca gerçekten ihtiyaç duyduğunuz üç tablo için dahil edebilirsiniz — 89 milyon satırlık logs tablosunu boş bir kabuk olarak bırakarak. Bu, hiçbir --no-data bayrağının ifade edemeyeceği bir şeydir.
Yapıyı veriden saniyeler içinde ayırın
DumpCleaner mevcut bir dump'ı ifade türüne ve tabloya göre filtreler — yalnızca yapı, yalnızca veri ya da herhangi bir karışım — akış tabanlı, sabit bellekle. Yerel macOS & iPadOS uygulaması, tek seferlik satın alma.
App Store'dan indirSıkça sorulan sorular
Veriyi şema olmadan dışa aktarabilir miyim?
Evet. CREATE TABLE ve CREATE INDEX'i devre dışı bırakın (ya da Yalnızca veri hazır ayarını seçin) ve INSERT INTO'yu tutun. DumpCleaner yalnızca satırları dışa aktarır, halihazırda var olan bir şemaya yüklenmeye hazır olarak.
Yalnızca yapı içeren bir dışa aktarım indeksleri ve foreign key'leri korur mu?
Evet. Yalnızca yapı; CREATE TABLE, CREATE INDEX, ALTER TABLE ve foreign key tanımlarını korur — veritabanını tanımlayan her şeyi. Yalnızca INSERT veri satırları kaldırılır.
Karıştırabilir miyim — tüm tablolar için yapı, bazıları için veri?
Evet. Filtreleme ifade türüne ve tabloya göredir ve ikisi birleşir. Her tablonun yapısını tutup INSERT verisini yalnızca gerçekten ihtiyaç duyduğunuz birkaç tablo için dahil edin.
Bu PostgreSQL ile çalışır mı?
Evet. DumpCleaner MySQL, MariaDB ve PostgreSQL dump'larını okur ve formatı otomatik algılar, bu yüzden yalnızca yapı ve yalnızca veri dışa aktarımları pg_dump dosyaları için de aynı şekilde çalışır.
Verisiz şema — ya da şemasız veri
Sürükleyin, ifade türlerini açıp kapatın, dışa aktarın. DumpCleaner herhangi bir dump'ı tam olarak ihtiyacınız olan parçaya ayırır.
App Store'dan indir