基于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事物,无法撤销非事务操作。因此,我们必须让触发器监听已提交数据的变化。经过调研,在物化视图上建立触发器可以达到我们的目的。
上文提到向外部发送数据,Oracle8后提供了对于Java的支持,可以通过java调用外部程序,这个方式就很多了,不多介绍。调用过程如下:触发器》存储过程》java source》外部程序。结合上面提到的物化视图,就可以做到监控增量数据变化,并及时同步到外部程序。
对于Oracle中Java Source使用,一般需要开启授权。我们可以先开启Java Source日志,在命令窗口中执行存储过程可调用java source查看打印信息。若未授权,会打印错误信息,并提供需要授权的语句,拷贝执行即可。
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数据库OPEN状态下迁移数据文件的几种方法
-
【效率工具】基于python爬虫的“nba对阵信息及数据统计信息查看“Alfred小工具
-
基于Linux平台的Oracle RAC 10g集群教程:添加节点所需要的步骤
-
如何从Oracle导出的数据表上的一个Unix下平面文件
-
PHP数据库操作之基于 Mysqli 的数据库操作类库
-
php将HTML表格每行每列转为数组实现采集表格数据的方法
-
PHP基于单例模式实现的数据库操作基类
-
Oracle 11g将数据库移动到不同的ASM磁盘组/修改ASM磁盘组的冗余属性
-
Oracle to_char的时间数据格式转换
-
Oracle to_char的时间数据格式转换