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


Answers:


85

有几种工具:

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

自由人:

商业:


17
只有liquibase.org和Aqua Data Studio似乎在比较数据,其他只是在比较架构。
阿米尔·阿里·阿克巴里

@AmirAliAkbari Liquibase确实支持架构差异
a_horse_with_no_name 2015年

2
似乎apgdiff不能很好地支持继承表,并且在尝试使用它时会立即引发异常。WbSchemaDiff效果很好,惊喜!
smartwjw

1
当表存在并且具有相同的结构时,@ AmirAliAkbari liquibase似乎不比较数据。
aidtsu退出是因为SE为EVIL,2016年

14
-1。OP询问有关比较数据(记录/行)的问题,并且您大都列出了比较结构的工具,OP明确指出目标数据库之间的结构是相同的,因此没有理由比较它们。请说明哪些实际执行了请求的操作。
很少'哪里有莫妮卡'Needy'

39

尝试pg_dump同时在两个数据库上使用并比较文件。


23
+1代表简单直接。但是我们是否确定如果表以不同的顺序构建,pg_dump会以相同的顺序转储来自相同数据库的数据?(我希望订单基于约束依赖关系,完全不关心创建时间,但希望不会很好地扩展。)
Mike Sherrill'Cat Recall'

10
您可以使用-a -d和| 排序。但是此数据可能不可导入,但是可以进行基本检查。
CemGüler

老实说,这应该在结果中更高。一个人不必依靠差异来节省一天的时间,因此这些功能强大,基于Java的笨重解决方案似乎有些过头。但是,理智地检查您的迁移确实是有意义的,并且pg_dump很好。如果您发现与众不同之处,则pg_dump可能是在尝试比较无法比拟的事物。至少用于比较PG数据库。
sas

1
遗憾的是,这仅适用于较小的数据库,因为diff无法处理我拥有的一些大型转储。否则,它(仍然是!)确实是我发现的唯一可行的解​​决方案。虽然我使用psql -c '\x' -c 'SELECT... ORDER BY...'代替pg_dump
纽约,

11

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

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


1
您能否更好地解释如何使用DBeaver比较2个数据库中的数据?
nicola

1
据我所知,DBeaver仅允许元数据比较,而不允许数据比较。
nicola

非常好的工具。确实,起初它不是很直观。您必须先选择2个或更多对象,然后才能看到此选项。
ihebiheb

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的两个数据库的数据差异的问题中看到我尝试的步骤

所以我找到了另一个项目 SQL Workbench / J, 它的工作原理非常好,并在sql中生成了真正的差异。我使用以下命令:

  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开发一个全面的比较工具。Beta版将免费提供。

Postgres比较

最初,这只是架构(DDL)比较,但我们可能还会扩展到数据。我相信,这是许多商店需要的工具,以便从当前的RDBMS迁移而不必同时更改其开发环境,操作等的工作方式。


1
数据也很重要。仅模式是不够的。
侯曼'17

1
嗨@Houman。这么晚才回复很抱歉。没错,数据将是下一步。首先构建架构比较工具的好处在于,所有用于发现表等的代码都可以在它们之间共享。
尼尔·安德森

我在自己构建一个简单的模式比较工具时遇到了这个答案。我浏览了您的网站,该工具看起来很有前途。迫不及待想尝试测试版
Avantika Saini

Alpha现在可以使用@AvantikaSaini,如果您尝试一下,请告诉我它的进展,以便我为每个人改进它。
尼尔·安德森

您应该制作许可证的教育版本。为了教育目的,价格太高了。
reinaldoluckman

2

我见过的最好的工具 https://pythonhosted.org/Pyrseas/

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

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


这似乎是生成比较脚本的唯一工具,该脚本比较一个数据库和一个转储文件。通常,其他工具会比较两个数据库。借助此功能,开发人员可以在本地开发数据库中工作,然后通过vc提交并分发其修改,而无需创建迁移脚本,而只需执行dbtoyaml。团队开发人员可以使用一个命令(yamltodb)更新其本地数据库。此工作流程的工作方式有点像Visual Studio数据库项目。
andreav '18 -4-4



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.