【发布时间】:2015-10-26 10:57:38
【问题描述】:
考虑两个数据库 A 和 B,它们的行具有一个公共主键 (PK)。两个数据库都只能通过函数return all keys of items [X,Y[查询。键是非顺序的,因此这个查询可以返回,例如
>>> get_Akeys(0, 5)
>>> [20, 21, 23, 24, 25]
>>> get_Bkeys(0, 5)
>>> [20, 21, 23, 24, 25]
随着时间的推移,数据库 A 会发生变化(B 不会):它有行添加(始终带有增量 PK)和行删除(任何有效的 PK)。目的是使数据库 B 与 A 保持同步。为此,可以将行 A - B(设置减法)添加到数据库 B,并删除行 B - A。
很遗憾,我们无法访问完整的数据库 A:get_Akeys(0, 10**10) 形式的查询被禁止,因为 |A|太大。因此,一种策略是将其切碎,例如getA(i) = get_Akeys(i*N, (i + 1)*N) 其中N为常数,依次查询。
但是,这会破坏请求的原子性:考虑 A = [20,21,22,25,26,27,28] 和 B = [20,21,22,25,26,27] 与 N = 3 以及这一系列事件:
-
getA(0) == [20,21,22] == getB(0)(全部正确) A.delete_key(22) # getA(0) becomes [20,21,25]getA(1) == [26,27,28] != [25,26,27] == getB(1)
在 3. 中,结果意味着应该从 B 中删除元素 25(错误),并且应该添加元素 28(正确)。
关于如何使用上述约束同步两个数据库的任何想法?
在我的用例中,每个 getA 需要约 1 分钟来获取我正在使用的 N,获取所有条目需要约 100 次查询 N/|A|我正在使用,同步可能需要 2 天才能完成。
【问题讨论】:
-
这就是为什么 RDBMS 有复制/镜像 digitalocean.com/community/tutorials/… 甚至 INSERT 和 DELETE 触发器 dev.mysql.com/doc/refman/5.7/en/trigger-syntax.html