PostgreSQLで2つのデータベース間でデータを比較する方法は?


93

同じ構造の2つのデータベースを比較することは可能ですか?DB1とDB2の2つのデータベースがあり、それらの間にデータの違いがあるかどうかを確認したいとします。



dbForge Data Compare for PostgreSQLは、このような問題を解決します。
Devart 2017年

postgrescompare.com/downloadsは今もデータを比較しています
ニールアンダーソン

回答:


85

そこにいくつかのツールがあります:

(これらのツールのほとんどは構造のみを比較でき、データは比較できないことに注意してください)

無料のもの:

商業の:


17
liquibase.orgとAquaData Studioだけがデータを比較しているようで、他はスキーマを比較しているだけです。
Amir Ali Akbari 2015年

@AmirAliAkbari Liquibaseスキーマ差分をサポートします
a_horse_with_no_name 2015年

2
apgdiff継承テーブルをうまくサポートしていないようで、使用しようとするとすぐに例外がスローされます。WbSchemaDiff非常にうまく機能します、驚きです!
smartwjw 2015

1
@AmirAliAkbari liquibaseは、テーブルが存在し、同じ構造である場合、データを比較していないようです。
–SEがEVILであるためaditsuは2016

14
-1。OPはデータ(レコード/行)の比較について質問しており、構造を比較するツールをほとんどリストしました。OPは、ターゲットデータベース間で同一であると明示的に述べており、それらを比較する理由はありません。どれが実際に要求されたことをしているのかを明確にしてください。
めったに 'モニカはどこですか'ニーディ2017年

39

pg_dump両方のデータベースで使用し、ファイルを比較してみてください。


23
シンプルで直接的な+1。しかし、たとえば、テーブルが異なる順序で作成された場合、pg_dumpが同じデータベースから同じ順序でデータをダンプすることを確実に知っていますか?(順序が制約の依存関係に基づいていることを望みます。作成時はまったく気にしませんが、うまくスケーリングしないことを望みます。)
Mike Sherrill'Cat Recall '

10
-a-dおよび|を使用できます 並べ替え。ただし、このデータはインポートできない場合がありますが、基本的なチェックには問題ありません。
CemのGüler

正直なところ、これは結果の上位にあるはずです。1日を節約するために差分に依存する必要はないので、これらの本格的で重いJavaベースのソリューションはやり過ぎのように見えます。ただし、移行をサニティチェックすることは理にかなっておりpg_dump、そのためには問題ありません。大きな違いがあるpg_dump場合は、比較できないものを比較しようとしている可能性があります。少なくともPGデータベースを比較するために。
SAS

1
悲しいことに、diffは私が持っているいくつかの大きなダンプを処理できないため、これは小さなデータベースでのみ機能します。そうでなければ、それは(まだ!)本当に私が見つけた唯一の実行可能な解決策です。のpsql -c '\x' -c 'SELECT... ORDER BY...'代わりに使用していますがpg_dump
nyov

11

別の無料アプリ(構造のみを比較でき、データは比較できません):

DBeaver-データベースやテーブルなどを選択して相互に比較できます


1
2つのデータベースのデータをDBeaverと比較する方法を詳しく説明していただけますか?
ニコラ2016年

1
私の知る限り、DBeaverはメタデータの比較のみを許可し、データの比較は許可しません。
ニコラ2016

とても素敵なツールです。最初はあまり直感的ではないのは事実です。このオプションを表示するには、最初に2つ以上のオブジェクトを選択する必要があります。
ihebiheb 2018年

8

私は多くのツールを評価し、次の解決策を見つけました。

スキーマの比較

最も興味深いのは、Liquibase、Persyas、PgCodeKeeperでした。

問題)Liquebaseは変換します:

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

BIGSERIAL

そのため、使用が拒否されました

問題)Persyasは、スキーマを追加して次のようにスローし始めるまでは正常に機能していました。

pyrseas_1       | TypeError: 'NoneType' object is not iterable

だから私はPgCodeKeeperが完璧に動作し、生きていることを発見しました(リリースを確認できます)。次のコマンドを使用します。

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

データ比較: Liquebaseを使用しようとしましたが、機能しません。Liquebaseを使用した2つのデータベースのデータの違いに関する未回答の質問で試した手順を確認できます。

だから私は別のプロジェクト SQLWorkbench / Jを見つけました。それは本当にうまく機能し、SQLでrealldiffを生成します。次のコマンドを使用します。

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

どちらのツールもオブジェクトのフィルタリングをサポートしています。本当に便利です。

移行

そして最後に、移行/バージョン追跡のためだけにLiquebaseを使用します。


6

私はPostgresの包括的な比較ツールに取り組んでいます。ベータ期間中は無料になります。

PostgresCompare

最初はこれは単なるスキーマ(DDL)の比較ですが、おそらくデータにも拡張します。これは、開発環境や運用などの動作も変更せずに、現在のRDBMSから移行するために多くのショップが必要とするツールだと思います。


1
データも非常に重要です。スキーマだけでは不十分です。
houman 2017年

1
こんにちは@Houman。返事が遅れて申し訳ありません。そうです、データが次のステップになります。最初にスキーマ比較ツールを構築することの素晴らしい点は、テーブルなどを検出するためのすべてのコードをそれらの間で共有できることです。
ニールアンダーソン

簡単なスキーマ比較ツールを自分で作成しているときに、この答えに出くわしました。私はあなたのウェブサイトを調べました、そして、ツールは非常に有望に見えます。ベータ版を試すのが待ちきれません
Avantika Saini 2018

アルファ版は現在@AvantikaSainiで入手できます。試してみたら、どうなるか教えてください。みんなのために改善できるようにしています。
ニールアンダーソン

ライセンスの教育版を作成する必要があります。価格は教育目的には高すぎます。
reinaldoluckman

2

私が今まで見た中で最高のツール https://pythonhosted.org/Pyrseas/

  1. データベースからダンプを取得するdbtoyaml..。

  2. A => B yamltodb ... [ステップ1で生成されたファイル]から移行を生成します。


これは、1つのデータベースと1つのダンプファイルを比較するdiffスクリプトを生成する唯一のツールのようです。通常、他のツールは2つのデータベースを比較します。この機能のおかげで、開発者はローカルの開発データベースで作業し、dbtoyamlを実行するだけで、移行スクリプトを作成せずにvcsで変更をコミットして配布できます。他のチーム開発者は、1つのコマンド(yamltodb)でローカルデータベースを更新できます。このワークフローは、VisualStudioデータベースプロジェクトのように機能します。
andreav 2018


0

2つのライブPostgreSQLデータベース(ダンプではない)、テーブルデータ、およびシーケンスを比較するツールを作成しました。かなり初期の頃ですが、私がやりたかったことを達成しました。多分それはあなたにも役立つでしょう。

https://github.com/dmarkey/pgdatadiff


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.