Geliştirici anlık görüntüsü için tabloların yalnızca bölümlerinin Postgres dökümü


97

Üretimde veritabanımız birkaç yüz gigabayt boyutundadır. Geliştirme ve test için, bu veritabanının işlevsel olarak eşdeğer ancak yalnızca 10 veya 20 gig boyutunda anlık görüntülerini oluşturmamız gerekiyor.

Buradaki zorluk, ticari kuruluşlarımıza ait verilerin birçok tabloya dağılmış olmasıdır. Dökümde sadece bazı varlıkların yer alması için bir çeşit filtrelenmiş anlık görüntü oluşturmak istiyoruz . Bu şekilde, geliştirme ve test için her ay yeni anlık görüntüler elde edebiliriz.

Örneğin, bu çoka çok ilişkiye sahip varlıklarımız olduğunu varsayalım:

  • Şirketin N Bölümü var
  • Bölümde N Çalışanı var
  • Çalışanın N Katılım Kaydı var

Belki 1000 şirket, 2500 bölüm, 175000 çalışan ve on milyonlarca katılım kaydı vardır. Diyelim ki ilk 100 şirketi ve tüm kurucu bölümlerini, çalışanlarını ve yoklama kayıtlarını almak için tekrarlanabilir bir yol istiyoruz .

Şu anda şema için pg_dump kullanıyoruz ve daha küçük tablolardan tüm verileri almak için --disable-triggers ve --data-only ile pg_dump çalıştırıyoruz. Verinin bir kısmını çıkarmak için özel komut dosyaları yazmak zorunda kalmak istemiyoruz çünkü hızlı bir geliştirme döngüsüne sahibiz ve özel komut dosyalarının kırılgan olacağından ve muhtemelen güncel olmayacağından endişe duyuyoruz.

Bunu nasıl yapabiliriz? Veritabanından mantıksal bölümleri çıkarmaya yardımcı olabilecek üçüncü taraf araçlar var mı? Bu araçlara ne denir?

Herhangi bir genel tavsiye de takdir edilmektedir!

Yanıtlar:


108

Daha büyük tablolarınızda alt kümeleri çıkarmak için COPY komutunu kullanabilirsiniz ...

COPY (SELECT * FROM mytable WHERE ...) TO '/tmp/myfile.tsv'

COPY mytable FROM 'myfile.tsv'

https://www.postgresql.org/docs/current/static/sql-copy.html

Üretiminizin bir alt kümesini almak yerine bir dizi geliştirme verisini korumayı düşünmelisiniz. Birim testleri yazmanız durumunda, tüm olası kullanım durumlarına ulaşmaya çalışarak testler için gerekli olan aynı verileri kullanabilirsiniz.


1
Bu tekniği OP ile aynı şeyi yapmak için büyük bir başarı için kullandım. Test çalışmaları için COPY (SELECT ..) TO .. ​​için kısıtlanmış verileri bir "şablon" veritabanına yükledim ve CREATE DATABASE test_run_XX TEMPLATE product_snapshot_XX kullandım. Tabii ki verileri minimuma indirdim, böylece yüklenen ürün anlık görüntüsü ve test veritabanı oluşturma işlemleri bir ekip engeli olmayacak kadar hızlı.
Trey

5
Anlık görüntülerini almak istediğiniz birden çok birleştirilmiş tablonuz varsa, bunu çalıştırmanın bir yolu var mı? COPY FROM, birden çok tablonun içe aktarılmasını desteklemez.
mlissner

1
Sen erkeksin ... Bu benim için işleri çok kolaylaştırıyor, ama farklı bir amaç için. Çok kiracılı bir uygulamada verileri genel şemadan kullanıcıya özel şemaya taşımak için kullandım. Teşekkürler !
Jeremy F.

5
Bu yöntemin kopyalanan tablolardaki dizileri güncellemediğini, bu nedenle daha fazla eklemenin birincil anahtar kısıtlamalarını ihlal edebileceğini unutmayın.
user2859458

1
Onun \copyyerine kullanmak zorunda kaldım COPYçünkü ikincisi yalnızca süper kullanıcıydı. Neyse ki, 9.1'de başka hiçbir değişiklik olmadan diğer her şey mükemmel çalıştı.
PJSCopeland

8

Bunu zaten yapan herhangi bir yazılım bilmiyorum ama 3 alternatif çözüm düşünebilirim. Ne yazık ki, hepsi bazı özel kodlamalar gerektiriyor.

  1. Tüm tabloları ayrı bir şemada yeniden oluşturun, ardından bu tablolara yalnızca dökümünü almak istediğiniz verilerin alt kümesini kopyalayın, kullanın INSERT INTO copy.tablename SELECT * FROM tablename WHERE ...ve dökümünü alın.

  2. Veri dökümü için kendi komut dosyanızı SQL ifadeleri olarak yazın. Bu yaklaşımı geçmişte kullandım ve sadece 20-30 PHP satırı gibi bir şey aldı.

  3. Pg_dump'ı, tek bir tabloyu dökerken -t anahtarıyla birlikte bir koşulu kabul edecek şekilde değiştirin.


6

13
Bu bağlantı soruyu cevaplayabilirken, cevabın temel kısımlarını buraya eklemek ve referans için bağlantıyı sağlamak daha iyidir. Bağlantılı sayfa değişirse yalnızca bağlantı yanıtları geçersiz hale gelebilir.
talonmies

3
Bu gerçekten mantıklı değil. OP, özellikle bunu yapan üçüncü taraf araçların adlarını sordu. Cevabın özü bu nedenle yalnızca "Bu URL'de bunu yapan 'Jailer' adında bir üçüncü taraf aracı var." Bu bağlantının kendisi tüm gerekli bilgileri sağlar; eklenecek başka bir şey yok. Bu bağlantı çalışmayı durdurursa, URL'den "programın adı Jailer" olduğu kolayca çıkarılabilir, bu nedenle onu eklemek gereksiz olacaktır.
Paul Legato

2
Elbette bağlantı artık kesildi ve google başka bir alternatif sunmuyor.
owensmartin

1
Bağlantı şu anda benim için çalışıyor ve " jailer postgres" için Google'da github.com/Wisser/Jailer da geldi.
Paul Legato

10
Belki howbu aracı kullandığınızla ilgili yararlı bir açıklama eklerseniz, hedefe nasıl ulaştığını anlayabiliriz
Bryan Ash
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.