【问题标题】:How to compare data between two databases in PostgreSQL?如何在 PostgreSQL 中比较两个数据库之间的数据?
【发布时间】:2011-06-15 20:13:01
【问题描述】:

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

【问题讨论】:

标签: postgresql schema-compare


【解决方案1】:

有几种工具:

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

免费的:

商业:

【讨论】:

  • 似乎只有 liquibase.org 和 Aqua Data Studio 比较数据,其他的只是比较模式。
  • @AmirAliAkbari Liquibase 是否支持模式差异
  • 看来apgdiff 不支持继承表,当我尝试使用它时立即抛出异常。 WbSchemaDiff 效果很好,惊喜!
  • @semparatus 对我来说也一样。 apgdiff 似乎不再起作用了。
  • @AmirAliAkbari liquibase 在表存在且结构相同时似乎不会比较数据。
【解决方案2】:

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

【讨论】:

  • +1 表示简单直接。但是我们是否确定 pg_dump 会以相同的顺序从相同的数据库中转储数据,例如,如果表是按不同的顺序构建的? (我希望顺序是基于约束依赖,根本不关心创建时间,但希望不能很好地扩展。)
  • 你可以使用 -a -d 和 |种类 。但是这些数据可能无法导入,但可以用于基本检查。
  • 老实说,这在结果中应该更高。一个人不应该依赖差异来挽救一天,所以这些成熟的、沉重的、基于 java 的解决方案似乎有点过头了。但是,健全地检查您的迁移确实是有意义的,pg_dump 就可以了。如果您看到与 pg_dump 的显着差异,您可能正在尝试比较无法比较的事物。至少用于比较 PG dbs。
  • 遗憾的是,这只适用于较小的数据库,因为 diff 无法处理我拥有的一些大转储。否则它(仍然!)真的是我找到的唯一可行的解​​决方案。虽然我使用的是psql -c '\x' -c 'SELECT... ORDER BY...' 而不是pg_dump
【解决方案3】:

另一个免费应用程序(can only compare structure, but not data):

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

【讨论】:

  • 您能否更好地解释一下如何将来自 2 个数据库的数据与 DBeaver 进行比较?
  • 据我所知 DBeaver 只允许元数据比较,不允许数据比较。
  • 非常好的工具。确实,起初如何做并不是很直观。您必须先选择 2 个或更多对象才能看到此选项。
【解决方案4】:

我评估了很多工具并找到了以下解决方案:

架构比较

最有趣的是 Liquibase、Persyas 和 PgCodeKeeper:

(issue) Liquebase 转换:

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

进入

BIGSERIAL

所以被拒绝使用

(issue) 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,但它不起作用,您可以查看我在未回答的问题 about data difference of two databases with 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 进行迁移/版本跟踪。

【讨论】:

    【解决方案5】:

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

    PostgresCompare

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

    【讨论】:

    • 数据也很重要。仅架构是不够的。
    • 嗨@Houman。这么晚才回复很抱歉。你是对的,数据将是下一步。首先构建模式比较工具的好处是所有用于发现表等的代码都可以在它们之间共享。
    • 我在自己构建一个简单的模式比较工具时遇到了这个答案。我浏览了您的网站,该工具看起来很有前途。迫不及待想试用测试版
    • Alpha 版现在可用 @AvantikaSaini,如果您试一试,请告诉我进展如何,以便我为大家改进。
    • 你应该制作一个教育版的许可证。对于教育目的,价格太高了。
    【解决方案6】:

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

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

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

    【讨论】:

    • 这似乎是唯一一个生成比较一个数据库和一个转储文件的差异脚本的工具。通常其他工具比较两个数据库。由于这个特性,开发人员可以在本地开发数据库中工作,然后通过 vcs 提交和分发他们的修改,而无需创建迁移脚本,只需执行 dbtoyaml。其他团队开发人员可以使用单个命令 (yamltodb) 更新他们的本地数据库。这个工作流程有点像 Visual Studio 数据库项目。
    【解决方案7】:

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

    【讨论】:

      【解决方案8】:

      我创建了一个工具来比较 2 个实时 PostgreSQL 数据库(不是转储)、表数据和序列。很早的时候,但实现了我想要它做的事情,也许它也可以帮助你。

      https://github.com/dmarkey/pgdatadiff

      【讨论】:

        【解决方案9】:

        我认为Dbforge是postgresql中最强大的数据映射工具。它是Devart公司的产品。你可以下载here

        【讨论】:

          【解决方案10】:

          https://github.com/covrom/goerd 用于简单数据库(没有触发器、存储过程和嵌套表)。

          【讨论】:

          • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-27
          • 2011-11-28
          • 1970-01-01
          • 2011-11-28
          • 1970-01-01
          相关资源
          最近更新 更多