发出重启指令,指示
ETL
抽取按照以下步骤进行:
1
、首先进行控制文件的检查、恢复,以及数据的校正。
(
1
)、如果发现
prev_id=curr_id
,则可推测中断
/
故障是在抽取完成一条记录(因
将
curr_id
写到了
prev_id
),但还没开始抽取新一条记录的时候发生的。
这时,将
next_id
写到
curr_id
,
next_id
写作下一条要抽取的记录的
id
。然后,
执行
PROC_A
(以
prev_id
和
curr_id
作为实参),如果返回不空的记录集,则备份控制
文件,使用原控制文件(对其重复擦写)对这个记录集进行抽取。完成后,再用备份的控
制文件覆盖原控制文件。
(
2
)、如果发现三个
id
数值互不相同(常态),则须将标识以
curr_id
的这条完整
记录跟目标数据库进行比对
/
检查,查找目标数据库中是否有这条记录,存在几种可能:
a
、不存在这条记录
这说明,中断
/
故障发生在抽取当前记录的过程中,导致数据完全没有进入目
标数据库。对于这种情况,按道理讲,如果不存在
ETL
抽取中断期间新增数据的情况的话,
只须再次从当前记录重新进行抽取即可(不须调整控制文件)。但为了尽可能保持源库表
和目标数据库表数据的一致,同样执行
PROC_A
(以
prev_id
和
curr_id
作为实参),如
果返回不空的记录集,则备份控制文件,使用原控制文件(对其重复擦写)对这个记录集
进行抽取。完成后,再用备份的控制文件覆盖原控制文件。
b
、已存在这条记录
须进一步检查源库表的这条记录跟目标数据库的这条记录是否完全一致。如
果不完全一致,则须以源库表的这条记录为标准更新目标数据库这条记录不一致的那些字
段。这种情况,说明抽取
curr_id
这条记录出错(字段数据不一致),虽然完成,但还没
来得及写控制文件,系统就发生了异常。如果一致,则说明正在抽取过程中发生异常(但
抽取结果是完整的),还没来得及写控制文件。
使 用 程 序 自 动 调 整 控 制 文 件 , 将
curr_id
写 到
prev_id
,
next_id
写 到
curr_id
,
next_id
则取作下一条要抽取的记录的
id
。
然后执行
PROC_A
(以
prev_id
和
curr_id
作为实参),如果返回不空的记
录集,则备份控制文件,使用原控制文件(对其重复擦写)对这个记录集进行抽取。完成
后,同样用备份的控制文件覆盖原控制文件。
2
、接下来,运行正常的
ETL
抽取流程。
评论