我们的一个应用程序安装在50多个位置。每个都有一个本地数据库。我们需要将该数据库的一个表的数据同步到一个中心位置。我们希望在本地数据库和集中式数据库之间使用队列机制。因此,如果存在网络问题,在同步时,它会将最近的更新存储在队列中,这样每当ntwork返回时,它都会在远程数据库中插入所有记录,一旦完成,它将删除数据,在临时Q内,本地数据库即使在没有网络的情况下也可以继续工作而不会有任何锁定。 我们不能使用MYSQL同步,因为源是50个不同的数据库,目标是一个单独的数据库,它将拥有所有这些数据库的所有记录,我的源表中没有主键。
任何人都可以为上述问题提出任何合适的方法,我们的源和目标数据库是MYSQL
答案 0 :(得分:1)
这几乎就是我过去几年一直在做或活着的,而我的直觉是,从源数据库中读取500,000个项目并在目的地同步的时间不会花费太多时间。思考和阅读"键"字段,计算MD5哈希值,并与您的表格进行交叉检查,以避免同步尚未更改的项目,最终节省了太多时间,甚至可能会运行更长时间。我只需阅读所有内容并全部更新。如果这导致运行时太长,那么我通过使ETL多线程来压缩运行时,每个线程只在表的一部分上运行但并行工作。
确保目标数据库具有主键索引或唯一索引非常重要。否则,每个更新/插入都可能会锁定整个表。如果您采用多线程方法,这将是不好的,但即使您保持单线程也很重要,因为您的作业可能会锁定目标数据库表并干扰位于该数据库之上的应用程序。
你说源DB"可能是DB2"。当你说"可能"这意味着数据库仍在设计/规划中? DB2 9或更高版本具有对上次更新时间的内置跟踪,以及查询和仅返回自某个时间点以来已更改的项目的功能。也许这就是为什么DB被设计为没有指示上次更新时间的列,例如:
SELECT * FROM T1 WHERE ROW CHANGE TIMESTAMP FOR TAB t1 > current timestamp - 1 hours;
上述查询的时间戳截止值将是您的同步运行的最后一个时间戳。
如果是这种情况,那应该可以解决您的问题。但是,您的解决方案最终将与DB2紧密相关,并且将来他们可能希望转移到另一个数据库平台并期望您的同步作业不需要重新访问。因此,确保所有合适的人都知道您的产品将依赖于剩余的DB2,或者如果他们计划迁移,那么迁移将包括重构数据库以获得最后更改的时间戳"列,并在应用级别进行必要的更改以填充该字段。
希望它有所帮助! 感谢