Sıralama postgresql veritabanı dökümü (pg_dump)

3 Cevap php

Ben pg_dumps, Dump1 ve Dump2 için oluşturma.

Dump2 Dump1 ters sırayla dökülüyor dışında Dump1 ve Dump2, tam olarak aynıdır.

(Bir diff kullanırken) iki DÖKÜMÜ dosyaları tam olarak aynı olduğunu bu yüzden iki döker sıralamak yine de var mı?

Ben PHP ve linux kullanıyorum. Ben linux in "tür" kullanarak çalıştı, ama bu işe yaramazsa ...

Teşekkürler!

3 Cevap

From your previous question, gerçekten ne yapmaya çalışıyorlar onlar aynı veri dahil olup olmadığını görmek için veritabanları karşılaştırmak olduğunu varsayalım.

As we saw there, pg_dump deterministically davranmaya gitmiyor. Bir dosya diğerinin ters olduğu gerçeği muhtemelen rastlantısaldır.

Burada şema ve veri dahil olmak üzere toplam karşılaştırma yapabileceği bir yoludur.

İlk olarak, şema karşılaştırmak using this method.

İkincisi, tutarlı olacak bir düzen içinde bir dosyaya tüm damping tarafından verileri karşılaştırmak. Sipariş ilk adıyla sıralama tabloları ve ardından birincil anahtar sütunu (ler) tarafından her tablonun içindeki verileri sıralayarak tarafından garanti edilmektedir.

Aşağıdaki sorgu COPY ifadeleri üretir.

select
    'copy (select * from '||r.relname||' order by '||
    array_to_string(array_agg(a.attname), ',')||
    ') to STDOUT;'
from
    pg_class r,
    pg_constraint c,
    pg_attribute a
where
    r.oid = c.conrelid
    and r.oid = a.attrelid
    and a.attnum = ANY(conkey)
    and contype = 'p'
    and relkind = 'r'
group by
    r.relname
order by
    r.relname

Bu sorguyu çalıştıran copy (select * from test order by a,b) to STDOUT; tüm metin dosyasına koy ve her veritabanı için psql'de yoluyla onları çalıştırmak ve ardından çıkış dosyaları karşılaştırmak sizin gibi tabloların bir listesini verecektir. Sen output settings to COPY ile oynamak gerekebilir.

Muhtemelen dökümü ayrıştırmak uğraşmaya değmez.

Bu geçici bir veritabanına Dump2 geri ve doğru sırayla geçici dökümü uzak, çok daha hızlı olacaktır.

Benim çözüm pg_dump çıkışı için kendi programını kod oldu. Birincil anahtarının dökümü sıralar PgDumpSort hangi indirmek için çekinmeyin. Kayıt bilgileri (birincil anahtar değeri, dosya uzaklıklar) bellekte tutulan beri 512MB java varsayılan bellek sayesinde, masa başına kadar 10 milyon kayıtları ile çalışması gerekir.

Bu küçük bir Java programı örneğin kullanın ile

java -cp ./pgdumpsort.jar PgDumpSort db.sql

Ve "db-sorted.sql" adında bir dosya almak veya çıkış dosya adı belirtin:

java -cp ./pgdumpsort.jar PgDumpSort db.sql db-$(date +%F).sql

Ve Sıralanan veri "db-2013-06 06.sql" gibi bir dosya olduğunu

Şimdi diff kullanarak yamaları oluşturabilirsiniz

diff --speed-large-files -uN db-2013-06-05.sql db-2013-06-06.sql >db-0506.diff

Bu genellikle yol küçük artımlı yedekleme oluşturmak için olanak sağlar. Dosyaları geri yüklemek için kullandığınız orijinal dosya yamayı

 patch -p1 < db-0506.diff

(Kaynak kodu JAR dosyası içindedir)