Farklı bir sırayla her zaman veritabanını döker pg_dump postgres

6 Cevap php

Ben şu yaparak test durumlarda boyunca devam edecek olan (aynı zamanda linux bash komutları kullanır) bir PHP komut dosyası yazıyorum:

Bir PostgreSQL veritabanı (8.4.2) kullanıyorum ...

1.) Create a DB 2.) Modify the DB 3.) Store a database dump of the DB (pg_dump)

4). Adımları 1.. Yaparak regresyon test yapın) ve 2.), Ve daha sonra başka bir veritabanı dökümü almak ve adım sayısının 3 özgün veritabanı dökümü) (Fark karşılaştırın.)

Ancak, bu pg_dump hep aynı şekilde veritabanı dökümü olmaz bulma yaşıyorum. Bu farklı bir sırayla her zaman bir şeyler dökümü. Ben iki veritabanı dökümlerini bir diff yaptığınızda nedenle, karşılaştırma aslında aynı olduğunda iki dosya sadece farklı bir sırayla, farklı olmak neden olacaktır.

Ben pg_dump yapıyor hakkında gidebilirsiniz farklı bir yolu var mı?

Teşekkürler!

6 Cevap

Bu yüzden disk için veri döker gibi, belirli bir sırayla veri dökümü pg_dump zorlamak imkansız - çok daha hızlı olmaktadır.

Siz "sort" çıktı, ama newlines veri sonra pg_dump için "-a-d" seçeneklerini kullanabilirsiniz ve sıralı bir çıkış alınabilir değil yapacaktır. Ama temel karşılaştırma için bir şey değişti olsun o yeterli olacaktır.

İşte diffing ve sürüm kontrolü depolanması için daha uygun hale getirmek için ön-işleme pg_dump çıkışı için kullanışlı bir betik:

http://github.com/akaihola/pgtricks/blob/master/pg_dump_splitsort.py

Aşağıdaki dosyaları içine dökümü böler:

  • 0000_prologue.sql: ilk COPY kadar her şeyi
  • 0001_<schema>.<table>.sql
    .
    .
    NNNN_<schema>.<table>.sql: data for each table sorted by the first field
  • 9999_epilogue.sql: Son COPY sonra her şeyi

Tablo verileri için dosyaları tüm dosyaları basit sıralı birleştirme yeniden oluşturmak veritabanı için kullanılabilir böylece numaralandırılır:

$ cat *.sql | psql <database>

Ben çöplük arasındaki farklara bir göz almak için iyi bir yol bütün dizinde meld aracı kullanmak olduğunu bulduk:

$ meld old-dump/ new-dump/

Sürüm kontrolü dökümü saklanması da farklılıklar üzerinde iyi bir görünüm verir. İşte farklarını renk kullanmak için git yapılandırmak için:

# ~/.gitconfig
[color]
        diff = true
[color "diff"]
        frag = white blue bold
        meta = white green bold
        commit = white red bold

Note: oluşturduğunuz varsa / yeni dökümü sonrası işleme öncesi tüm .sql dosyaları silmek için hatırlıyorum, tablolar değiştirildi / düştü.

Burada ayırt şema ve veri değer. Şema oldukça deterministik sırayla dökülür, en nesneleri alfabetik inter-nesne bağımlılıkları ile kısıtlı. Orada düzen tamamen kısıtlı değildir ve dışarıdan bir gözlemci rastgele görünebilir bazı sınırlı durumlarda, ancak bu sonraki sürümü sabit alabilirsiniz.

Öte yandan veri diski amacıyla boşaltılır. Eğer döker sıralama yapmak için kaynakların deli miktarda kullanın, hızlı değil, olmak istiyorum, çünkü bu, ne istediğinizi genellikle. Ne gözlemleyerek olabilir Eğer "DB değişiklik" olduğunda aslında eski değerini silin ve sonunda yeni bir değer ekleyeceği bir UPDATE, yapıyor olmasıdır. Ve tabii ki olacak sizin diff strateji üzgün.

Amaç için daha uygun olabilir bir araçtır pg_comparator.

PostgreSQL nondeterministically davranır olağandışı değildir - belki zamanlayıcı yeniden yapılanma süreçlerini veya arka planda meydana gibi bir şey tetikledi. Dahası ben arda çalışır biraz özdeş çıkışı çoğaltmak pg_dump zorlamak için bir yol farkında değilim.

Bu davranış sergiledi ki karşılaştırma çünkü ben senin karşılaştırma mantığı değiştirmek öneririm - hem döker aynı veritabanı devleti temsil ederken farklılıkları raporlar. Bu tabii ki bazı ek iş gelir ama bence sorunu saldırmak için doğru yoldur.

Bu ekler "- - emretti" Mayıs 2010 itibariyle bir patch to pg_dump bu konuda ilgilenen tüm yararlı olabilir var bu programı seçeneği:

Using --ordered will order the data by primary key or unique index, if one exists, and use the "smallest" ordering (i.e. least number of columns required for a unique order).

Note that --ordered could crush your database server if you try to order very large tables, so use judiciously.

Bunu test etmedi, ama denemeye değer sanırım.

Şemada sadece istiyorsanız:

Eğer masa-by-kullanarak bir seferde sadece tek bir tablo için şema dökümü için bu seçeneklerin bir arada tarafından fark tablo yapabilirdi. Daha sonra bilinen bir sırayla bir dosya için tek tek veya kedi onlara bütün bunları karşılaştırmak olabilir.

-s, --schema-only           dump only the schema, no data
-t, --table=TABLE           dump the named table(s) only

Yukarıdaki sorgu information_schema.tables beslemek için tabloların listesini oluşturmak için.