我们的一个应用程序安装在50多个位置。每个都有一个本地数据库。我们需要将这个数据库的一个表的数据同步到一个中心位置。我们希望在本地数据库和集中式数据库之间使用队列机制。因此,如果有网络问题,同步时,它会将最近的更新存储在队列中,这样每当ntwork返回时,它就会将所有记录插入远程数据库,一旦完成,它就会删除temp q中的数据,并且本地数据库即使在没有网络的情况下也可以不加任何锁定地继续工作。我们不能使用mysql同步,因为源是50个不同的数据库,目标是一个单一的数据库,它将拥有所有这些数据库的记录,在我的源表中没有主键。
对于上述问题,我们的源数据库和目标数据库ar-mysql有什么合适的建议吗
1条答案
按热度按时间wa7juj8i1#
这几乎是我过去几年一直在做的事情,我的直觉是,从源数据库中读取500000个条目并在目的地同步所花的时间不会像人们想象的那样多,而读取“key”字段、计算md5散列所花的时间,并与您的表交叉检查,以避免同步未更改的项目不会节省太多时间,甚至可能运行更长时间。我只需阅读所有内容并更新所有内容。如果这导致运行时太长,那么我将通过使etl多线程化来压缩运行时,每个线程只对表的一段进行操作,但并行工作。
确保目标数据库具有主键索引或唯一索引非常重要。否则,每个更新/插入都会锁定整个表。如果您采用多线程方法,这将是不好的,但即使您保持单线程,这也很重要,因为您的作业可能会锁定目标db表并干扰位于该db表之上的应用程序。
您说源数据库“可能是db2”。当你说“may”时,它意味着db仍在设计/规划中?DB29或更高版本确实内置了对上次更新时间的跟踪,并且能够查询和获取自某个时间点以来发生更改的项。也许这就是为什么db设计成没有一列指示最后更新时间的原因,例如:
上述查询的时间戳截止将是同步运行的最后一个时间戳。
如果是这样的话,你的问题就解决了。但是,您的解决方案最终会与db2紧密相连,将来他们可能会希望迁移到另一个db平台,并希望您的同步作业不需要重新访问。因此,确保所有合适的人都知道您的产品将依赖于db2,或者如果他们计划迁移,那么迁移将包括重新构造db以具有“last changed timestamp”列,并在应用程序级别进行任何必要的更改以填充该字段,这一点很重要。
希望有帮助!谢谢