Bir SQL dump'ından yalnızca şemayı (yapıyı) dışa aktarın

Diskte tam bir dump'ınız var ama yalnızca yapıyı istiyorsunuz — CREATE TABLE, indeksler, foreign key'ler — 89 milyon satırlık log tabloları olmadan. Ya da tam tersi: yalnızca veri, CREATE ifadeleri olmadan. İşte alışılmış dump bayraklarının mevcut bir dosyaya neden yardım etmediği ve yapıyı veriden tek tıkla nasıl ayıracağınız.

Sürekli üç durum karşımıza çıkıyor:

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:

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:

  1. .sql dump'ı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.
  2. İ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.
  3. 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.
  4. 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 indir

Sı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