在我正在进行的项目中,我们使用Oracle Streams
支持多主复制(我们在全球纽约、伦敦和新加坡运营 3 个站点,都需要能够读取和更新相同的数据)。
Streams 支持我们根据监管要求使用的条件复制(例如,在新加坡,私人银行客户数据不能离开该国)。
例如,使用 Streams,您可以复制整个架构(DML 和/或 DDL)或仅复制表列表。在事务中,您可以控制流,以便复制对象上的各个行操作不会复制..例如:
if (is_secure)
then
dbms_streams.set_tag('01'); -- set a non null tag to prevent replication.
end if;
insert into your_table ()..values ();
if (is_secure)
then
dbms_streams.set_tag(''); -- set a the null tag back
end if;
insert into your_table ()..values ();
对于is_secure
为真的场景,只有第二条规则会复制(如果存在非空流标签,您可以将复制规则设置为不复制)。因此,如果数据安全,您只需在您的代码中设置此标签。这样流就不会将此事务应用于远程站点。
对于多主复制,您应该预先考虑“冲突”的可能性,即两个以上站点并行修改相同数据的情况。您应该处理此问题(您可以为复杂场景设置应用处理程序)以解决冲突而不会导致应用错误。例如,对于复制对象,这将是一个糟糕的设计:
create table foo
(
id number primary key,
data
);
create sequence foo_seq start with 1 increment by 1;
如果这是在两个站点上创建的,并且有人在站点 1 上并行发布:
insert into foo (id, data) values (foo_seq.nextval, 'a');
和站点 2:
insert into foo (id, data) values (foo_seq.nextval, 'b');
两个站点都尝试将“1”插入主键。这将在复制时失败,您最终会遇到应用错误来解决。
您可以在每个 env 上设置不同的序列,例如start with 100 increment by 100
在一个 env 和start with 101 increment by 100
另一个 ext 上,这将消除此问题,或/并为每个站点添加一个location_id
设置为1
or等的列。2
此外,通过更新,您需要处理两个以上站点同时更新同一行(因为站点之间总是存在一些延迟......延迟越多,进入需要冲突处理的场景的变化就越多)。
Streams 的设置和理解有点复杂,因此您需要仔细阅读该主题。它非常成熟并且仍然受支持,但在增强方面,从现在开始它不会得到太多,因为 Oracle 专注于 Goldengate(GG 是许可产品,因此会产生额外成本,而 Streams 是企业许可的一部分)。