Bir prodution veritabanından bir tabledata alt kümesini yerel test veritabanına nasıl aktarabilirim?


10

Biz nispeten büyük bir üretim postgres tabanlı db: ~ 20GB var. PostgreSQL veritabanı heroku üzerinde barındırılmaktadır.

Üretimde çalışmak zorunda kalmadan bazı testleri çalıştırabilmem için tablo verilerinin küçük bir alt kümesini yerel veritabanıma kopyalamak istiyorum.

Örnek verileri kendim oluşturmak istemiyorum, daha çok üretim ortamında var olan verileri kullanmak istiyorum.

~ Veritabanındaki her tablodan 100 satır yeterli olacaktır. Bunu başarmanın kolay bir yolu var mı?


1
Sadece merakla, neden 20GB çok fazla disk alanı var? Sadece DB kazı alanı için VM'mdeki test diskime 100 GB ayrıldım.
jcolebrand

Harici hd'imi bazen yanımda taşımadığım için SSD'im yeterli alan sağlamaz. Artı gerçekten sadece benim db örnek verilere ihtiyacım var, bütün db değil.
jottr

1
Yeterince adil, ama yine de yaratıcı olmanızı teşvik ediyorum. Daha fazla veriye sahip olmakla ilgili hiçbir sorun yaşamadığım için SD yuvasına sığacak bir SD kartı düşünün :-) ama bu berbat: - \ kişisel dizüstü bilgisayarım son ücretsiz 10GB'a düştü.
jcolebrand

Yanıtlar:



1

Jailer bu durumda yardımcı olabilir. Seninle aynı üzerinde çalışıyorum (her tablonun ~ 100 kayıt almaya çalışıyorum) ve işte yaptığım adımlar: - Kök varlık (neredeyse tablolarla ilişkili olanı) bulun ve kayıtların alt kümesini alın Kök satır (örneğin, kök insanlardır, o zaman insanlar ile ilgili tüm kayıtları arayacağım. id = 1 ...) - 1. adımı bitirdikten sonra, başka bir tabloyla (100 kayıt olmasını istediğiniz tabloyla) yeniden başlayın ) ve alt kümesini yukarıdaki sonuçtan alın.


1

Başka bir seçenek Son zamanlarda rastlamak ettik şeydir (verilmiş, bunu kullanmak için henüz değilim ama plan yakında): rdbms-subsetter.

Birkaç güzel özellik / avantaj ile Jailer'den biraz daha basit ve daha hafif:

  • Mevcut takımlara bağlamak çok kolay CLI
  • Açık kaynak
  • Bir getirme yabancı anahtarları takip edecek tutarlı verilerin alt kümesini
    • Eğer iyi tanımlanmış yabancı anahtarları yoksa, ilişkiler olabilir JSON yapılandırma dosyası aracılığıyla sağlanacaktır. Benim durumumda, bu yapılandırmayı başka bir yerde saklanan şema meta verilerinden oluşturmayı planlıyorum (teşekkürler, Rails: \)
  • Belirli bir satırı hedefleyebilir ve ilgili tüm kayıtları alabilirsiniz (örneğin, belirli bir müşterinin sorunları vardır, böylece hesap iş verilerini yerel olarak erişilebilir hale getirmek için her şeyi aşağı çekebilirsiniz)
  • Tablo başına sabit sayıda kayıt alabilir veya denize girmeden daha büyük tablolardan daha fazla veri almak için bir logaritma alabilir.

Özellikle çok kullandığım (orada çalıştığım gibi) Heroku veritabanları için başka bir seçenekten bahsetmeye değer.

Heroku aslında hazırlanmak için önce yazma günlüklerini çeker, daha sonra yakalamak için birincil DB'ye bağlanır, ardından onu takip etmeyi durdurur gibi yeni bir anlık görüntü DB oluşturma konusunda oldukça hızlıdır. Üretimi çok fazla etkilemek için bu "çatalları" uygulamalarda oluşturabilirsiniz:

$ heroku addons:create heroku-postgres[:specific-plan] \
    --fork your-production-app::DATABASE \
    --app some-other-app-to-own-forked-database \
    [--as PRODUCTION_SNAPSHOT]

Ardından, uygulamanızı bu anlık görüntüye işaret ederek yerel olarak başlatabilirsiniz. Bunu sık sık veri veya şema taşıma işlemleri yapmak veya müşteri sorunlarını ayıklamak için kullanıyorum.

Yukarıdaki komutta, DATABASE_URLon your-production-appile erişilebilen bir DB'niz PRODUCTION_SNAPSHOT_URLvarsa --as, adlı farklı bir uygulamada erişilebilecek ( belirtmişseniz) bir DB ile karşılaşırsınız some-other-app-to-own-forked-database.


0

Rastgele bir satır kümesi almak için LIMIT kullanabilirsiniz :

SELECT * FROM my_table LIMIT 100

Bu en kolay olanıdır ve sadece PostreSQL'in karşılaştığı ilk 100 satırı seçecektir. En son eklenen 100 veya belki de ilk 100 olabilir. Gerçekten rastgele bir şeye ihtiyacınız varsa, bu Stackoverflow cevabına bakın .


Yardım etmeye çalıştığınız için teşekkür ederim, ancak bu sorumu yanıtlamıyor.
jottr

Seçimimi nasıl sınırlayacağımı biliyorum. Benim sorunum, verileri bir alt kümesiyle heroku db klonlamak için bir yol ihtiyacım var; Tüm db'yi herokus kılavuzunda açıklandığı gibi boşaltmak bir seçenek değildir.
jottr

1
@elementz - Sadece tablolar üzerinde döngü ve 'dosya adı' KOPYALA (SEÇ ... SINIR 100) için bir nedeni var mı? Heroku'da KOPYALAMA YAPAMAZ MISINIZ?
rfusca

@rfusca - COPY TO'un var olduğunu bilmiyordum. Denemeye ve raporlamaya çalışacağım.
jottr

3
@rfusca: basit bir LIMITkullanımı FK referanslarıyla uğraşmaz. Örneğin: Siparişler tablosundaki 100 satır, müşteriler tablosundan 100 satır dışa aktarılırken mevcut olmayan müşterileri içerebilir.
a_horse_with_no_name
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.