是否可以比较具有相同结构的两个数据库?假设我有两个数据库 DB1 和 DB2,我想检查它们之间的数据是否存在差异。
10 回答
有几种工具:
(请注意,这些工具中的大多数只能比较结构,而不能比较数据)
免费的:
- pgquarrel:http ://eulerto.github.io/pgquarrel (模式差异)
- apgdiff http://apgdiff.com/(模式差异)
- Liquibase(跨 DBMS):http ://www.liquibase.org (模式差异)
- pgAdmin https://www.pgadmin.org(pgAdmin4 中的模式差异)
- WbDataDiff(跨 DBMS):http ://www.sql-workbench.net/manual/compare-commands.html#command-data-diff (数据差异)
- WbSchemaDiff(跨 DBMS):http ://www.sql-workbench.net/manual/compare-commands.html
- Migra https://migra.djrobstep.com/(架构差异)
商业的:
- 数据库比较器:http ://www.sqlmanager.net/en/products/postgresql/dbcomparer
- Aqua 数据工作室:http ://docs.aquafold.com/docs-diff-schema.html
- DB Solo:http ://www.dbsolo.com/index.html (30 天试用)
- PostgresCompare:https ://www.postgrescompare.com/ (14 天试用,比较架构和数据)
尝试pg_dump
在两个数据库上使用并区分文件。
另一个免费的应用程序(只能比较结构,但不能比较数据):
DBeaver - 您可以选择数据库、表等进行比较
我评估了很多工具并找到了以下解决方案:
架构比较:
最有趣的是 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 进行迁移/版本跟踪。
我正在为 Postgres 开发一个全面的比较工具。它将在测试阶段免费。
最初这只是模式 (DDL) 比较,但我们可能还会扩展到数据。我相信这是许多商店需要的工具,以便从他们当前的 RDBMS 中迁移出来,而不必改变他们的开发环境、操作等的工作方式。
我见过的最好的工具 https://pythonhosted.org/Pyrseas/
从数据库中获取转储 A dbtoyaml ...
从 A => B yamltodb 生成迁移 ... [步骤 1 中生成的文件]
我也在寻找一种工具来比较数据库中的数据(特别是我对比较 Redshift DB 很感兴趣)。到目前为止,我发现的最好的是https://www.dbbest.com/products/database-compare-suite/#close。不幸的是,免费试用会在一天后到期。
我创建了一个工具来比较 2 个实时 PostgreSQL 数据库(不是转储)、表数据和序列。很早的时候,但实现了我想要它做的事情,也许它也可以帮助你。
在我看来,Dbforge 是 postgresql 中最强大的数据映射工具。它是 Devart 公司的产品。你可以在这里下载。
将https://github.com/covrom/goerd用于简单数据库(没有触发器、存储过程和嵌套表)。