一、前提知识:
数据从源数据库向数据仓库抽取时,一般采用以下几种方式:
-
全抽取模式
如果表的数据量较小,则可以采取全表抽取方式,以TRUNCATE/INSERT方式进行数据抽取。
-
基于时间戳的抽取模式
如果源数据表是不可更新的数据(如大多数事务处理数据)或者是不可删除数据(只能失效历史记录的情况),则根据变更时间戳,抽取最新变更的数据进行同步。
-
日志分析
如果没有更新时间戳,或者源数据存在删除的情况,则可以进行日志分析,来执行最新数据变更的同步。
说明:时间戳的方式如果要处理删除数据的情况,需要在源表创建触发器来捕获删除的记录。
ODI在数据抽取方面,添加了CDC(Changed Data Capture)的功能,并且包含两种方式,一种是在源数据库表上增加触发器来捕获新增、修改和删除的数据到日志表中。另一种是通过对日志的挖掘(Oracle的Log Miner和IBM DB2/400)。但是ODI的CDC,必须要求源表有主键。
二、删除数据的问题引入
当我们开始使用ODI来进行CDC方式的数据同步时,一切都正常,删除的数据也可以正确的同步到目标数据库。接着,因为业务需求,我们只需要同步部分数据到目标数据库,也就是为源数据表加上过滤,这样问题就出来了,新增和修改的数据都能正确的同步到目标数据库,而源数据表删除的数据,经过ODI Interface执行之后,目标数据表中还存在。
经过检查,Interface在装载数据时查询日志视图,而日志视图是日志表与源表的外连接,其结果是删除的记录在视图中只有主键,其余的字段都为空,这样基于日志视图上的过滤,必然导致删除的数据被过滤掉。以下是ODI创建的对象脚本示例:
数据源日志视图jv$qp_list_lines
create or replace view soau.jv$qp_list_lines as
SELECT decode(targ.ROWID, NULL, 'D', 'I') jrn_flag,
jrn.jrn_subscriber jrn_subscriber,
jrn.jrn_date jrn_date,
jrn.list_line_id list_line_id,
targ.creation_date creation_date,
targ.created_by created_by,
...
FROM (SELECT l.jrn_subscriber jrn_subscriber, l.list_line_id list_line_id, MAX(l.jrn_date) jrn_date
FROM soau.j$qp_list_lines l
WHERE l.jrn_consumed = '1'
GROUP BY l.jrn_subscriber, l.list_line_id) jrn,
soau.qp_list_lines targ
WHERE jrn.list_line_id = targ.list_line_id(+)
ODI Interface创建用于装载数据的的临时视图
create or replace view
SOAU.C$_0QP_LIST_LINES
(
C1_LIST_LINE_ID,
C2_CREATION_DATE,
C3_CREATED_BY,
...
JRN_SUBSCRIBER,
JRN_FLAG,
JRN_DATE
)
as select
QP_LIST_LINES.LIST_LINE_ID,
QP_LIST_LINES.CREATION_DATE,
QP_LIST_LINES.CREATED_BY,
...
JRN_SUBSCRIBER,
JRN_FLAG,
JRN_DATE
from SOAU.JV$QP_LIST_LINES QP_LIST_LINES
where (1=1)
And (QP_LIST_LINES.LIST_LINE_TYPE_CODE IN ('PLL', 'PBH'))
And (QP_LIST_LINES.END_DATE_ACTIVE is null or trunc(QP_LIST_LINES.END_DATE_ACTIVE) > trunc(sysdate))
And (QP_LIST_LINES.PRICING_PHASE_ID = 1)
And (QP_LIST_LINES.QUALIFICATION_IND IN (4, 6, 20, 22))
AND JRN_SUBSCRIBER = 'ERP-FK' /* AND JRN_DATE < sysdate */
当Interface在执行集成时,将数据从视图SOAU.C$_0QP_LIST_LINES插入到flow table(flow table是Interface处理的位于目标中间表,数据的同步最终从flow table到目标数据表),由于该视图已经执行了过滤,删除的数据就无法插入到flow table,导致删除的数据最终无法写入目标。
三、问题解决过程
因为数据在源头就被过滤了,所以必须保证数据在源头不被过滤,而Interface可以支持在源、Staging、目标来执行处理,那么就来做各种测试:
1、将数据过滤移到Staging
经过测试发现,虽然在装载数据时,包含了删除的记录,但是在集成阶段,数据插入flow table时,由于除了主键,其余字段都为空,所以删除的数据同样被过滤掉了。
2、将数据过滤移到目标
经过测试,当我们将过滤移到目标时,删除的数据被正确的同步到了目标表。那只要将过滤移到目标,就可以解决问题了?
3、新问题的出现
实际上数据插入flow table后,从flow table到目标表,没有执行任何过滤处理,所有数据都会被同步到目标数据表。这样我们需要排除的数据也写入了目标表,说明这个方式失败。
4、启用模型中目标表的过滤
在ODI Designer中,编辑Model下的表,添加过滤,然后将Interface中对源数据的过滤移除,执行Interface发现,数据正确的插入到了目标表。但是这种方式和前一种方式相同,都是把所有变化的数据都从源取到目标中,存在一定的性能问题。
5、最终的方式
经过研究,还是觉得修改ODI原来的LKM最为实际,只需要把从日志视图的取数的视图代码修改,修改为原来的视图代码UNION删除的记录即可。
修改后的Create view on source代码如下:
create or replace view <%=odiRef.getObjectNameDefaultPSchema("L", "" , "W")%><%=odiRef.getInfo("COLL_NAME")%>
(
<%=odiRef.getColList("", "[CX_COL_NAME]", ",\n\t", "", "")%>
)
as select <%=odiRef.getPop("DISTINCT_ROWS")%>
<%=odiRef.getColList("", "[EXPRESSION]", ",\n\t", "", "")%>
from <%=odiRef.getFrom()%>
where (1=1)
<%=odiRef.getFilter()%>
<%=odiRef.getJrnFilter()%>
<%=odiRef.getJoin()%>
<%=odiRef.getGrpBy()%>
<%=odiRef.getHaving()%>
<%if(!odiRef.getJrnFilter().equals("")){%>
UNION
select <%=odiRef.getPop("DISTINCT_ROWS")%>
<%=odiRef.getColList("", "[EXPRESSION]", ",\n\t", "", "")%>
from <%=odiRef.getFrom()%>
where (1=1)
<%=odiRef.getJrnFilter()%>
AND JRN_FLAG='D'
<%=odiRef.getJoin()%>
<%=odiRef.getGrpBy()%>
<%=odiRef.getHaving()%>
<%}%>
四、插曲
在问题有了解决方案之后,向Oracle提Tar,经过数次沟通,并最终在OWC演示的情况下,确认为KM的Bug。
不过Oracle又提供了一种处理方法,这种方法不需要修改LKM,但是看上去感觉总有点不那么好:在Interface中的每个Filter代码中,加入" OR JRN_FLAG = 'D'",这样就可以保证日志表中删除的记录一定不会被过滤掉。
本文转自:http://www.itjaj.com/viewthread.php?tid=4590&extra=page%3D1%26amp%3Bfilter%3Dtype%26amp%3Btypeid%3D88
分享到:
相关推荐
- 在ODI中新建接口,定义数据源和目标端点。 - 设计数据转换规则,如主数据同步中的字段映射。 6. **关系库数据准备**: - 准备好需要同步到Planning的数据,确保其格式符合要求。 7. **执行接口**: - 在ODI...
本篇将探讨在没有主键的情况下,如何有效地使用ODI进行数据处理。 一、问题背景 ODI的日志功能和增量刷新机制依赖于主键,以便跟踪和处理数据的变化。对于像HR模块中使用ID和有效开始日期、结束日期组合成复合唯一...
通过过程,实施人员能够自定义数据处理逻辑,弥补接口的局限性,实现更灵活的数据集成。 2. **服务对象** 主要是ODI的技术支持工程师,他们需要掌握如何利用ODI进行业务数据整合。 3. **过程简介** ODI中的...
确保临时数据不会对系统性能造成不必要的影响,并且在数据处理完毕后,临时表应当被正确地删除。 8. OCR扫描技术的局限:文档中提到信息是通过OCR技术扫描得到的,这可能导致一些文字识别错误或漏识别。在理解文档...
知识模块是ODI的核心创新,它将常见的数据处理场景标准化,例如文件到数据库的迁移、不同数据库之间的数据迁移等。每个知识模块由一系列步骤组成,这些步骤由Jython脚本语言编写,结合SQL语句,记录了如何执行特定...
通过上述详尽的分析和解决方案,可以看出,尽管Longraw类型的限制较多,但在现代数据集成工具如ODI的帮助下,依然可以有效地处理BLOB到Longraw的转换,满足特定场景下的数据迁移需求。这不仅展示了ODI的强大功能,也...
它们是一组预先定义的代码模板,每个KM对应一个特定的数据处理任务,通过组合使用不同的KM,可以构建出复杂的ETL(提取、转换、加载)流程。KM的设计理念在于抽象和重用,它描述了数据集成的规则和过程,不涉及具体...
对于美国政府或其授权方,手册特别注明了“商业计算机软件”或“商业技术数据”的性质,使用、复制、披露、修改及适应均受制于政府合同中的限制和许可条款,同时遵循FAR52.227-19商业计算机软件许可证规定。...
- **创建工作资料库**: 工作资料库用于存放实际的数据处理任务和结果。 - **连接工作资料库**: 同样需要通过正确的凭据来建立连接。 #### Agent 的配置 - **Listener Agent**: 负责监听来自ODI服务器的任务请求。 ...
Oracle Data Integrator (ODI) 是Oracle公司提供的一款强大的数据集成工具,它支持多种数据集成技术,其中包括Change Data...通过学习和实践,开发者和数据工程师能够充分利用ODI的CDC功能,提升数据处理的效率和精度。
- **数据处理**:编写Pig Latin脚本进行数据处理。 ##### 3.3 使用Pig 具体介绍了如何使用Pig进行数据处理。 - **数据加载**:从HDFS或其他数据源加载数据。 - **数据转换**:使用Pig Latin进行各种数据转换操作。 ...
- **前处理**:可能需要预处理Excel数据,例如清理空格、删除无效数据、转换数据格式等。 - **权限与连接**:确保有足够权限在Oracle数据库上创建表和插入数据,同时正确配置数据库连接信息。 - **错误处理**:在...
1. **Oracle 11g R2企业版**:作为基础数据库平台,它提供了强大的数据处理能力,包括真正的应用集群管理、大数据表分区、高访问量并行处理和基于数据库层的灾难恢复备份等高级特性。这些特性确保了数据的安全性和...
在ODI中,数据流可以通过工作流和映射来定义,这使得数据抽取、转换和加载的过程变得可视化和易于管理。理解ODI的工作原理、工作流设计以及如何创建和运行映射是非常重要的。 4. **数据集成**:ODI在数据集成领域...
- **AI Cloud ETL**:基于云的ETL服务,利用人工智能优化数据处理流程。 - **DataStage**:IBM的数据集成工具,适用于大规模的数据仓库环境。 - **Repository Explorer**:用于管理ETL作业的元数据和配置信息。 - **...
6. **网格计算**:Oracle 11g支持网格计算,可以轻松扩展到成千上万台服务器,满足大规模数据处理需求。 对于初学者,理解这些特性并学习如何在实际环境中应用它们是至关重要的。通过《Oracle Database 11g初学者...
Oracle和ETL(Extract, Transform, Load)是IT行业中数据处理和数据库管理的两个关键领域。作为一位ETL工程师,你需要对数据的提取、转换和加载过程有深入的理解,并且熟悉Oracle数据库系统。以下是一些关于这两个...
这个数据集包含在名为"Cricket.csv"的CSV文件中,这是一种常见的数据存储格式,易于读取和处理,常用于统计分析和数据科学项目。 CSV(Comma Separated Values)文件以逗号分隔各个字段,每个记录都在新的一行中,...
- **大数据分析**:支持大规模数据处理和分析需求。 - **云服务**:为云计算环境提供稳定可靠的数据库服务。 #### 九、总结 通过上述内容我们可以了解到 Oracle Database 11g SQL 在各个方面都有所提升和完善,不仅...