基于oracle的增量数据采集
程序员文章站
2022-07-02 09:06:31
...
之前调研了下基于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
推荐阅读
-
c#几种数据库的大数据批量插入(SqlServer、Oracle、SQLite和MySql)
-
基于PHP采集数据入库程序(二),php采集数据入库_PHP教程
-
Oracle PL/SQL编程有关的数据库对象
-
oracle 取某个时间的数据(每周几的上午几点到几点)
-
PHP数据库操作之基于 Mysqli 的数据库操作类库
-
SpringBoot连接oracle数据库(最简单的方法)
-
基于PHP的cURL快速入门教程 (小偷采集程序)_php技巧
-
php用户认证 php基于数据库的用户认证代码
-
Oracle数据库中的varchar,varchar2,nvarchar,nvarchar2区别及用
-
Oracle数据库下约束的创建与管理(主键约束)学习讲解