吴秀君
摘要:当前信息化的时代,数据成为了最重要的资源,如何能消化信息孤岛,更好地完成同一组织内部、上下级、不同组织间的数据汇总、统计、分析等问题就凸显出来;只有很好地完成了数据的整合,才能更进一步地支撑起上层数据的挖掘、分析,能对企事业单位的未来发展战略提供有效的数据依据。在这种如何消化信息孤岛的背景下,数据集成应运而生。在实施数据集成的过程中,ETL是实现数据集成的主要技术,其主要提供数据抽取、数据转换、数据加载功能,数据抽取的方式常见的有触发器、日志比对、CDC等。该文主要介绍基于CDC技术实现数据自动同步。
关键词:ORACLE;CDC;数据同步
中图分类号:TP393 文献标识码:A 文章编号:1009-3044(2015)27-0008-02
当前信息化的时代,数据成为了最重要的资源,如何能消化信息孤岛,更好地完成同一组织内部、同一组织上下级、不同组织间的数据汇总、分析等问题就凸显出来;只有很好地完成了数据的整合,才能更进一步地支撑起上层数据的挖掘、分析,才能对企事业单位的未来发展战略提供有效的数据依据。
在这种背景下,数据集成应运而生。在实施数据集成的过程中,由于不同用户提供的数据可能来自不同的途径,其数据内容、数据格式和数据质量千差万别,有时甚至会遇到数据格式不能转换或数据转换格式后丢失信息等棘手问题,严重阻碍了数据在各部门和各应用系统中的流动与共享。因此,如何对数据进行有效的集成管理已成为增强企业商业竞争力的必然选择。ETL是实现数据集成的主要技术。数据抽取即从源数据抽取目的数据源系统需要的数据,数据抽取的方式常见的有触发器、全面数据对比、日志比对、状态位、时间戳、CDC等。本文主要介绍以CDC技术为基础实现源与目标数据的自动同步。
1 CDC简介
CDC是Oracle数据库的特性。CDC能够帮助你识别从上次提取之后发生变化的数据,包括对源表进行增、删、改等操作。而且,变化数据保存在变化表中,这样就可以捕获发生变化的数据。CDC技术主要设计的对象包括:源表、变化表、变化集、订阅视图、订阅窗口。
CDC同步模式分为两种:同步模式和异步模式,本文主要采用同步模式实现变化数据的抽取。
2 CDC的配置步骤
2.1 创建订阅、发布用户
在ORACLE中创建订阅cdc_dy_test、发布用户cdc_fb_test,并给cdc_fb_test授予select_catalog_role、execute_ catalog_role、dbms_cdc_publish等权限;给cdc_dy_test授予create any procedure、create any job等权限。
2.2 创建源、目标用户
在ORACLE中创建源用户test、目标用户target,并给用户授权。
目标用户下创建表student_test (id,name ,sex ),并授所有权限给cdc_dy_test。
源用户下创建表student_test (id,name ,sex ),并授所有权限给cdc_fb_test和cdc_dy_test。
2.3 发布数据
2.3.1 创建改变集
登录cdc_fb_test,利用dbms_cdc_publish.create_change_set创建改变集student_test_change_set。
2.3.2 创建改变表
登录cdc_fb_test,利用dbms_cdc_publish.create_change_table创建改变表student_test_ct、改变集参数为student_test_change_set,并且把改变表查询权限授权给订阅用户cdc_dy_test。
2.4 订阅数据
2.4.1 创建订阅
以订阅者(cdc_dy_test)登录,使用dbms_cdc_subscribe.create_subscription创建订阅student_test_cdc_sub。
2.4.2 订阅表
登录cdc_dy_test,针对发布表建立订阅视图,将来订阅时从这些视图读取数据,使用dbms_cdc_subscribe.subscribe创建订阅student_test_cdc_sub对应的订阅表cdc_student_test_sub_v。
2.4.3 激活订阅
订阅需要激活,才能生效,使用dbms_cdc_subscribe.activate_subscription激活订阅student_test_cdc_sub,激活后CDC就开始捕获改变数据。
至此,发布、订阅的管理工作完成。接下来基于CDC获取变化数据并同步至目标表。
3 基于CDC技术实现数据同步
基于CDC实现数据同步,主要思路是:创建存储过程,在存储过程中借助之前已经完成的工作,读取变化数据,并向目标同步数据;之后,创建作业定时调度该存储过程,从而实现数据自动同步。
3.1 创建数据同步存储过程
通过存储过程同步处理源表test.student_test与目标表target.student_test的数据。
create or replace procedure proc_cdc
is
v_rowcount number;
v_rowcount1 number;
begin
--目标表有没有数据
select count(1) into v_rowcount from target.student_test;
--获得下一组变更数据
dbms_cdc_subscribe.extend_window(subscription_name => 'student_test_cdc_sub');
--源表数据是否变化
select count(1) into v_rowcount1 from cdc_student_test_sub_v;
if v_rowcount=0 then
insert into target.student_test(id ,name,sex)
select id ,name,sex from test.student_test;
commit;
elsif v_rowcount1>0 then
--同步删除
delete from target.student_test a
where a.id in (select b.id from cdc_student_test_sub_v b where trim(b.operation$)='d');
--同步更新
update target.student_test a
set id=(select id from cdc_student_test_sub_v b
where a.id=b.id and trim(b.operation$)='un'),
name=(select name from cdc_student_test_sub_v b
where a.id=b.id and trim(b.operation$)='un'),
sex=(select sex from cdc_student_test_sub_v b
where a.id=b.id and trim(b.operation$)='un');
--同步插入
insert into target.student_test
select id,name,sex from cdc_student_test_sub_v b where trim(b.operation$)='i';
commit;
dbms_cdc_subscribe.purge_window(subscription_name => 'student_test_cdc_sub');
end if;
end proc_cdc;
3.2 创建作业
通过创建ORACLE作业,定时执行存储过程来实现数据自动同步。作业创建可以借助工具,作业名称为cdc_job,作业执行周期为1分钟。
4 结束语
综上所述,ORACLE CDC与存储过程、作业等技术结合即可实现数据的同步,而无需开发应用软件,为数据的同步提供了一种数据库层面的技术手段。当然,本文只介绍了基本的CDC数据同步方式,但掌握了CDC的基础技能后,就可以在此基础上进行扩展,实现更多、更强的功能。
参考文献:
[1] 邹先霞.基于数据库日志的变化数据捕获研究,2012.
[2] Oracle CDC部署流程.http://blog.itpub.net/24930246/viewspace-1069835/.
[3] ORACLE_CDC.http://my.oschina.net/u/140663/blog/307967.
[4] 王冰.基于ETL的数据管理方法的分析和实现,2008.
[5] 顾云锋.Oracle数据库中存储过程开发研究,2011.
[6] 王忠民.解析Oracle存储过程的使用,2009.
[7] 肖慧.王鲁珊.用Oracle的DBMS_JOB来实现任务计划管理,2004.