PostgreSQL'de iki veritabanı arasındaki veriler nasıl karşılaştırılır?


93

Aynı yapıya sahip iki veritabanını karşılaştırmak mümkün müdür? Diyelim ki DB1 ve DB2 iki veritabanım var ve aralarında veri farkı olup olmadığını kontrol etmek istiyorum.




postgrescompare.com/downloads şimdi de verileri karşılaştırıyor
Neil Anderson

Yanıtlar:


85

Orada birkaç araç var:

(bu araçların çoğunun yalnızca yapıyı karşılaştırabileceğini, verileri karşılaştıramayacağını unutmayın)

Ücretsiz Olanlar:

Ticari:


17
Görünüşe göre yalnızca liquibase.org ve Aqua Data Studio verileri karşılaştırıyor, diğeri ise şemayı karşılaştırıyor.
Amir Ali Akbari

@AmirAliAkbari Liquibase yapar destek şema diffs
a_horse_with_no_name

2
Görünüşe göre apgdifftabloları iyi desteklemiyor ve kullanmaya çalıştığımda istisna hemen atılıyor. WbSchemaDiffçok iyi çalışıyor, sürpriz!
smartwjw

1
@AmirAliAkbari likit tabanı, tablolar var olduğunda ve aynı yapıya sahip olduğunda verileri karşılaştırmıyor gibi görünüyor.
aditsu SE EVIL olduğu için ayrıldı

14
-1. OP verileri karşılaştırmayı soruyordu (kayıtlar / satırlar) ve siz çoğunlukla OP'nin hedef veritabanları arasında aynı olduğunu açıkça ifade ettiği yapıyı karşılaştıran araçları listelediniz , onları karşılaştırmak için bir neden yok. Lütfen hangisinin istenen şeyi gerçekten yaptığını açıklayın.
Nadiren 'Monica Nerede' Needy

39

pg_dumpHer iki veritabanında kullanmayı ve dosyaları farklılaştırmayı deneyin .


23
Basit ve doğrudan için +1. Ancak, tablolar farklı sıralarda oluşturulmuşsa, pg_dump'ın aynı veri tabanlarından verileri aynı sırayla dökeceğinden emin miyiz? (Siparişin kısıtlama bağımlılıklarına dayandığını umuyorum, yaratılış zamanını hiç önemsemiyor, ancak umut iyi ölçeklenmiyor.)
Mike Sherrill 'Cat Recall'

10
-a -d ve | çeşit . Ancak bu veriler içe aktarılamayabilir, ancak temel kontrol için uygun olacaktır.
Cem Güler

Dürüst olmak gerekirse, bu sonuçlarda daha yüksek olmalıdır. Günü kurtarmak için bir farka güvenmek zorunda değilsiniz, bu yüzden bu tam gelişmiş, ağır, java tabanlı çözümler aşırı derecede gözüküyor. Bununla birlikte, göçlerinizi kontrol etmek mantıklı ve pg_dumpbunun için sorun değil. Arada önemli farklar pg_dumpgörüyorsanız, muhtemelen karşılaştırılamayacak şeyleri karşılaştırmaya çalışıyorsunuzdur. En azından PG dbs'yi karşılaştırmak için.
sas

1
Ne yazık ki, diff sahip olduğum bazı büyük dökümleri kaldıramadığından, bu sadece daha küçük veritabanlarında çalışıyor. Aksi takdirde, bulduğum tek uygulanabilir çözüm (hala!). Onun psql -c '\x' -c 'SELECT... ORDER BY...'yerine kullanmama rağmen pg_dump.
nyov

11

Başka bir ücretsiz uygulama ( yalnızca yapıyı karşılaştırabilen ancak verileri karşılaştırmayan ):

DBeaver - birbirleriyle karşılaştırmak için veritabanları, tablolar vb. Seçebilirsiniz


1
DBeaver ile 2 veritabanındaki verilerin nasıl karşılaştırılacağını daha iyi açıklar mısınız?
nicola

1
Bildiğim kadarıyla DBeaver veri karşılaştırmasına değil, yalnızca meta veri karşılaştırmasına izin veriyor.
nicola

Çok güzel bir araç. İlk başta nasıl yapılacağı çok sezgisel olmadığı doğru. Bu seçeneği görebilmeniz için önce 2 veya daha fazla nesne seçmelisiniz.
ihebiheb

8

Birçok aracı değerlendirdim ve aşağıdaki çözümü buldum:

Şema karşılaştırması :

En ilginç olanlar Liquibase, Persyas ve PgCodeKeeper idi:

( sorun ) Liquebase şunları dönüştürür:

 SET DEFAULT nextval('myschema.name_id_seq'::regclass)

