通过ETL数据收集加载数据时丢失数据

时间:2017-02-10 19:51:23

标签: sql db2 etl netezza datastage

我正在尝试通过ETL Datastage将数据从DB2表加载到Netezza。这是针对时间戳列的增量加载。 所以源SQL就像

select * from db2_table where timestamp_column > '2017-02-10 08:24:00';

在Netezza表中加载数据后,当我在查询下运行并得到以下结果时。

select max(timestamp_column) from netezza_table; 

返回'2017-02-10 11:17:56'

这对我来说很好看。

但是我注意到我们在DB2表中有一条记录,其timestamp_column是'2017-02-10 11:17:54',尽管目标Netezza表中缺少该数据。

这不是常规问题,但是当问题发生时,我注意到缺少记录的timestamp_column值小于1或2秒。

我的问题是,如果Netezza中的max(timestamp_column)值为'2017-02-10 11:17:56',则ETL作业应该已获取'2017-02-10 11:17:54'记录。

如何错过这条记录?

2 个答案:

答案 0 :(得分:0)

完全有可能更新了ETL作业读取行之后提交的'2017-02-10 11:17:54'记录的事务。 DB2数据库中的缺省隔离级别(我假设DB2 for LUW)是CS,它只在处理游标时锁定当前行,而其他事务可以自由更新已经读取的行。

您可以尝试将ETL作业的隔离级别增加到RR,以确保在您阅读完成后不会更改结果集,但请记住,它会影响DB2上的更新并发性侧。

答案 1 :(得分:0)

解决问题的方法可能是行更改时间戳。 DB2在插入或更新时自动生成此时间戳,因此是确定增量的完美解决方案。 像这样

在源表中添加一个额外的列
rct timestamp not null generated always for each row on update as row change timestamp

为避免因DDL更改而发生冲突,您还可以将此列定义为“隐藏”。这意味着它可以明确选择,但在运行

时不会返回
SELECT * FROM tab