需求:实现Oracle数据库表记录变更后的准实时同步。
可选方案:
1、基于时间戳来检测变更
要求:
a、需同步的表均需要添加时间戳字段,并在更改数据后,同步更新时间戳
b、对于删除操作,需要额外处理。或通过触发器记录,或者不真实删除记录,仅仅设置删除标记。
c、业务层编码实现同步
缺点:
对系统增加了额外约束
同步的实时性取决于轮训的时间间隔
2、基于触发器来记录变更
要求:
a、对于所有同步的表,均需要编写触发器
b、可基于dblink直接将变更应用到远程数据库
c、或触发器将变更统一记录到一张表中,然后业务层编码实现同步
缺点:
可维护性较差,性能较差
有潜在问题:oracle官方说明,不保证触发器只触发一次
3、基于Oracle快照和物化视图实现同步
要求:
a、对于需同步的表,需要建立快照表,触发器等
4、基于Oracle Database Change Notification实时获取变更
要求:
a、需要确保应用与数据库的一直连接
缺点:
在连接断开后,在下次连接建立之前,数据库的变更会丢失
5、基于Oracle Streams方案实现同步
要求:
a、Oracle需要以归档模式运行
b、需要在源数据库和目标数据库中编写相应的存储过程,来完成变更捕获、传播和变更应用
优点:
基本可实现实时同步
可在数据库层,完全基于Streams实现一对一、一对多等数据复制需求
缺点:
难度较大,需要对Oracle Streams有一定的认识
需在源数据库和目标数据库做不同的处理
工程人员实施有一点难度
6、基于Oracle Streams + Oracle AQ 捕获变更,发布变更
要求:
a、Oracle需要以归档模式运行
b、仅基于Streams捕获本地数据库变更
c、通过Oracle的消息队列AQ,来发布变更
d、业务层通过JMS获取变更,并应用到目标数据库
备注:
方案6为方案5的简化,仅依赖于Streams来捕获变更,发布变更。变更的应用需要编码实现。
该方案主要是为了降低工程维护的复杂性。
已有 0 人发表留言,猛击->> 这里<<-参与讨论
ITeye推荐