Bagaimana cara membandingkan data antara dua database di PostgreSQL?

93

Apakah mungkin untuk membandingkan dua database dengan struktur yang identik? Katakanlah saya memiliki dua database DB1 dan DB2 dan saya ingin memeriksa apakah ada perbedaan data di antara keduanya.

sennin
sumber
Lihat juga stackoverflow.com/q/2178907/453605
Marcello Nuccio
Perbandingan dbForge Data untuk PostgreSQL memecahkan masalah tersebut.
Devart
postgrescompare.com/downloads membandingkan data sekarang juga
Neil Anderson

Jawaban:

85

Ada beberapa alat di luar sana:

(perhatikan bahwa sebagian besar alat ini hanya dapat membandingkan struktur, tetapi tidak datanya)

Yang Gratis:

Komersial:

seekor kuda tanpa nama
sumber
17
Hanya liquibase.org dan Aqua Data Studio yang tampaknya membandingkan data, yang lain hanya membandingkan skema.
Amir Ali Akbari
@AmirAliAkbari Liquibase tidak mendukung perbedaan skema
a_horse_with_no_name
2
Tampaknya itu apgdifftidak mendukung tabel warisan dengan baik, dan pengecualian segera muncul ketika saya mencoba menggunakannya. WbSchemaDiffbekerja dengan sangat baik, kejutan!
smartwjw
1
@AmirAliAkbari liquibase tampaknya tidak membandingkan data ketika tabel ada dan memiliki struktur yang sama.
aditsu berhenti karena SE JAHAT
14
-1. OP bertanya tentang membandingkan data (catatan / baris) dan Anda sebagian besar telah mencantumkan alat yang membandingkan struktur , yang secara eksplisit dinyatakan OP identik antara database target, sehingga tidak ada alasan untuk membandingkannya. Mohon klarifikasi mana yang benar-benar melakukan hal yang diminta.
Jarang 'Where's Monica' Needy
39

Coba gunakan pg_dumppada kedua database dan lakukan diff file.

Julio Santos
sumber
23
1 untuk sederhana dan langsung. Tapi apakah kita tahu pasti bahwa pg_dump akan membuang data dari database identik dalam urutan yang sama jika, katakanlah, tabel dibuat dalam urutan yang berbeda? (Saya berharap urutannya didasarkan pada dependensi kendala, sama sekali tidak peduli dengan waktu penciptaan, tetapi harapan tidak berkembang dengan baik.)
Mike Sherrill 'Cat Recall'
10
Anda dapat menggunakan -a -d dan | semacam. Tetapi data ini mungkin tidak dapat diimpor, namun akan baik-baik saja untuk pemeriksaan dasar.
Cem Güler
Ini harus lebih tinggi dalam hasil, jujur. Seseorang tidak harus bergantung pada diff untuk menyelamatkan hari sehingga solusi berbasis java yang lengkap dan berat ini tampak seperti berlebihan. Namun, masuk akal untuk memeriksa migrasi Anda dan pg_dumptidak masalah untuk itu. Jika Anda melihat perbedaan yang signifikan dengan pg_dumpAnda mungkin mencoba membandingkan hal-hal yang tidak dapat dibandingkan. Setidaknya untuk membandingkan PG dbs.
sas
1
Sayangnya ini hanya berfungsi pada database yang lebih kecil, karena diff tidak dapat menangani beberapa dump besar yang saya miliki. Kalau tidak, itu (masih!) Benar-benar satu-satunya solusi yang bisa diterapkan yang saya temukan. Meskipun saya menggunakan, psql -c '\x' -c 'SELECT... ORDER BY...'bukan pg_dump.
nyov
11

Aplikasi gratis lainnya (yang hanya dapat membandingkan struktur, tetapi tidak datanya ):

DBeaver - Anda dapat memilih database, tabel, dll untuk dibandingkan satu sama lain

iki
sumber
1
Bisakah Anda menjelaskan lebih baik bagaimana membandingkan data dari 2 database dengan DBeaver?
nicola
1
Sejauh yang saya tahu DBeaver hanya mengizinkan perbandingan metadata, bukan perbandingan data.
nicola
Alat yang sangat bagus. Memang benar bahwa cara melakukannya pada awalnya tidak terlalu intuitif. Anda harus terlebih dahulu memilih 2 objek atau lebih agar Anda dapat melihat opsi ini.
ihebiheb
8

