1/23ODI从oracle数据库中抽取增量数据海量Oracle资料下载,请收藏简介ODI(OracleDataIntegrator)是Oracle在2006年10月收购Sunopsis公司后,整合SunopsisActiveIntegrationPlatform而推出的一款数据集成工具,现在是OracleFusionMiddleware的组件。和Oracle自己的OWB(OracleWarehouseBuild)相比,ODI支持更多的异构数据源,支持SOA,支持Jython,和OWB正好互补。ODI和OWB都是所谓的ELT工具,和通常所见的ETL工具不同,它们不是采用独立的引擎而是采用RDBMS进行数据转换。做为领先的RDBMS供应商,Oracle选择ELT而不是ETL不是没有道理的。ODI的主要组件包括模块知识库,图形模块和执行引擎,都是基于java编写,所以运行ODI需要有JDK的支持。另外还有一个基于J2EE的元数据导航器(MetadataNavigator)。知识库ODI所有模块的信息都保存在一个叫做MasterRepository的中心知识库中。MasterRepository通过MasterRepositoryCreationWizard创建,这也是安装完ODI后应该做的第一个任务。3/23除了MasterRepository,还需要为不同的任务创建WorkRepository。WorkRepository中的信息包括模块信息,项目信息和运行期信息。图形模块Designer用于定义数据转换逻辑,这是最常用的开发工具,大部分的开发任务,包括datastore的定义,interface(数据映射关系)和package(相当于workflow)的创建等,都是在Designer中完成。Operator用于管理和监控数据转换任务的执行情况,在设计阶段,也可用于调试(debugging)TopologyManager用于定义物理和逻辑基础架构,如workrepository的创建和管理等。SecurityManager用于管理用户权限运行期组件ScheduleAgent计划代理,用于调度执行数据转换任务。计划代理同时也带有一个数据转换引擎,但是ODI采用E-LT架构,所以基本上计划代理只是将任务传递给目标库,其数据转换引擎很少用到。附:安装完ODI后默认用户名为SUPERVISOR,密码为SUNOPSIS,大小写敏感。4/23ODI从oracle数据库中抽取增量数据最近做的几个项目,都碰到了ODI从oracle9i或者10g数据库中抽取增量数据的情况,那么ODI如何从数据库中抽取增量数据呢,ODI针对Oracle数据库的抽取,提供了3类知识模块:OracleSimpleOracleConsistentOracle9i/10g/11gConsistent(LOGMINER)Simple方式一般是针对数据库中需要增量复制的表之间没有主外键约束的情况,在这种方式下,表之间的先后复制关系没有影响。但如果表之间有主外键对照关系,采用simple方式就会出现问题,举个简单的例子,我们需要从源数据库抽取两张表订单和订单明细表的增量数据,其中订单明细表的外键要参照订单表的主键。1.我们将订单表中主键从11000-25000的增量数据复制到目标端。2.在复制的过程中,源端订单表又插入了两条新数据,主键为25001和25002。3.当进行订单明细表的增量数据复制时,与订单表中主键25001和25002对应的明细数据就会在目标端出错,因为刚才复制时,这两条数据没有复制到目标端。Consistent方式就是专门来解决这个问题的,它在处理父表前首先锁定(注意不是锁住)主表和子表需要复制的记录,在增量数据复制时,插入主表和子表的新增量数据都会被本次抽取过程忽略,放在下次抽取时处理。因此采用Consistent方式进行增量数据捕获一般需要5个步骤:1.扩展窗口(extend_window):计算主表和子表本次抽取的结果集,并赋予其一个序列号。2.锁定订阅者(locksubscriber):针对变化数据的某个订阅者,确定其需要抽取的序列号范围(一个系统的变化数据可能会被多个系统使用,比如主数据管理系统)。3.执行抽取过程,我们通过ODI中的接口程序进行实现。4.抽取完成后,解锁订阅者(unlocksubscriber):记录下本次抽取的最后的序列号,以便于下次使用。5.清除增量数据(Purgethejournal):将已经复制完成的增量数据清楚(这里是指所有的订阅者)。在具体的实现方式上,OracleSimple、OracleConsistent是采用同步方式进行增量数据抽取的,说白了就是在源系统相关表上添加触发器,如下图所示:5/23当源数据库中的交易需要修改相关表时,会调用触发器,将变化数据插入到增量表中,触发器的调用是包含在交易中的,这就决定了变化数据的实时性高,在需要实时变化的场景,非常适用,而且这种方式在数据库非归档状态下也照常运行,其缺点是由于触发器包含在对数据修改的事务中,当系统并发量比较大时,会对原有系统的效率产生一定影响。很多同事一听说触发器就觉得对源系统影响非常大,其实并不是这样。这里需要澄清的一点概念是触发器往变化数据表中写的并不是所有变化的数据,而可能只是一个主键或者再加一点额外的信息,其对系统的影响比我们想象的要小得多。Oracle9i/10g/11gConsistent(LOGMINER)方式可以配置成异步方式,基于Oracle数据库的onlineredolog进行变化数据的捕捉(这里要特别提醒的是目前ODI只支持Hotlog方式),说的更白一点就是oraclestream技术,变化的数据通过logminer技术从在线日志中获取。如下图所示:6/23这种方式基于异步的策略,一般变化数据的获取会有1秒到几分钟的数据延迟,当然对数据仓库系统来讲,这点时间也不算啥。但是由于其从日志中抽取变化数据,对原有的生产系统影响很小,而且该方式在用户原来的schema上除了一个读权限外,不需要额外的权限要求,因此大多数用户都愿意采用这种方式。但该方式需要对用户有一定的权限要求,而且数据库必须运行在归档模式下。具体的配置我们下次再说。在ODI中通过logminer方式进行变化数据捕捉,需要首先做一些基本工作:1.修改数据库启动参数:altersystemsetglobal_names=TRUEscope=BOTH;(如果您的系统里有dblink也可以不修改,到时候修改ODI的也可以)。altersystemsetjob_queue_processes=6scope=BOTH;altersystemsetopen_links=4scope=SPFILE;altersystemsetstreams_pool_size=200Mscope=BOTH;altersystemsetundo_retention=3600scope=BOTH;JOB_QUEUE_PROCESSES(currentvalue)+2PARALLEL_MAX_SERVERS(currentvalue)+(5*(thenumberofchangesetsplanned))PROCESSES(currentvalue)+(7*(thenumberofchangesetsplanned))SESSIONS(currentvalue)+(2*(thenumberofchangesetsplanned))Open_cursors一定要大一点(建议1000以上),尤其是10.2.0.4之前的版本。2.数据库必须在归档模式下,在sqlplus下执行:7/23SQLselectlog_modefromv$database;LOG_MODE------------ARCHIVELOG如果返回如上,恭喜您,不用做这一步了,否则要执行:SQLconn/assysdbaConnected.SQLshutdownimmediateDatabaseclosed.Databasedismounted.ORACLEinstanceshutdown.SQLstartupmountORACLEinstancestarted.TotalSystemGlobalArea301989888bytesFixedSize1267140bytesVariableSize163580476bytesDatabaseBuffers130023424bytesRedoBuffers7118848bytesDatabasemounted.SQLalterdatabasearchivelog;Databasealtered.SQLalterdatabaseforcelogging;Databasealtered.SQLalterdatabaseaddsupplementallogdata;SQLalterdatabaseopen;Databasealtered.且记,如果是生产系统,一定不要在工作时间做这样的事情,而且做前一定和管理员和其它用户沟通好,如果您不小心将生产系统弄瘫了,临被干掉前别说俺没提醒过您。3.在数据库系统里面为ODI的变化数据准备存储空间,为了避免对现有生产系统产生影响,建议单独为其建立一个表空间。createtablespaceTS_ODIdatafile'/uo1/app/oracle/oradata/test/ts_odi.dbf'8/23size8192mautoextendonnext32mmaxsize20480mextentmanagementlocal;表空间的大小和您的业务量以及您存储多长时间的变化数据有关,具体场景最好在您的测试环境里面先试试,当然了,如果空间不是很紧张,尽量大一点。4.为变化数据捕捉建立一个用户,该用户将被ODI用来连接数据库,并获取变化数据。CREATEUSERcdcadminIDENTIFIEDBYcdcadminDEFAULTTABLESPACETS_ODITEMPORARYTABLESPACEtemp为了配置和获取变化数据,该用户需要以下权限:--systemprivsGRANTcreatesessionTOcdcadmin;GRANTcreatetableTOcdcadmin;GRANTcreatesequenceTOcdcadmin;GRANTcreateprocedureTOcdcadmin;GRANTcreateanyjobTOcdcadmin;--roleprivsGRANTexecute_catalog_roleTOcdcadmin;GRANTselect_catalog_roleTOcdcadmin;--objectprivilegesGRANTexecuteONdbms_cdc_publishTOcdcadmin;GRANTexecuteONdbms_cdc_subscribeTOcdcadmin;--streamsspecificprivexecutedbms_streams_auth.grant_admin_privilege('CDCADMIN');grantselectonanytabletocdcadmin(这里其实只要对生产系统需要捕获数据的schema相关表授权即可,这样设有点大,这里只是为了简单)。Grantdbatocdcadmin(其实这一步可以不要,但为了操作简单,建议您还是加上,在ODI中启动日志完成后,再把其DBArevoke回去即可,说白了只是在ODI启动日志时需要,一旦启动完成,抓取数据不需要)。如果管理员坚决不能给您DBA权限,那也可以到knowledgemodule中修改其step即可,将需要DBA权限的步骤在knowledgemodule中去掉,让管理员9/23帮忙做一下(其实只有一个步骤需要DB