将两个不同的Postgresql数据库合并成一个数据库

5
这两个数据库拥有相同的模式,但是具有不同的数据。可能会出现一些行的重复,但如果发现重复,则合并应该失败而不进行更新,即重复记录应手动解决。
问题的一部分在于这些数据库中存在许多外键约束。此外,可能会有一些列引用了实际上没有外键约束的外键。后者是由于插入性能问题造成的。同时,我们需要能够将旧数据库的ID映射到新数据库中的ID。
显然,我们可以编写大量代码来处理此问题,但我们正在寻找一个解决方案,它具有以下特点:
  1. 工作量较小
  2. 对合并机器的负载较低
  3. 更可靠。如果我们必须编写代码,它将需要经过测试等流程,并不能保证没有错误
显然,我们仍在搜索网络和Postgresql文档以寻找答案,但迄今为止我们所发现的都没有什么帮助。
更新:我忽略了一个明显的事实,那就是“重复”是由模式中的唯一约束明确定义的。我们预计首先恢复一个数据库的内容,然后再恢复第二个数据库的内容。在第二个恢复过程中出现的错误应被视为对第二个恢复过程致命的错误。接下来应该从第二个数据库中删除重复记录并创建新的导出文件。我们希望对ID进行重新编号,但不更改其他唯一约束。另外,可能还会有第三个甚至第四个需要合并的数据库。
2个回答

3

写一堆脚本是没有捷径的...这是不现实可以自动化的,因为处理冲突需要应用特定于您的数据的规则。

话虽如此,您可以通过删除重复的代理键来降低出现冲突的可能性...

假设您的两个数据库只有两个表:A(id pkey)B(id pkey,a_id引用A(id))。在第一个数据库中,找到max_a_id=max(A.id)max_b_id=max(B.id)

在第二个数据库中:

  1. 根据需要更改B表,以使a_id进行级联更新。
  2. 禁用触发器(如果有),如果其具有可能错误地启动的副作用。
  3. 更新A并设置id=id+max_a_id,对于B也是同样的事情。
  4. 导出数据

然后,将此数据导入第一个数据库,并相应地更新序列。

如果ID可能大于23亿,则仍需注意溢出,并且可能存在于两个数据库中的唯一键。但至少您不必担心重复的ID。


更新级联将有助于解决我们的问题。正如你所指出的那样,这还不足够,但是有帮助。ID溢出不应该是一个问题,因为我们的ID都是大整数。 - aikimcr

2

如果要处理数据合并这类问题,我建议您使用CloverETL、Pentaho Kettle或Talend Studio等ETL工具。

我赞同Denis的看法,没有什么捷径可以避免处理数据合并的复杂性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接