发明内容
针对现有技术的以上缺陷或改进需求,本发明提供了一种基于日志解析的数据同步方法和数据同步系统,其目的在于,根据源端数据库的实际操作及时管理更新离线字典文件,以避免字典文件中存在过多版本的定义信息,及时释放磁盘空间,从而避免拖慢日志同步服务重启过程的速度。
为实现上述目的,按照本发明的一个方面,提供了一种基于日志解析的数据同步方法,所述数据同步方法包括:
日志分析线程在解析到DDL操作后,判断所述DDL操作的操作类型;
当所述DDL操作为创建操作时,为新创建的目标对象建立包含对象定义信息的离线字典文件;
获取针对所述目标对象的目标操作,根据所述目标操作管理所述离线字典文件;
从目的端获取检查点的日志序列号LSN1,根据所述日志序列号LSN1清理所述离线字典文件。
优选地,所述当所述DDL操作为创建操作时,为新创建的目标对象建立包含对象定义信息的离线字典文件包括:
当所述DDL操作为创建操作时,获取所述创建操作的日志序列号和新创建的目标对象的定义信息;
将所述创建操作的日志序列号和所述目标对象的定义信息整合成第一版本定义信息,将所述第一版本定义信息存储于所述目标对象的离线字典文件中。
优选地,所述获取针对所述目标对象的目标操作,根据所述目标操作的操作类型管理所述离线字典文件包括:
获取针对所述目标对象的目标操作;
判断所述目标操作的操作类型;
若所述目标操作为DDL操作,则判断DDL操作的操作类型;
当DDL操作为ALTER操作时,执行所述从目的端获取检查点的日志序列号LSN1,根据所述日志序列号LSN1清理所述离线字典文件的步骤,以管理所述离线字典文件。
优选地,所述从目的端获取检查点的日志序列号LSN1,根据所述日志序列号LSN1清理所述离线字典文件包括:
根据检查点的日志序列号LSN1确定无效的定义版本在所述离线字典文件中的占比情况;
当无效的定义版本在所述离线字典文件中的占比大于设定的占比值时,基于有效的定义版本为所述目标对象创建新的离线字典文件,以清理离线字典文件中无效的定义版本;
将基于所述ALTER操作修改后的定义信息和所述ALTER操作的日志序列号整合为下一版本定义信息;
将所述下一版本定义信息追加在新的离线字典文件的尾部。
优选地,所述根据检查点的日志序列号LSN1确定无效的定义版本在所述离线字典文件中的占比情况包括:
基于检查点的日志序列号LSN1从前往后遍历离线字典文件的各个定义版本;
当本次检查的定义版本的日志序列号小于日志序列号LSN1,且本次检查的定义版本不是最后一个定义版本,则本次检查的定义版本为无效版本,继续获取下一次检查的定义版本,直至定义版本的日志序列号大于日志序列号LSN1,以确定无效的定义版本。
优选地,所述获取针对所述目标对象的目标操作,根据所述目标操作的操作类型管理所述离线字典文件还包括:
当所述目标操作为DROP操作时,在所述离线字典文件的尾部添加删除标记,并将所述DROP操作的日志序列号与所述删除标记建立关联。
优选地,所述从目的端获取检查点的日志序列号LSN1,根据所述日志序列号LSN1清理所述离线字典文件包括:
判断所述DROP操作的日志序列号是否小于所述日志序列号LSN1;
若小于,则删除所述离线字典文件;
若不小于,则继续获取最新的检查点的日志序列号LSN1,直至所述DROP操作的日志序列号小于日志序列号LSN1时,才删除所述离线字典文件。
优选地,所述当所述DDL操作为创建操作时,为新创建的目标对象建立包含对象定义信息的离线字典文件包括:
当所述DDL操作为创建操作时,获取新创建的目标对象的对象ID;
基于所述目标对象的对象ID为所述目标对象的离线字典文件命名。
优选地,所述获取针对所述目标对象的目标操作,根据所述目标操作管理所述离线字典文件包括:
获取针对所述目标对象的目标操作,判断所述目标操作的操作类型;
当所述目标操作为DML操作时,基于大于最近原则从离线字典文件中,获取与所述目标操作相匹配的定义信息,以进行数据同步。
为实现上述目的,按照本发明的另一个方面,提供了一种数据同步系统,所述数据同步系统包括至少一个处理器;以及,与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被程序设置为执行本发明所述的数据同步方法。
总体而言,通过本发明所构思的以上技术方案与现有技术相比,具有如下有益效果:本发明提供了一种基于日志解析的数据同步方法和数据同步系统,所述数据同步方法包括:日志分析线程在解析到DDL操作后,判断所述DDL操作的操作类型;当所述DDL操作为创建操作时,为新创建的目标对象建立包含对象定义信息的离线字典文件;获取针对所述目标对象的目标操作,根据所述目标操作管理所述离线字典文件;从目的端获取检查点的日志序列号LSN1,根据所述日志序列号LSN1清理所述离线字典文件。
在本发明中,将对象的定义信息存储于离线字典文件中,无需实时访问数据库,不仅可以降低对数据库性能的影响,同时还可以保证获取正确的对象定义信息,进而保证数据同步或日志分析的准确性。在实际应用中,根据源端数据库的实际操作及时管理更新离线字典文件,以避免字典文件中存在过多版本的定义信息,及时释放磁盘空间,从而避免拖慢日志同步服务重启过程的速度。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
在本发明的描述中,术语“内”、“外”、“纵向”、“横向”、“上”、“下”、“顶”、“底”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本发明而不是要求本发明必须以特定的方位构造和操作,因此不应当理解为对本发明的限制。
此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。
实施例1:
在源端数据库及目的端数据库部署同步系统,源端数据库同步系统从源端数据库读取日志,而目的端数据库同步系统则是负责把源端发过来的同步操作应用到目的端数据库。
在基于日志解析同步的系统中,源端日志分析模块通过把数据库对像定义信息存储在本地,形成离线字典文件,离线字典文件比使用连接在线数据库取对像定义的方式有明显的优势,前者除了可以支持DDL操作同步以外,还可以实现在日志解析过程中无需跟源数据库进行交互,在源数据库异常的情况下依旧可以进行日志解析。下面具体说明基于离线字典文件进行数据同步的方法,以及在数据同步中根据实际操作管理离线字典文件的方法。
参阅图1,在本实施例中,基于日志解析的数据同步方法包括:
步骤101:日志分析线程在解析到DDL操作后,判断所述DDL操作的操作类型。
在本实施例中,在源端执行DDL操作时,相应对象的定义信息会发生改变,需要根据DDL操作的操作类型执行相关的操作,以管理离线字典文件。
其中,DDL操作包括DROP操作、ALTER操作和创建操作。其中,DROP操作将删除表的结构,以及被依赖的约束、触发器和索引等;ALTER操作用于在已有的表中添加、修改或删除列;创建操作用于创建对象。
具体地,源端数据同步系统启动后需要初始化一个检查点调度线程和一个日志分析线程。检查点调度线程负责定时从目的端数据同步系统获取同步的检查点的日志序列号和清理无效的字典文件;日志分析线程负责分析日志并通过分析得到的DDL操作来维护字典文件。
步骤102:当所述DDL操作为创建操作时,为新创建的目标对象建立包含对象定义信息的离线字典文件。
其中,每一个对象会对应有一个离线字典文件,离线字典文件包含至少一个版本的定义信息。在本实施例中,以不断在离线字典文件的尾部增加下一版本的定义信息的方式,管理离线字典文件。
在本实施例中,当所述DDL操作为创建操作时,为新创建的目标对象建立包含对象定义信息的离线字典文件。
具体地,当所述DDL操作为创建操作时,获取所述创建操作的日志序列号和新创建的目标对象的定义信息,将所述创建操作的日志序列号和所述目标对象的定义信息整合成第一版本定义信息,将所述第一版本定义信息存储于所述目标对象的离线字典文件中。
此外,当所述DDL操作为创建操作时,获取新创建的目标对象的对象ID;基于所述目标对象的对象ID为所述目标对象的离线字典文件命名。在实际应用场景下,在创建离线字典文件时,使用对像ID来命名离线字典文件,可以在日志解析过程中很方便的通过待解析的对像ID来找到它对应的离线字典文件。
步骤103:获取针对所述目标对象的目标操作,根据所述目标操作管理所述离线字典文件。
在本实施例中,日志分析线程在获取到针对所述目标对象的目标操作后,根据所述目标操作管理所述离线字典文件。当所述目标操作为DML操作时,获取所述DML操作所针对的对象的对象ID,根据对象ID遍历各个离线字典文件的文件名称,从而获取到正确的离线字典文件。当所述目标操作为DDL操作时,根据DDL操作的操作类型在所述离线字典文件中追加新的版本的定义信息,或删除离线字典文件中无效的版本信息,或在离线字典文件中添加删除标记,以根据DDL操作的操作类型管理离线字典文件。
步骤104:从目的端获取检查点的日志序列号LSN1,根据所述日志序列号LSN1清理所述离线字典文件。
其中,检查点的日志序列号指的是目的端数据同步系统定时保存的事务操作日志的日志序列号,当同步系统发生异常重启时,源端数据同步可以根据检查点的日志序列号来定位日志分析的起始位置。
在实际应用场景下,随着同步进程的推进以及DDL操作对目标对象的对象定义信息的修改,在离线字典文件中会存在无效版本的定义信息,需要根据同步情况及时清理离线字典文件,以避免字典文件中存在过多版本的定义信息,及时释放磁盘空间,从而避免拖慢日志同步服务重启过程的速度。
在优选的实施例中,在DDL操作频繁的系统中,检查点调度线程每次调度的间隔可以设置的较短一些,及时更新检查点的日志序列号,这样可以使得离线字典文件中不至于有太多的版本。具体地,获取DDL操作出现的频率,根据DDL出现的频率动态调整获取最新的检查点的时间间隔,以使检查点的更新进度与离线字典文件的版本相匹配。具体地,当DDL出现的频率大于预设频率阈值时,缩短获取最新的检查点的时间间隔;当DDL出现的频率小于预设频率阈值时,延长获取最新的检查点的时间间隔。
在本实施例中,将对象的定义信息存储于离线字典文件中,无需实时访问数据库,不仅可以降低对数据库性能的影响,同时还可以保证获取正确的对象定义信息,进而保证数据同步或日志分析的准确性。在实际应用中,根据源端数据库的实际操作及时管理更新离线字典文件,以避免字典文件中存在过多版本的定义信息,及时释放磁盘空间,从而避免拖慢日志同步服务重启过程的速度。
下面参阅图2,具体说明步骤103的实现过程,步骤103包括如下步骤:
步骤1031:获取针对所述目标对象的目标操作。
步骤1032:判断所述目标操作的操作类型。
其中,目标操作包括DML操作和DDL操作,当目标操作为DML操作时,执行步骤1033,当目标操作为DDL操作时,执行步骤1034。
步骤1033:当所述目标操作为DML操作时,基于大于最近原则从离线字典文件中,获取与所述目标操作相匹配的定义信息,以进行数据同步。
由前述描述可知,每个对象的离线字典文件中可能会对应多个版本定义信息,为了确定目标对象在操作时刻点对应的对象定义。在本实施例中,获取包含目标对象的定义信息的所有版本定义信息对应的日志序列号,并比较目标操作的日志序列号与所有版本定义信息对应的日志序列号,基于大于最近原则确定相应版本的定义信息,以获取目标对象的定义信息。
其中,基于大于最近原则是指,目标操作对应的日志序列号有可能大于多个版本的定义信息对应的日志序列号,则选取大于并与其中一个版本对应的定义信息的日志序列号的差值最小的离线字典文件作为目标版本定义信息。然后,从目标版本定义信息中,获取目标对象的定义信息
步骤1034:若所述目标操作为DDL操作,则获取DDL操作的操作类型。
其中,DDL的操作类型包括ALTER操作和DROP操作,当DDL的操作类型为ALTER操作时,执行步骤1035;当DDL的操作类型为DROP操作时,执行步骤1039。
步骤1035:当DDL操作为ALTER操作时,根据检查点的日志序列号LSN1确定无效的定义版本在所述离线字典文件中的占比情况。
具体地,基于检查点的日志序列号LSN1从前往后遍历离线字典文件的各个定义版本,当本次检查的定义版本的日志序列号小于日志序列号LSN1,且本次检查的定义版本不是最后一个定义版本,则本次检查的定义版本为无效版本,继续获取下一次检查的定义版本,直至定义版本的日志序列号大于日志序列号LSN1,以确定无效的定义版本,从而确定无效的定义版本在所述离线字典文件中的占比情况。
当离线字典文件所包含的定义版本的数目只有一个时,无需进行离线字典文件的清理。在优选的实施例后,判断离线字典文件所包含的定义版本的数目,当离线字典文件所包含的定义版本的数目为一个时,无需进行离线文件的清理;当离线字典文件所包含的定义版本的数目大于一个时,执行根据检查点的日志序列号LSN1确定无效的定义版本在所述离线字典文件中的占比情况的步骤。
由于LSN的值是递增的,离线字典文件中的定义版本又是采用的追加形式来维护,那么在统计无效版本占比时,只需要采用对字典文件从前往后遍历的方法来判定和统计,搜索到的对像定义版本对应的LSN小于当前同步检查点LSN的,并且该版本不是文件中的最后一个版本即可以视为无效版本,最后一个无效版本以后的版本都为有效版本。
步骤1036:当无效的定义版本在所述离线字典文件中的占比大于设定的占比值时,基于有效的定义版本为所述目标对象创建新的离线字典文件,以清理离线字典文件中无效的定义版本。
在本实施例中,当无效的定义版本在所述离线字典文件中的占比大于设定的占比值时,首先创建一个新的离线字典文件,新的离线字典文件以对像ID叠加特定后缀来命名,然后遍历该对像ID对应旧的离线字典文件,通过检查点的日志序列号LSN1过滤掉无效的版本,把有效的版本通过复制和追加的形式写入到新的离线字典文件中。最后用新的离线字典文件替换旧的离线字典文件,来实现清理字典文件中无效的对像版本。
在本实施例中,采用新建离线字典文件的方式相对于在原来离线字典文件上直接修改的方式,可以有效的预防在修改离线字典文件过程中同步服务异常中止带来损坏字典文件的风险。虽然在使用新建离线字典文件替换旧离线字典文件时,依然有故障的风险,但是这种方案可以保证旧的离线字典文件是完整的,当旧的离线字典文件不存在时,新的离线字典文件肯定是完整的,在异常启动时只需要检查这两个相对应的字典文件完整性,然后任取其一。
在本实施例中,在异常启动时,检查旧的离线字典文件和新的离线字典文件的完整性,若新的离线字典文件不完整,则暂时采用旧的离线字典文件进行同步,并根据实际情况及时清理旧的离线字典文件,得到新的离线字典文件。若新的离线字典文件完整,则采用新的离线字典文件进行同步,并删除旧的离线字典文件。
其中,占比值依据实际情况而定,在此不做具体限定。可以将占比情况的占比值与获取最新的检查点的时间间隔建立关联,当获取最新的检查点的时间间隔与占比值呈正比关系。
步骤1037:将基于所述ALTER操作修改后的定义信息和所述ALTER操作的日志序列号整合为下一版本定义信息。
步骤1038:将所述下一版本定义信息追加在新的离线字典文件的尾部。
步骤1039:当所述目标操作为DROP操作时,在所述离线字典文件的尾部添加删除标记,并将所述DROP操作的日志序列号与所述删除标记建立关联。
在实际应用场景下,当离线字典文件被打上删除标记以后并不能被马上删除,这是由于同步服务在异常重启以后,日志重新定位时,上次被删除对像的操作日志可能会被再次分析,所以删除字典文件必须要确保对像删除操作的LSN比检查点的LSN小。
在步骤1039之后还包括:判断所述DROP操作的日志序列号是否小于所述日志序列号LSN1;若小于,则删除所述离线字典文件;若不小于,则继续获取最新的检查点的日志序列号LSN1,直至所述DROP操作的日志序列号小于日志序列号LSN1时,才删除所述离线字典文件。
本发明的数据同步方法的基本步骤,可以进行如下解释:首先;数据库产生的每条日志记录中都LSN值,它代表该日志产生的顺序。而LSN的表现形式在不同数据库上各不相同,有物理LSN,它采用类似日志文件的编号+日志页号+日志页内偏移来构成,例如Postgresql,Sql server和DM6等;有逻辑LSN,它采用一个顺序递增的整数来构成,例如ORACLE和DM7等。不管是哪种形式,它们都遵循一个原则,就是日志LSN随着数据库的运行严格的递增。依靠LSN这种特性,数据同步过程中解析到DDL操作就可以给对像定义的每次修改使用LSN标记以区分产生的多个版本,然后在解析日志时,就可以根据日志中的LSN在对像定义的每个版本中找到它相对应的定义,从而才能正确的完成日志操作的解析还原。
其次,为每个对像采用独立的文件来保存它在数据同步过程中生成的多个版本,当某个对像的修改次数非常频繁时,字典文件就会不断的膨胀,如果不对字典文件中的无效的版本进行清理维护,除了造成磁盘空间上的浪费以外,同步服务启动时,字典文件中过多的版本也拖慢同步服务的启动速度,所以在源端数据同步系统中加入检查点调度线程,定时的更新同步检查点的LSN,然后使用该LSN来清理和维护字典文件,包括删除无效的字典文件和清理单个字典文件中失效的对像定义版本,可以使字典系统保持在一个高效的运行状态。
实施例2:
在本实施例中,以一具体实例简要说明前述方法的执行过程,举例如下:
源数据库顺序执行下面操作:
CREATE TABLE T1(C INT);
INSERT INTO T1(C)VALUES(1);
ALTER TABLE T1 ADD C1 INT;
INSERT INTO T1(C)VALUES(2);
ALTER TABLE T1 ADD C2 INT;
INSERT INTO T1(C)VALUES(3);
DROP TABLE T1;
上述操作在源端日志流中会生成下列事务:
事务编号 |
操作 |
TRX1(LSN=1) |
CREATE(T1),对像ID=1000 |
TRX2(LSN=2) |
INSERT(C=1) |
TRX3(LSN=3) |
ALTER(ADD C1) |
TRX4(LSN=4) |
INSERT(C=2) |
TRX5(LSN=5) |
ALTER(ADD C2) |
TRX6(LSN=6) |
INSERT(C=3) |
TRX7(LSN=7) |
DROP(T1) |
假设无效版本占比为50%便需要清理,字典维护过程如下:
(1)检查点调度线程定时从目的端获取同步检查点LSN1并负责清理带有删除标记的离线字典文件。
(2)日志分析线程解析到表对像T1的CREATE操作,创建一个离线字典文件1000.dct。
(3)解析完CREATE操作,把表T1的对像定义写入离线字典文件,离线字典文件的数据结构如图3所示。
(4)日志分析线程解析INSERT操作,此时该操作对应的LSN为2,在离线字典文件中取到LSN=1的版本进行日志解析。
(5)日志分析线程解析到表对像T1的ALTER操作,如果此时同步检查点的LSN为1,那么就会采用追加的形式来维护离线字典文件,离线字典文件的数据结构如图4所示。
(6)日志分析线程解析INSERT操作,此时该操作对应的LSN为4,在离线字典文件中取到LSN=3的版本进行日志解析。
(7)日志分析线程解析到表对像T1的ALTER操作,如果此时同步检查点的LSN为4,检查离线字典文件中失效的版本占比为50%,需要通过创建离线字典文件1000.dct_bak来删除失效的版本,离线字典文件的数据结构如图5所示,其中,位于图5左侧的是旧的离线字典文件的数据结构,位于图5右侧的是新的离线字典文件的数据结构。
(8)使用新的离线字典文件1000.dct_bak替换掉旧离线字典文件1000.dct,然后再追加当前ALTER操作修改以后形成的新的版本,离线字典文件的数据结构如图6所示。
(9)日志分析线程解析INSERT操作,此时该操作对应的LSN为6,在离线字典文件中取到LSN=5的版本进行日志解析。
(10)日志分析线程解析到表对像T1的DROP操作,此时需要在离线字典文件中打上删除标记,并标注删除操作的LSN为7。形成如下结构:
(11)检查点调度线程在获取到同步检查点的LSN大于7时,就会删除1000.dct的离线字典文件,完成表T1对像整个过程的字典维护管理。
实施例3:
请参阅图8,图8是本发明实施例提供的一种数据同步系统的结构示意图。本实施例的数据同步系统包括一个或多个处理器41以及存储器42。其中,图8中以一个处理器41为例。
处理器41和存储器42可以通过总线或者其他方式连接,图8中以通过总线连接为例。
存储器42作为一种基于数据同步方法的非易失性计算机可读存储介质,可用于存储非易失性软件程序、非易失性计算机可执行程序以及模块,上述实施例的方法以及对应的程序指令。处理器41通过运行存储在存储器42中的非易失性软件程序、指令以及模块,从而执行各种功能应用以及数据处理,实现前述实施例的方法。
其中,存储器42可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实施例中,存储器42可选包括相对于处理器41远程设置的存储器,这些远程存储器可以通过网络连接至处理器41。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
值得说明的是,上述装置和系统内的模块、单元之间的信息交互、执行过程等内容,由于与本发明的处理方法实施例基于同一构思,具体内容可参见本发明方法实施例中的叙述,此处不再赘述。
本领域普通技术人员可以理解实施例的各种方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:只读存储器(Read Only Memory,简写为ROM)、随机存取存储器(RandomAccessMemory,简写为RAM)、磁盘或光盘等。
本领域的技术人员容易理解,以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。