盖型螺母一、方案介绍
在ETL抽取端设置一个控制文件,用于记录数据抽取的进度信息。其中分别登记了当前抽取的记录的主键id、下一条要抽取的记录的主键id和前下一条要抽取的记录的主键id,示意如下图所示: 抽取某一库表前,按照主键水烟(索引)排序,读取其前N条(参数可配置)记录作为本次作业要处理的数据集,下一次作业则抽取N+1~2N区间的记录,依此类推。
在抽取过程中,通过对此文件进行实时更新,能够反映ETL数据抽取的最近进展信息,并为故障恢复提供参考依据。
二、工作原理
其机制如下:
喉管 1、每开始抽取一条数据记录之前,在控制文件中写入当前抽取的记录的id和下一条要抽取的记录的id;
2、每成功完成抽取一条记录之后,都更新此控制文件,把刚处理过的记录的id写在prev_id的位置;
3、上面过程中遇到的各种异常,都不要求抽象工具/程序进行异常处理,而是直接抛出异常后中止。
以上步骤迭代进行。
这样就将抽取一条记录的过程分解为事前、事中和事后,以下若不特别说明,对之做泛指,不作区分。
三、中断恢复
总体过程为:如果在抽取一条记录的过程中,发生诸如网络中断、系统掉电等问题故障,经手工排除后,重启ETL抽取过程。
为了检查在ETL抽取的中断期间,源库表是否有新增了数据,引出线设定陈皮酱一个检测方法,实现返回介于两个给定的主键id之间的记录,以下简称为PROC_A。
发出重启指令,指示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抽取流程。