如何在 PostgreSQL 中比较两个数据库之间的数据?

有没有可能比较两个结构相同的数据库? 假设我有两个数据库 DB1和 DB2,我想检查它们之间的数据是否有差异。

110050 次浏览

尝试在两个数据库上都使用 pg_dump并对文件进行区分。

市面上有几种工具:

(注意,大多数这些工具只能比较结构,而不能比较数据)

免费的:

商业:

另一个免费应用程序(只能比较结构,不能比较数据) :

DBeaver -您可以选择数据库、表等进行相互比较

我还在寻找一种工具来比较数据库中的数据(特别是我对比较 Redshift DB 感兴趣)。 到目前为止,我发现最好的是 https://www.dbbest.com/products/database-compare-suite/#close。 不幸的是,免费试用一天后就过期了。

我正在为 Postgres 开发一个全面的比较工具,它在测试阶段是免费的。

事后比较

最初这只是模式(DDL)比较,但我们可能也会扩展到数据。我相信这是一个工具,许多商店需要从他们目前的关系数据库管理系统,而不必改变他们的开发环境,操作等工作方式。

我见过的最好的工具 Https://pythonhosted.org/pyrseas/

  1. 从数据库 A 获取转储 Dbtoyaml...

  2. 从 A = > B 生成迁移 Yamltodb... [步骤1中生成的文件]

我评估了很多工具,发现了以下解决方案:

图式比较 :

最有趣的是 Liquibase、 Persyas 和 PgCodeKeeper:

(问题)液基转换器:

 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,但是它不起作用,你可以看到我尝试的步骤,在我没有回答的问题 abc 0

因此,我找到了另一个项目 < a href = “ https://www.SQL-Workbench. eu/downloads.html”rel = “ norefrer”> SQL Workbench/J 它工作得非常好,并且在 sql 中生成了真正的 diff。 我使用以下命令:

  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 进行迁移/版本跟踪。

我创建了一个工具来比较2个实时 PostgreSQL 数据库(不是转储)、表数据和序列。很早的时候,但是达到了我想要的效果,也许它也能帮到你。

Https://github.com/dmarkey/pgdatadiff

在我看来,Dbforge 是 postgreql 中比较数据的最强大的工具。这是 Devart 公司的产品,你可以下载 给你

对简单数据库使用 https://github.com/covrom/goerd(不包括触发器、存储进程和嵌套表)。

工具 pgtrick 有一个名为 Pg _ dump _ splitsort的命令

您可以在转储上执行它。

例如:

pg_dump > pre-changes.sql
mkdir pre-changes
cd pre-changes
pg_dump_splitsort ../pre-changes.sql


now do some changes to your DB


pg_dump > post-changes.sql
mkdir post-changes
cd post-changes
pg_dump_splitsort ../post-changes.sql


cd ..


meld pre-changes post-changes

meld-diff-of-directories

meld-diff-of-sql-dump

如果您已经拥有 JetBrains DataGrip的许可证,那么值得检查一下该工具内置的 Compare 特性——参见 供应商文档在这里

一个很好的特性是,您可以从希望进行比较的两个表中选择任意行和列,然后在输出窗格中比较 结果。这为您提供了另一种忽略诸如标识列之类的内容的方法,这些内容可能有合理的理由在每个数据库中不同。

还有另一个 GUI diff 工具,目前只适用于 Windows: PostgreSQL 的合并工具。这不是一个开源的,但是非常实用的免费版本——允许比较模式、差异和合并表数据以及一些编程对象:

enter image description here

我是那个工具的作者。