[b]如题 市级向省级同步数据,省级向部级同步数据,
第二次同步时只同步修改或者新增的数据,求解决方案?
数据库结构统一,数据库均为Oracle11G r2.
[/b][size=large][/size]
LZ这种场景,属于分布式环境下的数据集成问题。据我理解,LZ现在主要面临的问题有:
[b]1、捕获增量数据;
2、上报增量数据;[/b]
[b]捕获增量数据:[/b]
增量数据一般分为三种,insert,update,delete,LZ的场景中,只捕获insert和update的数据,这种场景下,一般采用“时间戳增量抽取方案”:在业务表里建立一个时间戳字段,一般为时间类型,数据状态发生变化时,更新时间戳。抽取数据时,生成一个WHERE条件, WHERE 开始时间 <= 时间戳 < 结束时间。基本原理就是这样,如果LZ感兴趣,可以再细聊。
[b]上报增量数据[/b]
获取到增量数据,不知道LZ的业务场景中网络的条件如何?
如果使用企业内部专网的话,可以使用GoldenGate,上面的朋友已经说过了;
如果使用互联网,不推荐使用GoldenGate,因为互联网固有的不稳定性,建议现将增量数据抽取成文件,一般是XML,压缩后,通过HTTP传输协议上传到上级,上级再将文件加载到数据库中。传输过程中,一定要考虑断点续传的问题。
以上,我想到的就是这些。供参考,谢谢!
你的数据表应该有特殊设计。
1.对于新增的数据,你完全可以使用插入日期来区分。因为你的同步肯定有一定时间范围的。比如一天一次。
2.对于更新的数据,需要记录更新的日期。
所以,简单说来,需要同步的表,至少应该增加两个字段:
addTime以及updateTime,根据这两个字段,结合同步时间来筛选你需要的数据进行同步。
只有addTime的,insert
如果addTime在下一个同步周期的,无论updateTime是多少,也insert
如果addTime在上一个同步周期,且存在updateTime,update
用企业服务总线(ESB)可以通过触发器的方式进行增量交换 :lol:
买套Oracle GoldenGate
最简单的方法:
创建一个sql日志表,对于每条sql,执行成功以后,插入该sql到sql日志表,然后有一个定时任务,获取改时间段内的执行的sql,发送到上一级,上一级接收到以后,按照时间顺序依次执行sql。
这种方法比较麻烦的就是,需要考虑到各种异常情况,免得出现丢失数据的问题。
一个性能消耗比较大但可靠的方法
在要同步的表上建trigger, 记录下增 删 改的标记(如I D M)和主键ID到一张小表, 同步时按时间顺序把ID相同的操作做合并(一个ID一个操作), 最后把整体记录发送到目标机器上做更新.
如果不想用trigger, 可以采用应用上发送异步消息的方法,缺点是不可靠
还可以按时间戳把增量查出来做同步, 缺点是数据量大时不可行
还有一种方法是解析db的redo日志, 但技术上有难度