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

时间:2014-01-06 22:47:09

标签: database postgresql

这两个数据库具有相同的模式,但数据不同。可能会有一些重复的行,但是如果找到重复项,合并就会大声保释并且不进行更新就足够了,即重复应该手动解决。

部分问题是所讨论的数据库中存在许多外键约束。此外,可能存在一些引用外键的列,这些外键实际上没有外键约束。后者是由于插入时的性能问题。此外,我们需要能够在旧数据库中的ID和新数据库中的ID之间进行映射。

显然,我们可以编写一堆代码来处理这个问题,但我们正在寻找一个解决方案:

  1. 减少工作量
  2. 合并机器的开销减少。
  3. 更可靠。如果我们必须编写代码,则需要通过测试等,并且不能保证无错误
  4. 显然我们仍在搜索网络和Postgresql文档以寻找答案,但到目前为止我们发现的内容一直没有用。

    更新:我明确忽略的一点是,“重复”是由架构中的唯一约束明确定义的。我们希望恢复一个数据库的内容,然后恢复一秒钟的内容。第二次恢复期间的错误应该被认为是第二次恢复的致命错误。然后应从第二个数据库中删除重复项并创建新的转储。我们希望ID重新编号,而不是其他唯一约束。 BTW可能会在第二个数据库之后合并第三个甚至第四个数据库。

2 个答案:

答案 0 :(得分:3)

编写一堆脚本没有捷径......这实际上无法实现自动化,因为管理冲突需要应用特定于您的数据的规则。

那就是说,你可以通过删除重复的代理键来减少冲突的几率......

假设您的两个数据库只有两个表:A (id pkey)B (id pkey, a_id references 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. 导出数据
  5. 接下来,将此数据导入第一个数据库,并相应地更新序列。

    如果ID最终可能超过23亿,并且两个数据库中可能存在的唯一密钥,您仍需要警惕溢出。但至少你不必担心重复ID。

答案 1 :(得分:2)

这种情况我正在研究像CloverETL,Pentaho Kettle或Talend Studio等ETL工具。

我倾向于同意丹尼斯的观点,即没有任何真正的捷径可以避免处理数据合并的复杂性。