içine

BIGSERIAL

Bu yüzden kullanımı reddedildi

( sorun ) Persyas, ek şema ekleyene kadar iyi çalıştı ve aşağıdakileri atmaya başladı:

pyrseas_1       | TypeError: 'NoneType' object is not iterable

Böylece PgCodeKeeper'ın mükemmel çalıştığını ve canlı olduğunu buldum (sürümleri kontrol edebilirsiniz). Aşağıdaki komutu kullanıyorum:

./pgcodekeeper-cli.sh -E -I ./ignore.txt \
-s "jdbc:postgresql://localhost/postgres?user=postgres&password=123" \
-t "jdbc:postgresql://localhost/postgres?user=postgres&password=123" \
-o /result/schema-diff-$(date +'%m%d%y_%H%M%S').sql

Veri karşılaştırması: Liquebase'i kullanmayı denedim ve işe yaramıyor Liquebase ile iki veritabanının veri farkı hakkındaki cevapsız sorumda denediğim adımları görebilirsiniz.

Bu yüzden başka bir proje buldum SQL Workbench / J Gerçekten güzel çalışıyor ve sql'de gerçek fark oluşturuyor. Aşağıdaki komutu kullanıyorum:

  java -jar /sqlworkbench.jar -command="'WbDataDiff -excludeTables=$EXCLUDE_TABLES \
-referenceConnection=$REFERENCE_CONNECTION \ 
-targetConnection=$TARGET_CONNECTION -referenceSchema=$1 \
-targetSchema=$1  -file=$DIFF_RESULT_FILE -singleFile=true \
-includeDelete=true -ignoreMissingTarget=true ;'"

Her iki araç da nesne filtrelemesini destekler. Gerçekten uygun.

Göçler

Ve son olarak Liquebase'i yalnızca geçiş / sürüm takibi için kullanıyorum.


6

Postgres için kapsamlı bir karşılaştırma aracı üzerinde çalışıyorum. Beta sürümündeyken ücretsiz olacak.

PostgresCompare

Başlangıçta bu sadece şema (DDL) karşılaştırmasıdır, ancak muhtemelen verilere de genişleyeceğiz. Bunun, birçok mağazanın, geliştirme ortamlarının, işlemlerinin vb.


1
Veriler de çok önemlidir. Şema tek başına yeterli değildir.
Houman

1
Merhaba @Houman. Geç cevap verdiğim için özür dilerim. Haklısın, veriler bir sonraki adım olacak. İlk olarak şema karşılaştırma aracını oluşturmanın en güzel yanı, tabloları vb. Keşfetmek için tüm kodun aralarında paylaşılabilmesidir.
Neil Anderson

Ben de basit bir şema karşılaştırma aracı oluştururken bu cevaba rastladım. Web sitenizi inceledim ve araç çok umut verici görünüyor. Beta sürümünü denemek için sabırsızlanıyorum
Avantika Saini

Alfa şu anda mevcut @AvantikaSaini ve bir denerseniz lütfen nasıl gittiğini bana bildirin, böylece herkes için iyileştirebilirim.
Neil Anderson

Lisansın eğitici bir sürümünü yapmalısınız. Eğitim amaçlı fiyat çok yüksek.
reinaldoluckman

2

Şimdiye kadar gördüğüm en iyi araç https://pythonhosted.org/Pyrseas/

  1. A dbtoyaml veritabanından dökümü alın ...

  2. A => B yamltodb ... [1. adımda oluşturulan dosya] 'dan taşıma oluşturun


Bu, bir veritabanı ve bir döküm dosyasını karşılaştıran diff betikleri üreten tek araç gibi görünüyor. Genellikle diğer araçlar iki veritabanını karşılaştırır. Bu özellik sayesinde, geliştiriciler yerel bir geliştirme veritabanında çalışabilir, ardından değişikliklerini vcs ile aktarabilir ve dağıtabilir, geçiş komut dosyaları oluşturmadan, sadece dbtoyaml'yi çalıştırarak. Oher ekip geliştiricileri, yerel veritabanlarını tek bir komutla (yamltodb) güncelleyebilir. Bu iş akışı biraz görsel stüdyo veritabanı projesine benzer.
andreav


0

2 canlı PostgreSQL veritabanını (dökümleri değil), tablo verilerini ve dizileri karşılaştırmak için bir araç yarattım. Oldukça erken günler ama yapmasını istediğim şeyi başardım, belki size de yardımcı olabilir.

https://github.com/dmarkey/pgdatadiff


0

Bence Dbforge postgresql'de verileri karşılaştırmak için en güçlü araçtır. Devart firmasının bir ürünüdür. Buradan indirebilirsiniz .

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.