欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

基于oracle的增量数据采集

程序员文章站 2022-07-02 09:06:49
...
之前调研了下基于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
相关标签: oracle