Saya telah mengevaluasi banyak alat dan menemukan solusi berikut:

Perbandingan skema :

Yang paling menarik adalah Liquibase, Persyas dan PgCodeKeeper:

( masalah ) Liquebase mengonversi:

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

ke

BIGSERIAL

Jadi ditolak untuk digunakan

( Masalah ) Persya berfungsi dengan baik sampai saya menambahkan beberapa skema tambahan dan itu mulai melempar:

pyrseas_1       | TypeError: 'NoneType' object is not iterable

Jadi saya telah menemukan PgCodeKeeper berfungsi dengan sempurna dan aktif (Anda dapat memeriksa rilis). Saya menggunakan perintah berikut:

./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

Perbandingan data: Saya telah mencoba menggunakan Liquebase dan tidak berhasil, Anda dapat melihat langkah-langkah yang saya coba dalam pertanyaan saya yang belum terjawab tentang perbedaan data dari dua database dengan Liquebase

Jadi saya telah menemukan proyek lain SQL Workbench / J. Ini bekerja sangat bagus dan menghasilkan perbedaan nyata di sql. Saya menggunakan perintah berikut:

  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 ;'"

Kedua alat mendukung filtrasi objek. Ini sangat nyaman.

Migrasi

Dan akhirnya saya menggunakan Liquebase hanya untuk migrasi / pelacakan versi.

i.bondarenko
sumber
6

Saya sedang mengerjakan alat perbandingan komprehensif untuk Postgres. Ini akan gratis saat dalam versi beta.

PostgresCompare

Awalnya ini hanya perbandingan skema (DDL) tetapi kami mungkin akan memperluas ke data juga. Saya percaya ini adalah alat yang dibutuhkan banyak toko untuk berpindah dari RDBMS mereka saat ini tanpa harus juga mengubah cara kerja lingkungan pengembangan, operasi, dll.

Neil Anderson
sumber
1
Data juga sangat penting. Skema saja tidak cukup.
Houman
1
Hai @Houman. Maaf atas balasan yang terlambat. Anda benar, data akan menjadi langkah selanjutnya. Hal yang hebat tentang membuat alat perbandingan skema terlebih dahulu adalah semua kode untuk menemukan tabel, dll. Dapat dibagikan di antara mereka.
Neil Anderson
Saya menemukan jawaban ini saat membangun alat perbandingan skema sederhana sendiri. Saya memeriksa situs web Anda dan alatnya terlihat sangat menjanjikan. Tidak sabar untuk mencoba versi beta
Avantika Saini
Alpha saat ini tersedia di @AvantikaSaini dan jika Anda mencobanya, beri tahu saya bagaimana kelanjutannya sehingga saya dapat meningkatkannya untuk semua orang.
Neil Anderson
Anda harus membuat lisensi versi pendidikan. Harganya terlalu tinggi untuk tujuan pendidikan.
reinaldoluckman
2

Alat terbaik yang pernah saya lihat https://pythonhosted.org/Pyrseas/

  1. Dapatkan dump dari database A dbtoyaml ...

  2. Hasilkan migrasi dari A => B yamltodb ... [file dibuat pada langkah 1]

Oleg Tsarev
sumber
Ini tampaknya menjadi satu-satunya alat yang menghasilkan skrip diff yang membandingkan satu database dan satu file dump. Biasanya alat lain membandingkan dua database. Berkat fitur ini, pengembang dapat bekerja dengan database pengembang lokal, kemudian mengkomit dan mendistribusikan modifikasinya dengan vcs tanpa membuat skrip migrasi, cukup menjalankan dbtoyaml. Pengembang tim lainnya dapat memperbarui database lokalnya dengan satu perintah (yamltodb). Alur kerja ini bekerja seperti proyek database studio visual.
andreav
0

Saya membuat alat untuk membandingkan 2 database PostgreSQL langsung (bukan dump), data tabel, dan urutan. Hari-hari yang cukup awal tetapi mencapai apa yang saya inginkan, mungkin itu dapat membantu Anda juga.

https://github.com/dmarkey/pgdatadiff

dmarkey
sumber
0

Menurut pendapat saya Dbforge adalah alat yang paling kuat untuk membandingkan data di postgresql. Ini adalah produk dari perusahaan Devart. Anda dapat mengunduh di sini .

Mohsen Zahedi
sumber