【发明内容】
本发明需要解决的技术问题是:
在执行增量同步的过程中,如果发生异常中断,则下次同步时可能出现数据丢失和数据重复问题,难以与上次的增量同步过程无缝衔接,而当前的解决方案通常操作效率较低,且可能存在大量重复工作。
本发明通过如下技术方案达到上述目的:
第一方面,本发明提供了一种对增量同步异常中断情况的处理方法,包括:
在增量同步过程中为每一条增量数据生成一个唯一性编号,并通过实时记录已同步过的增量数据对应的唯一性编号的方式对增量同步过程进行监控;
在每次增量同步初始化阶段判断上次增量同步是否存在异常中断,若存在则判断上次增量同步执行全量抽取还是增量抽取,以确定异常中断发生的时机;
如果异常中断发生在全量抽取过程中,则下次同步时根据编号记录情况忽略已同步过的增量数据,并继续从源表中读取未同步的数据;
如果异常中断发生在增量抽取过程中,则根据编号记录情况清除增量表中已同步过的增量数据,下次同步时继续读取增量表中的剩余数据。
优选的,如果异常中断发生在增量抽取过程中,且中断发生时无法清除增量表中已同步过的数据,则下次同步时先根据编号记录情况清除增量表中已同步而未清除的增量数据,再继续读取增量表中的剩余数据。
优选的,所述增量数据是由从源表中读取的数据封装而来,或者从增量表中直接读取而来;
在全量抽取过程中,增量源从源表中读取数据封装成增量数据,并传递给增量目的,由增量目的在目的表上执行对应的DML操作;
在增量抽取过程中,增量源直接从增量表中读取增量数据,并传递给增量目的,由增量目的在目的表上执行对应的DML操作。
优选的,所述增量数据的唯一性编号是根据各增量数据产生的先后递增顺序生成;
对于从源表中读取的数据封装而来的增量数据,对应的唯一性编号均为负整数,且从第一预设值开始,以数值a为间隔递增;
对于从增量表中直接读取而来的增量数据,对应的唯一性编号均为正整数,且从第二预设值开始,以数值a为间隔递增。
优选的,所述通过实时记录已同步过的增量数据对应的唯一性编号对增量同步过程进行监控,具体为:
在元数据库中创建元数据表,记录各行为主体的ID值及ID对应的值;其中,所述行为主体包括增量源、增量目的和增量表,所述各行为主体的ID值及ID对应的值包括:增量源ID值sourceId及其对应的值sourceSyncIds、增量目的ID值destId及其对应的值destSyncId、增量表ID值cdcId及其对应的值cdcSyncId;
执行全量抽取时,所述增量目的每完成一次DML操作,将destSyncId更新为该DML操作对应的增量数据的唯一性编号cdcDataId;
执行增量抽取时,所述增量目的每完成一次DML操作,将destSyncId和cdcSyncId均更新为该DML操作对应的增量数据的唯一性编号cdcDataId,并更新sourceSyncIds;其中,sourceSyncIds以键-值对形式记录本次增量同步过程中各增量目的已同步过的增量数据的唯一性编号cdcDataId。
优选的,执行增量同步前,各行为主体在所述元数据表中不存在记录;
首次执行增量同步时,所述增量源读取cdcId对应的cdcSyncId为null,所述增量目的读取destId对应的destSyncId为null,此时将destSyncId赋值为第三预设值。
优选的,每次增量同步执行完成后,所述增量目的将各自对应的destSyncId更新为第三预设值;所述增量源监测到各增量目的成功执行完毕后,将cdcSyncId更新为第一预设值;
若本次增量同步执行的是全量抽取,则所述元数据表中无sourceSyncIds的记录,无需清理增量表;若本次增量同步执行的是增量抽取,则所述增量源根据sourceSyncIds记录的数据清理增量表,并清除相应的sourceId-sourceSyncIds这行数据。
优选的,当上次增量同步过程异常中断时,在本次增量同步过程中采用插入更新的方式执行INSERT操作,具体为:
在处理INSERT型增量数据时,先以唯一性约束列为条件列执行一次UPDATE操作;
若该UPDATE操作未影响数据库中的记录,说明不存在产生“违反唯一性约束”错误的风险,则继续在目的表上执行INSERT操作;
若该UPDATE操作影响了数据库中的记录,说明本条INSERT型增量数据为重复数据,则直接忽略本条INSERT型增量数据。
优选的,所述增量数据的结构包括编号列、操作类型列和数据列;
所述编号列用于记录对应增量数据的唯一性编号cdcDataId;所述操作类型列用于记录增量目的需要对目的表执行的DML操作类型;所述数据列用于记录源表中的数据。
第二方面,本发明提供了一种对增量同步异常中断情况的处理装置,包括至少一个处理器和存储器,所述至少一个处理器和存储器之间通过数据总线连接,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令在被所述处理器执行后,用于完成第一方面所述的对增量同步异常中断情况的处理方法。
本发明的有益效果是:
本发明提供的一种对增量同步异常中断情况的处理方法中,为每一条增量数据生成一个唯一性编号,并以实时记录已同步的增量数据的唯一性编号的方式对增量同步过程进行监控,解决了增量同步过程异常中断时再次同步可能出现的数据丢失和数据重复问题,使得处理完异常中断后再次同步时,能够无缝衔接上次的增量同步过程,顺利完成整个增量同步操作任务,并提升了操作效率。
【具体实施方式】
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
在本发明各实施例中,符号“/”表示同时具有两种功能的含义,而对于符号“A和/或B”则表明由该符号连接的前后对象之间的组合包括“A”、“B”、“A和B”三种情况。
此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。下面就参考附图和实施例结合来详细说明本发明。
实施例1:
本发明实施例提供了一种对增量同步异常中断情况的处理方法,用于解决增量同步过程异常中断时再次同步可能出现的数据丢失和数据重复问题。如图1所示,本发明实施例提供的处理方法主要包括以下步骤:
步骤201,在增量同步过程中为每一条增量数据生成一个唯一性编号,并通过实时记录已同步过的增量数据对应的唯一性编号的方式对增量同步过程进行监控。
在这里,所述增量数据的唯一性编号可根据各增量数据产生的先后递增顺序而生成,如此既可方便、快捷地为每一条增量数据生成编号,又可保证编号的唯一性。所述增量数据是由从源表中读取的数据封装而来,或者从增量表中直接读取而来:在全量抽取过程中,增量源从源表中读取数据封装成增量数据,并传递给增量目的,由增量目的在目的表上执行对应的DML操作;在增量抽取过程中,增量源直接从增量表中读取增量数据,并传递给增量目的,由增量目的在目的表上执行对应的DML操作。
无论是全量抽取还是增量抽取,在同步过程中均需要实时记录已同步过的各增量数据对应的唯一性编号。本发明实施例主要是通过在元数据库中创建一张元数据表,来实时记录已同步过的各增量数据对应的唯一性编号,进而实时监控增量同步过程。其中,关于所述元数据表的结构组成、数据记录以及监控过程具体将在后续介绍,在此不做赘述。
步骤202,在每次增量同步初始化阶段判断上次增量同步是否存在异常中断,若存在则判断上次增量同步执行全量抽取还是增量抽取,以确定异常中断发生的时机。
在整个增量同步过程中,具体涉及两个方面和两个过程。两个方面是指,一方面向所述元数据表中写入相关数据以记录同步过程和同步结果等信息,另一方面从所述元数据表中读取数据并根据对数据的分析结果采取相应的应对措施,以确保数据不丢失、尽量减少重复且出现重复数据时可以忽略或不致出错。两个过程是指全量抽取和增量抽取,其中全量抽取只需要做一次,而增量抽取是重复执行的。其中,异常中断发生的时机(即发生在全量抽取过程中还是增量抽取过程中)不同,在所述元数据表中留下的记录就不同,需要采取的应对措施也不一样;因此当增量同步过程异常中断时需要判断异常中断发生的时机,以便“对症下药”。
在每次增量同步的初始化阶段,先根据上次增量同步时记录的数据,即所述元数据表中的数据,判断上次增量同步过程中是否存在异常中断;如果存在,则继续根据所述元数据表中的数据,判断上次是从源表中读取数据进行同步还是从增量表中读取数据进行同步,即判断上次增量同步执行的是全量抽取还是增量抽取,进而确定异常中断发生的时机,以便下次增量同步时选择相应的应对措施。其中,具体判断方法将在后续介绍,在此不做赘述。如果上次增量同步执行的是全量抽取,则向下执行步骤203;如果上次增量同步执行的是增量抽取,则向下执行步骤204.
步骤203,如果在全量抽取过程中发生异常中断,则下次同步时根据编号记录情况忽略已同步过的增量数据,并继续从源表中读取未同步的数据。
如果中断发生在同步源表数据的过程中,则下次同步时继续同步源表数据。由于所述增量数据的唯一性编号是根据各增量数据产生的先后递增顺序而生成,因此编号小于上次增量同步数据编号的数据,均为已经同步过的数据;则下次同步时先根据所述元数据表中的记录,忽略编号小于上次增量同步时记录编号的已同步数据,继续从源表中读取未同步的数据。如此一来,下次执行同步时可无缝衔接上次全量抽取过程,仅同步上次未同步的数据,不存在数据重复。
步骤204,如果在增量抽取过程中发生异常中断,则根据编号记录情况清除增量表中已同步过的增量数据,下次同步时继续读取增量表中的剩余数据。
如果中断发生在同步增量表数据的过程中,则下次同步时继续同步增量表数据。具体如下:中断发生时根据所述元数据表中的记录,清除增量表中已同步过的增量数据(即编号小于上次增量同步数据编号的数据),则下次同步时继续读取增量表中的未同步数据(即清除已同步数据之后的剩余数据),从而避免了下次同步时对已同步数据进行重复操作,同时又可避免未同步的增量数据丢失。特别地,如果中断发生时无法清除增量表中已同步过的数据,则下次增量同步开始时,先根据所述元数据表中的编号记录情况,清除增量表中已同步而未清除的增量数据,以避免操作重复,再继续读取增量表中的剩余数据。
本发明提供的上述对增量同步异常中断情况的处理方法中,为每一条增量数据生成一个唯一性编号,并以实时记录已同步的增量数据的唯一性编号的方式对增量同步过程进行监控,解决了增量同步过程异常中断时再次同步可能出现的数据丢失和数据重复问题,使得处理完异常中断后再次同步时,能够无缝衔接上次的增量同步过程,顺利完成整个增量同步操作任务,并提升了操作效率。
结合图3和图4,所述增量数据的结构通常包括三部分:编号列、操作类型列(I、D、UO、UN)和数据列。所述编号列即图中CDC-ID列,该列中的数据是唯一递增的,表征增量数据形成的先后顺序,用于记录对应增量数据的唯一性编号cdcDataId。所述数据列即图中PERSONID列、SEX列、NAME列、EMAIL列以及PHONE列,用于记录源表中的数据。所述操作类型列即图中CDC-OPT列,用于记录增量目的需要对目的表执行的DML操作类型;其中,I表示需要将数据列中的数据插入到目的表中,D表示需要从目的表中删除数据列对应的数据,UO表示数据列中的数据为更新前的数据,UN表示数据列中的数据为更新后的数据。
基于上述增量数据的结构,在增量表中记录源表因DML操作导致的数据变化的原理是:当源表中插入一条数据时,增量表中加入一条I型数据;当源表中删除一条数据时,增量表中加入一条D型数据;当源表中更新一条数据时,增量表中一次加入一条UO型数据和一条UN型数据。增量数据是从增量源流出的数据,也是向增量目的流入的数据,无论是由从源表中读取的数据封装而来,还是由从增量表中直接读取而来,其结构都是一致的,来源不同的增量数据的区别在于:
对于从源表中读取的数据封装而来的增量数据,其编号列中的数据(即对应的唯一性编号)均为负整数,且从第一预设值开始,以数值a为间隔递增;操作类型全部为I,表示将源表中的数据插入到目的表中。其中,所述第一预设值和所述数值a可根据需要灵活选择。在一个具体的实施例中,所述第一预设值选取Java语言中Long型数据的最小值Long.MIN_VALUE(即-9223372036854775808,以下简称mid)+1000,对应数值为-9223372036854774808(即mid+1000,以下简称sid),所述数值a选取为1;则全量抽取时,增量数据编号列CDC-ID中的数据从-9223372036854774808开始,以1为间隔递增,如图2所示。
对于从增量表中直接读取而来的增量数据,其编号列中的数据(即对应的唯一性编号)均为正整数,且从第二预设值开始,以数值a为间隔递增;其操作类型可能为I、D、UO、UN。其中,所述第二预设值和所述数值a可根据需要灵活选择。在一个具体的实施例中,所述第二预设值选取为1,所述数值a也选取为1;则增量抽取时,增量数据编号列CDC-ID中的数据从1开始,以1为间隔递增,如图3所示。其中,图3中的源表数据变化是相对于图2中的源表数据来说的。
其中,增量目的接收到I型数据时,在目的表中执行INSERT(插入)操作;接收到D型数据时,在目的表中执行DELETE(删除)操作;接收到连续的UN、UO型数据时,将这两条数据组装成一条数据在目的表中执行UPDATE(更新)操作。在某些情况下,代表所述源表中一次UPDATE操作的UO、UN数据不是连续传递到增量目的,此时,可先根据UO型数据在目的表中执行删除操作,再根据UN型数据在目的表中执行插入操作,也能实现目的表数据与源表数据的同步。
继续参考图4,在增量同步过程中,主要涉及三个行为主体之间的交互,三个行为主体分别为增量源、增量目的和增量表,一个增量源对应一个或多个增量目的,图中以一个增量源(即增量源1)对应三个增量目的(即增量目的1、增量目的2、增量目的3)为例。其中,“CDC_TABLE_01”表示增量表的名称,19978769806786560等数字表示各行为主体在系统中的唯一性编号(即ID)。当执行全量抽取时,“增量源1”从“CDC_TABLE_01”指向的源表中读取数据并封装成增量数据,然后传递给各增量目的;当执行增量抽取时,“增量源1”直接从“CDC_TABLE_01”中读取增量数据并传递给各增量目的。
由前述可知,本发明实施例主要是通过在元数据库中创建所述元数据表来实时监控增量同步过程,下面将对元数据表展开具体介绍:
结合图5-图7,所述元数据表中主要记录各行为主体的ID值及ID对应的值。其中,所述各行为主体的ID值及ID对应的值包括:增量源ID值(以下简称sourceId)及其对应的值(以下简称sourceSyncIds)、增量目的ID值(以下简称destId)及其对应的值(以下简称destSyncId)、增量表ID值(以下简称cdcId)及其对应的值(以下简称cdcSyncId)。另外,由图可知,所述元数据表中还记录有某些特殊数值,例如-9223372036854775808(即mid)、-9223372036854774808(即sid),用于表征特殊的含义,后面将会介绍。
每条增量数据都有一个唯一性编号cdcDataId,即其编号列CDC-ID中对应的数据。继续参考图5-图7,在所述元数据表的结构包括两部分:OBJ_ID列和PROPERTY_VALUE列,OBJ_ID列记录的是行为主体增量源、增量目的和增量表的ID值(即destId、sourceId、cdcId),PROPERTY_VALUE列记录的是行为主体ID对应的值(即destSyncId、sourceSyncIds、cdcSyncId),也可以说是cdcDataId类型的数据。其中,在本发明实施例中,图5-图7中记录的数据是与图4中所示的各行为主体以及ID值相对应。
在执行增量同步前,各行为主体在所述元数据表中并不存在记录。首次执行增量同步时,所述增量源读取cdcId对应的cdcSyncId为null,所述增量目的读取destId对应的destSyncId为null,并在此时将destSyncId赋值为第三预设值;此处以第三预设值取mid(-9223372036854775808)为例。
在增量同步过程中:
执行全量抽取时,所述增量目的每完成一次DML操作,都将destSyncId更新为该DML操作对应的增量数据的唯一性编号cdcDataId。此时,编号cdcDataId为负整数,则所述元数据表的PROPERTY_VALUE列中的数据均为负整数,且所述元数据表中仅记录destId-destSyncId,不会记录cdcId-cdcSyncId和sourceId-sourceSyncIds,如图5所示;也就是说,在全量抽取过程中的任一时间点、全量抽取顺利完成之前,所述元数据表中不存在cdcId-cdcSyncId和sourceId-sourceSyncIds的记录。
执行增量抽取时,所述增量目的每完成一次DML操作,都将destSyncId和cdcSyncId均更新为该DML操作对应的增量数据的唯一性编号cdcDataId,并更新sourceSyncIds;其中,sourceSyncIds以键-值对的形式记录本次增量同步过程中各增量目的已同步过的增量数据唯一性编号cdcDataId形成的区间。
以图6所示的增量抽取过程中某个时间点的元数据表为例,第1行数据表示“增量目的1”(ID为19974947052716032)最后一次DML操作对应的增量数据的cdcDataId为21,第2行数据表示“增量目的2”(ID为19979204093476864)最后一次DML操作对应的增量数据的cdcDataId为9,第5行数据表示“增量目的3”(ID为19979206705479680)最后一次DML操作对应的增量数据的cdcDataId为21;第3行数据表示“增量目的1”或“增量目的3”执行完最后一次DML操作后将增量表(ID为19974515472072704)对应的cdcSyncId更新为21;第4行数据表示增量源1(ID为19978769806786560)对应的sourceSyncIds的更新,即“增量目的1”和“增量目的3”同步过的增量数据的cdcDataId为1,2,3,4,5,6,7,8,9,15,16,17,18,19,20,21,而“增量目的2”同步过的增量数据的cdcDataId为1,2,3,4,5,6,7,8,9。当“增量目的2”同步完成cdcDataId为15的增量数据后,会将第2行数据更新为“19979204093476864,15”,将第3行数据更新为“19974515472072704,15”,将第4行数据更新为“19978769806786560,19974947052716032:[1,9]-[15,21];19979206705479680:[1,9]-[15,21];19979204093476864:[1,9]-[15,15]”,以此类推。
在每次增量同步执行完成后,所述增量目的将各自对应的destSyncId更新为第三预设值,表征执行同步结束,其中这里以第三预设值取mid(-9223372036854775808)为例;所述增量源监测到各增量目的成功执行完毕后,将cdcSyncId更新为第一预设值,表征执行同步结束,其中这里以第一预设值取sid(-9223372036854774808)为例。若本次增量同步执行的是全量抽取,则所述元数据表中无sourceSyncIds的记录,无需清理增量表;若本次增量同步执行的是增量抽取,则所述增量源需根据所述元数据表中sourceSyncIds记录的cdcDataId数据清理增量表,并清除相应的sourceId-sourceSyncIds这行数据。
因此,无论某次增量同步执行的是全量抽取还是增量抽取,在执行同步结束后,若运行过程中不存在任何因素导致的异常中断,则所述元数据表中记录的数据都将是如图7所示的形式:表中仅有destId-destSyncId记录和cdcId-cdcSyncId记录,无sourceId-sourceSyncIds记录,且各增量目的对应的destSyncId均为第三预设值(-9223372036854775808),增量表对应的cdcSyncId为第一预设值(-9223372036854774808)。
其中,所述清理增量表是指,在增量抽取完成后,所述增量源将增量表中增量目的已同步过的数据删掉,避免下次增量同步时数据重复。例如,假设在清除sourceId-sourceSyncIds这行数据前,sourceSyncIds为“19974947052716032:[1,9]-[15,21];19979206705479680:[1,9]-[15,21];19979204093476864:[1,9]-[15,21]”,则所述增量表中CDC_ID列的数值在[1,9]和[15,21]这两个区间内的增量数据会被删除。若出现异常情况,例如“增量目的2”数据库连接中断,导致增量抽取过程进行到图6所示状态时中止,则只删除增量表中CDC_ID列的数值在[1,9]区间内的增量数据,即只删除各增量目的均已同步过的数据;下次增量同步时,“增量目的1”仍然会接收到cdcDataId为15至21的增量数据,需要启用“插入更新”进行INSERT操作,避免产生“违反唯一性约束”错误。
所述插入更新是指,当上次增量同步过程出现异常中断时,下次增量同步过程中可能接收到上次同步过程中已经处理过的INSERT型增量数据,因此在下次增量同步过程中需要采用插入更新的方式执行INSERT操作。具体为:所述增量目的在处理INSERT型增量数据时,先以唯一性约束列为条件列执行一次UPDATE操作;若该UPDATE操作未影响数据库中的记录,即影响了数据库中0条记录,说明不存在产生“违反唯一性约束”错误的风险,则所述增量目的可继续在目的表上执行INSERT操作;若该UPDATE操作影响了数据库中的1条记录,说明本条INSERT型增量数据为重复数据,则直接忽略本条INSERT型增量数据,不再执行INSERT操作。如此一来可避免数据重复,而且也保证了目的表数据与源表数据的同步。
综上所述,本发明实施例提供的上述对增量同步异常中断情况的处理方法,具有以下有益效果:
根据增量数据产生的先后顺序为每一条增量数据生成一个唯一性编号,在元数据库中创建一张元数据表来实时记录已同步的增量数据编号,可实时监控增量同步的状态,为异常中断情况时的下次同步过程提供依据;
当异常中断发生在全量抽取过程中时,下次同步会且仅会忽略上次已同步过的数据,无缝衔接上次全量抽取过程,不会出现数据丢失或数据重复的问题;当异常中断发生在增量抽取过程中时,可清除增量表中已被所有增量目的都同步过的增量数据,不会出现数据丢失的问题,且不会留下过多重复数据,下次同步时继续同步剩余数据,避免重复操作;
当增量同步过程出现异常中断时,下次增量同步过程中对INSERT型增量数据采用“插入更新”的方式执行INSERT操作,避免产生“违反唯一性约束”错误,避免了数据重复;
增量抽取完成后,可实时清理增量表中的增量数据,不存在通过UPDATE操作来进行标记,大大提升操作效率。
实施例2:
在上述实施例1的基础上,本发明实施例从行为主体中的所述增量源入手,对整个增量同步过程以及增量同步异常中断情况的处理方法展开介绍。如图8所示,所述增量源的工作过程具体包括:
第一,所述增量源从元数据表中读取增量源所加载的增量表的cdcId对应的cdcSyncId,并根据cdcSyncId的值判断本次增量同步执行的是全量抽取还是增量抽取。
若cdcSyncId值不为null且大于sid(即第一预设值),说明本次同步不是首次同步、上次同步为增量抽取且上次增量抽取过程异常中断,则本次同步继续执行增量抽取。此时从所述元数据表中读取sourceSyncIds,若sourceSyncIds不为null,说明所述增量表中存在已同步而未清除的增量数据,则需要清理增量表,避免重复,同时清除sourceId-sourceSyncIds这行数据,即清空增量目的同步记录。
若cdcSyncId值不为null且等于sid,说明本次同步不是首次同步、上次同步为增量抽取且上次增量抽取过程顺利完成,则本次同步直接从所述增量表中读取增量数据,继续执行增量抽取。
若cdcSyncId值为null,说明本次同步可能是首次同步,也可能是非首次同步但上次为全量同步且异常中断,无论是哪种情况,本次都应该从源表中读取数据并封装为增量数据,继续执行全量抽取。
第二,根据判断结果,按流程执行全量抽取和/或增量抽取,具体如下:
执行全量抽取时,先清空增量表,并令cdcSyncId=sid,然后以sid+1为起始编号,依次从源表中读取数据并封装为INSERT型增量数据,并放入缓存队列中;直至源表中的所有数据已经读取完毕,则继续执行增量抽取。需要注意的是,清空增量表后,在执行全量抽取的过程中,有可能还存在别的流程对源表作DML操作。
执行增量抽取时,依次从增量表中读取增量数据,并放入缓存队列中,直到增量表中数据读取完毕为止。其中,缓存队列中的增量数据的编号是递增的,但不一定是连续的。
第三,增量抽取执行完毕后,将FinishMessage放入到缓存队列中,然后开启监控程序,监控从增量源接收增量数据的各增量目的的运行状态。其中,如图8所示,所述监控程序具体如下:
判断各增量目的是否停止运行,当所有增量目的都已停止运行时,从所述元数据表中读取sourceSyncIds值,并根据sourceSyncIds值决定本次同步过程中的应对措施。
若sourceSyncIds值不为null,说明本次同步过程涉及增量抽取,则所述增量表可能需要清理。其中,若只有一个增量目的,则根据sourceSyncIds中的数据直接清理增量表;若存在多个增量目的,则根据sourceSyncIds中的数据,只清理增量表中所有增量目的都已同步过的增量数据。然后,清空sourceId-sourceSyncIds这行数据,即清空增量目的同步记录。最后,更新cdcSyncId为sid。若存在非正常结束的增量目的,如某个增量目的数据库连接中断,则将所有增量目的的destId对应的、等于mid(即第三预设值)的destSyncId设为0,下次同步时,所有增量目的都将启用“插入更新”。
若sourceSyncIds值为null,说明本次同步过程仅涉及全量抽取,不需要清理增量表。其中,若所有增量目的都处于正常结束状态,则更新cdcSyncId为sid;否则,所述元数据表中依然不存在cdcSyncId的记录,全量抽取未正常完成,下次同步开始时需继续进行全量抽取。
实施例3:
在上述实施例1和实施例2的基础上,本发明实施例进一步从行为主体中的所述增量目的入手,对整个增量同步过程以及增量同步异常中断情况的处理方法展开介绍。如图9所示,所述增量目的的工作过程具体包括:
第一,所述增量目的从元数据表中读取destSyncId值,并将destSyncId记为lastDestSyncId。
若为首次同步,则destSyncId为null,此时将destSyncId赋值为mid;
若非首次同步,则destSyncId值可能为mid,表明上次同步顺利完成,也可能是一个大于mid的值:若destSyncId为负整数,说明上次同步在全量抽取过程中异常中断;若destSyncId为正整数,说明上次同步在增量抽取过程中异常中断。其中,若destSyncId值大于mid,则说明本次同步过程中增量目的可能会接收到重复的INSERT型增量数据,需要启用“插入更新”。
第二,所述增量目的从缓存队列中获取一条增量数据,并判断该数据是否为FinishMessage。
若是FinishMessage,则更新所述元数据表中的destSyncId为mid,将状态标记为正常结束,供增量源的所述监控程序查验;若不是FinishMessage,则解析该条增量数据,获取其唯一性编号cdcDataId和操作类型optType,进而采取相应的应对措施。
进一步地,若cdcDataId小于lastDestSyncId,且cdcDataId小于0,说明本次同步为全量同步且上次全量同步异常中断,该条增量数据所对应的源表中的数据在所述目的表中已存在,因此可以直接忽略,所述增量目的继续从缓存队列中获取下一条增量数据。否则,本条增量数据不忽略,则所述增量目的可根据获取到的操作类型optType在目的表中执行相应的DML操作,具体如下:
若为I型数据,则执行INSERT操作;
若为D型数据,则执行DELETE操作;
若为UO型数据,则先判断是否有留存的UN型数据。若有,则判断该UN数据是否应该与UO数据成对:若成对,则执行UPDATE操作,若不成对,则将UO数据留存,根据UN执行INSERT操作;若没有,则将UO数据留存,继续从缓存队列中获取一条增量数据;
若为UN型数据,则先判断是否有留存的UO型数据。若有,则判断该UO数据是否应该与UN数据成对:若成对,则执行UPDATE操作,若不成对,则将UN数据留存,根据UO执行DELETE操作;若没有,则将UN数据留存,继续从缓存队列中获取一条增量数据。
所述增量目的每执行成功一次DML操作,则更新所述元数据表中的destSyncId为该DML对应的增量数据的cdcDataId。若cdcDataId大于0,说明当前处于增量抽取过程中,则更新元数据表中的cdcSyncId为cdcDataId,并更新sourceSyncIds,记录本次增量同步过程中已同步过的增量数据编号cdcDataId。然后,继续从缓存队列中获取一条增量数据。
如果DML操作执行失败,则将状态标记为非正常结束并停止运行,供增量源的所述监控程序查验。其中,所述监控程序具体可参考实施例2和图8,在此不做赘述。
进一步地,当增量同步过程异常中断时,异常中断的诱因(例如数据库连接中断、服务器宕机等)不同,在元数据表中留下的记录就不同,需要采取的应对措施也不一样。结合增量源和增量目的的工作流程,对增量同步过程中的几种异常中断情形及应对措施进行举例说明:
例1,服务器断电或误触“中止按钮”。若发生在全量抽取过程中,则已同步数据在下次同步时会被增量目的直接忽略,不会造成数据重复;若发生在增量抽取过程中,则下次同步时,增量源会根据元数据表中留下来的sourceSyncIds清理增量表,避免过多重复数据,且由于上次同步时,未将destSyncId置为mid,所有增量目的会启用“插入更新”,不会导致“违反唯一性约束”错误。
例2,增量源异常中断。若发生在全量抽取过程中,应对措施同上,即已同步数据在下次同步时会被增量目的直接忽略,不会造成数据重复;若发生在增量抽取过程中,则所述增量源会根据元数据表中留下来的sourceSyncIds清理增量表,避免重复数据。
例3,增量目的异常中断。若发生在全量抽取过程中,上次同步过程不会留下sourceId-sourceSyncId记录,本次同步依然会继续开始从源表读取数据,且增量目的会自动忽略上次已同步的数据,不会导致数据重复;若发生在增量抽取过程中,则在上次同步过程结束时,增量源会清理增量表中已经被所有增量目的同步过的数据,且将所有增量目的对应的、不等于mid的destSyncId设为0,在本次同步过程中,所有增量目的都会启用“插入更新”,因而不会有过多重复数据,且不会因为重复数据导致同步失败。
实施例4:
在上述实施例1-实施例3提供的对增量同步异常中断情况的处理方法的基础上,本发明还提供了一种可用于实现上述方法的对增量同步异常中断情况的处理装置,如图10所示,是本发明实施例的装置架构示意图。本实施例的对增量同步异常中断情况的处理装置包括一个或多个处理器21以及存储器22。其中,图10中以一个处理器21为例。
所述处理器21和所述存储器22可以通过总线或者其他方式连接,图10中以通过总线连接为例。
所述存储器22作为一种对增量同步异常中断情况的处理方法非易失性计算机可读存储介质,可用于存储非易失性软件程序、非易失性计算机可执行程序以及模块,如实施例1中的对增量同步异常中断情况的处理方法。所述处理器21通过运行存储在所述存储器22中的非易失性软件程序、指令以及模块,从而执行对增量同步异常中断情况的处理装置的各种功能应用以及数据处理,即实现实施例1-实施例3的对增量同步异常中断情况的处理方法。
所述存储器22可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实施例中,所述存储器22可选包括相对于所述处理器21远程设置的存储器,这些远程存储器可以通过网络连接至所述处理器21。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
所述程序指令/模块存储在所述存储器22中,当被所述一个或者多个处理器21执行时,执行上述实施例1中的对增量同步异常中断情况的处理方法,例如,执行以上描述的图1、图8和图9所示的各个步骤。
本领域普通技术人员可以理解实施例的各种方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:只读存储器(ROM,Read Only Memory)、随机存取存储器(RAM,RandomAccessMemory)、磁盘或光盘等。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。