如何在不同的数据库中保持表同步?

时间:2018-07-24 11:33:23

标签: database database-design synchronization replication database-replication

问题

我有一个问题,我需要将一些表从一个旧数据库同步到将由外部应用程序使用的另一个更简单的数据库。

尝试

因此,我开始分析手动技术,以对两个基础中的变更进行管理,并将其复制到其他基础中(不预见冲突和合并)。

但是我意识到,以某种我可以建模的方式,它们最终在某些情况下容易出错,而不是仅仅为了控制版本和审核记录而计算额外的列数。

问题

因此,我相信有些方法,数据库技术和建模将有助于这项工作,并有助于在两个数据库中维护更新的数据,甚至可能预测冲突和合并。

有什么可以告诉我的吗?有类似的工作原理吗?


  

注意:集成不能通过数据库执行,它必须通过Web服务执行。因为它们可能是不同的数据库。

我的问题不是关于工具,而是关于一种建模,该建模为我提供了一种结构,在该结构中,我可以获取必须发送到另一个数据库的记录,并且冗余度尽可能低。

  

我接受有关以非关系结构(NoSQL)使用外部数据库的建议。

1 个答案:

答案 0 :(得分:1)

在主-主配置中,最简单的方法是在数据库级别创建触发器。 AFTER INSERT OR UPDATE OR DELETE,他们会将基本信息(表名称,PK值,更改操作,时间等)记录到新表(更改日志)中。

然后将由某个作业(在应用程序层上)收集更改日志。这项工作将直接或通过中间服务层访问两个数据库-取决于您的安全要求。它将从日志表中提取更改历史记录,收集单个行(按表名和PK值),然后尝试将更改发送到另一个数据库。

在这里,我们进入了主-主复制的最复杂部分:冲突解决。

  • 对于INSERT操作,如果该行已存在于另一个数据库中,则可以尝试比较行内容并对其进行更新,而不是插入新行。而且,这对于基于UUID的PK比顺序密钥更有效。
  • 对于UPDATE操作,您可能还想检查目标数据库在同一行上是否也没有更改。否则,您可能最终会覆盖其他人所做的更改。
  • 冲突的数量取决于您在每个时间段内进行多少更改以及作业对新更改的反应速度。在某些情况下,您可能需要实施某种notify-listen机制,以便在提交更改后立即触发作业。

一个完全不同的概念是提供编写器API(服务层),该API将更改同步写入两个数据库(两个DB接受更改后,将在两个DB上发出COMMIT)。但是,这需要更改与给定数据库一起使用的所有应用程序,因此我无法确定这对您来说是否可行。

相关问题