`
sheungxin
  • 浏览: 103331 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

基于oracle的增量数据采集

阅读更多
之前调研了下基于mysql的数据增量采集方案,目前有阿里的canal和Open Replicator,均是基于MySQL binlog分析的开源项目。Open Replicator仅提供了binlog解析;canal基于数据库增量日志解析,提供增量数据订阅&消费,在binlog分析的基础上进行了封装,并有相匹配的canal消费端项目开源: Otter(分布式数据库同步系统),相对有一套比较完整的增量数据订阅&消费方案。

canal除了MySQL,还提供Oracle部分版本的日志解析,但可惜目前仅开源MySQL部分。对于Oracle增量数据同步,首先想到的就是触发器,在测试表上建立触发器进行测试,可监控数据的增删改操作。但触发事件与触发器处于同一事物中,commit前就会执行触发器。若触发器中有一些非事务操作,比如:向外部发送变化事件及数据,这样未提交数据就已发送出去了,这时候rollback事物,无法撤销非事务操作。因此,我们必须让触发器监听已提交数据的变化。经过调研,在物化视图上建立触发器可以达到我们的目的。
create materialized view log on jd_address;

create materialized view MV_JD_ADDRESS_TEST
refresh fast on commit
as
select * from jd_address;

SELECT * FROM MV_JD_ADDRESS_TEST
建立表的物化视图,在commit时增量刷新物化视图

上文提到向外部发送数据,Oracle8后提供了对于Java的支持,可以通过java调用外部程序,这个方式就很多了,不多介绍。调用过程如下:触发器》存储过程》java source》外部程序。结合上面提到的物化视图,就可以做到监控增量数据变化,并及时同步到外部程序。

对于Oracle中Java Source使用,一般需要开启授权。我们可以先开启Java Source日志,在命令窗口中执行存储过程可调用java source查看打印信息。若未授权,会打印错误信息,并提供需要授权的语句,拷贝执行即可。
SQL> set serveroutput on;
SQL> exec dbms_java.set_output(5000);
存储过程调用Java Source代码如下:
create or replace procedure prc_test(str varchar2) as language java name 'Demo.entry(java.lang.String)';
参考文档:Oracle CDC提供基于tigger的同步模式和基于流复制的异步模式,也是一个不错的解决方案。
引用
浅谈Oracle 数据库之间数据同步方案:http://blog.csdn.net/leamonjxl/article/details/6695479
引用
Oracle CDC(Change Data Capture)概述:http://blog.csdn.net/chensrao/article/details/6200338
引用
关于实时监控oracle数据库表数据变化的设计与实现:http://blog.csdn.net/as339000204/article/details/45390727
引用
Oracle使用Java Source编程:http://www.2cto.com/database/201308/236506.html
引用
Oracle使用java source调用外部程序:http://www.cnblogs.com/mellowsmile/archive/2016/09/18/5881109.html
0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics