跨数据库同步表数据

2022-09-04 01:37:07

我有一个表,在字段上记录其行插入/更新时间戳。

我想将此表中的数据与另一个数据库服务器上的另一个表同步。两个数据库服务器未连接,同步是单向的(主/从)。使用表触发器是不合适的

我的工作流程:

  • 我使用全局last_sync_date参数和查询表 Master 对更改/插入的记录
  • 将生成的行输出到 xml
  • 使用更新和插入解析 xml 并更新表从属

在处理主表的已删除记录时,问题的复杂性会上升。为了捕获已删除的记录,我认为我必须为以前插入的记录维护一个日志表,并使用sql“NOT IN”。在处理大型数据集时,这将成为性能问题。

处理此方案的替代工作流是什么?


答案 1

听起来你需要一个事务性消息队列。

这是如何工作的很简单。更新主数据库时,可以向消息代理(无论更新的内容)发送一条消息,该消息可以转到任意数量的队列。每个从属数据库都可以有自己的队列,并且由于队列的保留顺序,进程最终应该正确同步(具有讽刺意味的是,这是大多数RDBMS在内部进行复制的方式)。

将消息队列视为一种 SCM 更改列表或修补程序列表数据库。也就是说,在大多数情况下,发送到master的相同(或大致相同)的SQL语句最终应复制到其他数据库。不必担心丢失消息,因为大多数消息队列都支持持久性和事务。

我建议你看看和/或,特别是因为你用标记了这个问题。

根据您的意见:

顺便说一句,你对性能问题的担忧不是很好,因为有太多的解决方法,但考虑到你不想做数据库特定的事情(如触发器和复制),我仍然觉得消息队列是你最好的选择。NOT IN

编辑 - 非 MQ 路由

由于我给了你一个艰难的时间询问这个问题,我将继续尝试帮助。除了消息队列之外,您还可以像我们之前尝试的那样执行某种XML文件。架构中所需的关键功能是 master 数据库上的“创建时间戳”列,以便在系统启动并运行时执行批处理(否则,您将不得不停止系统)。现在,如果您走这条路,您将希望小于当前时间。基本上,您只能在快照中获取行。SELECT * WHERE CREATE_TIME < ?

现在,在您的其他数据库上进行删除,您将要删除ID表上的行,但带有(即您可以使用JOINS而不是慢速)。幸运的是,您只需要删除所有列,而不需要其他列。其他列可以使用基于更新时间戳列的增量(用于更新,并创建插入)。inner joining!=NOT INids


推荐