掌桥专利:专业的专利平台
掌桥专利
首页

一种日志解析同步事务存储的方法及设备

文献发布时间:2023-06-19 18:37:28


一种日志解析同步事务存储的方法及设备

技术领域

本发明涉及计算机技术领域,特别是涉及一种日志解析同步事务存储的方法及设备。

背景技术

目前基于数据库日志解析的异构数据库复制技术应用广泛。这种技术在源端捕获出数据库的增量数据,然后发送到目标端,在目标端通过通用的数据库访问接口,将增量数据应用到目标数据库,实现数据复制。这种技术因为使用到通用数据库接口,因此支持异构数据库系统复制,支持异构操作系统环境,并且目标端备机数据库系统可读写,是一种“双活”系统。

基于数据库日志解析实时同步运行时,经常会遇到由于目的数据库事务执行过慢,导致源数据库日志解析组件发送事务封装消息包阻塞的问题。同时,源数据库日志解析组件事务封装消息发送模块无法发送时,源数据库归档日志就不可以被清理,这样就导致源数据库占用大量的磁盘空间;最为严重的情况下,会导致磁盘空间被占满,源数据库无法正常对外提供服务,因此,目的数据同步服务如何高效的存储这些解析后的事务操作就成为业界亟待解决的重要技术问题。

鉴于此,如何克服现有技术所存在的缺陷,解决上述技术问题,是本技术领域待解决的难题。

发明内容

针对现有技术的缺陷或改进需求:数据同步在目标端同步事务时,由于受到目标端数据库同步性能的影响,目标端数据同步服务接收到的同步操作不能及时入库,就需要对这些未能及时入库的操作存储到磁盘,以避免在目标端数据库同步性能不足时造成源端数据库归档日志大量堆积,从而影响到源端数据库运行的安全。

本发明提供一种日志解析同步事务存储的方法及设备,在数据同步中同步数据是以事务为单位的,因此目标端数据同步服务在存储事务时,需对接收到的日志操作先以事务为单位进行整理,已经提交的事务(已经收到提交操作的事务)按事务的提交LSN大小为顺序存放到已提交事务链表,未提交的事务按事务的起始LSN大小为顺序存放到活动事务链表;然后根据检查点的LSN,以事务为单位把已经提交事务链表中提交操作LSN小于等于检查点LSN的事务操作以及事务信息存储到检查点文件,再把活动事务链表中的事务操作以及事务信息存储到检查点文件,并根据存储的活动事务个数标记检查点文件的引用计数,如无活动事务则标记该检查点文件的最大事务提交LSN后完成操作的存储。在清理检查点文件时,根据已同步完成事务的最大LSN,从检查点文件链表中判断检查点文件的最大事务提交LSN,删除比已同步完成事务的最大LSN小于或等于的检查点文件。

本发明实施例采用如下技术方案:

第一方面,本发明提供了一种日志解析同步事务存储的方法,包括:

在目标端部署数据同步服务,当接收源端发送的下一个日志操作时,根据操作类型作相应处理;

判断当前所有操作内存占用是否大于设定的内存占用值,若大于则触发检查点保存操作:采用最近一次接收到日志操作的LSN,把该LSN设置为当前检查点LSN,对接收的事务操作进行存储;

目标端数据同步服务从检查点文件中提取已经提交的事务,按事务的提交LSN大小顺序进行同步,每同步完一个检查点文件时,根据最后一个同步完成事务的提交LSN去清理检查点文件链表中的检查点文件。

进一步的,所述在目标端部署数据同步服务时,目标端数据同步服务负责接收源端发送过来的日志操作,每个日志操作中都包含了操作的LSN和操作的事务ID信息,目标端数据同步服务初始化以下信息:

已提交事务链表,用于存放已经接收到提交操作的事务,这些事务根据事务提交操作的LSN大小顺序存放;

活动事务链表,用于存放未接收到提交操作的事务,这些事务根据事务第一个操作的LSN大小顺序存放;

设定一个触发操作保存检查点的内存占用值,用于当接收的操作占用内存达到这个内存占用值时,启动检查点保存当前内存中的事务操作。

进一步的,所述接收源端发送的下一个日志操作时,根据操作类型作相应处理具体包括:

如果操作是提交或回滚操作,检查当前事务T是否有归属的检查点文件,如果有,则把检查点文件活动事务引用计数减1,当检查点引用计数减为0时,把当前操作的LSN更新为检查点文件的最大事务提交LSN;

如果操作是部分回滚操作,检查当前事务是否有归属的检查点文件,如果有,则说明这个事务之前的操作已经被缓存到了检查点文件中,在检查点文件中删除需要回滚的操作,取得当前事务在检查点文件中最后一条记录的存储地址,沿着记录的链表向前遍历,删除链表中操作ID大于等于部分回滚操作ID的记录,并把删除后事务在检查点文件中最后一条记录的存储地址更新到检查点文件中去;

如果是其它操作类型,则不做检查点文件的处理。

进一步的,所述检查点保存操作:采用最近一次接收到日志操作的LSN,把该LSN设置为当前检查点LSN,对接收的事务操作进行存储具体包括:

创建一个检查点文件A,检查点文件命名时以检查点LSN的值来命名,并把文件A的空间从0到N1部分初始化为0,并标记为文件头;

收集活动事务集合,在检查点文件A中进行活动事务空间的预留,也即N1到N2活动事务预留区;收集已提交事务集合,在检查点文件A中进行已提交事务空间的预留,也即N2到N3已提交事务预留区;

分别从已提交事务集合中依次提取事务、从活动事务集合中依次提取事务,并存储到事务对应的检查点文件中;

保存活动事务信息到检查点文件A中的N1到N2活动事务预留区,保存已提交事务信息到检查点文件A中的N2到N3已提交事务预留区;

把检查点LSN、活动事务存储区信息N1到N2和已提交事务存储区信息N2到N3保存到检查点文件A的文件头中;

完成这个检查点文件A的存储动作,释放已经保存的事务所占内存空间;

下一个检查点触发后,采用检查点保存操作的方式保存检查点文件B,并以此类推,按检查点LSN大小的顺序形成一个检查点文件链表,以完成目标端数据同步服务对事务信息以及事务操作的存储。

进一步的,所述收集活动事务集合,在检查点文件A中进行活动事务空间的预留;收集已提交事务集合,在检查点文件A中进行已提交事务空间的预留具体包括:

收集活动事务,采用检查点LSN遍历活动事务链表,把事务的起始LSN小于等于检查点LSN的事务都收集到活动事务集合;采用检查点LSN遍历已提交事务链表,把事务的起始LSN小于等于检查点LSN并且事务的提交LSN大于检查点LSN的事务都收集到活动事务集合,收集完成以后对活动事务集合中的事务进行去重;

计算存储活动事务信息需要的空间大小K字节,K=单个活动事务信息占用字节*活动事务个数,并在检查点文件A中进行空间预留,设N2=N1+K,把N1到N2部分预留为活动事务空间;

收集已提交事务,采用检查点LSN遍历已提交事务链表,把事务提交LSN小于等于检查点LSN的事务收集到已提交事务集合;

计算存储已提交事务信息需要的空间大小G字节,G=单个事务信息占用字节*事务个数,并在检查点文件A中进行空间预留,设N3=N2+G,把N2到N3部分预留为已提交事务空间。

进一步的,所述分别从已提交事务集合中依次提取事务、从活动事务集合中依次提取事务,并存储到事务对应的检查点文件中具体包括:

从已提交事务集合中依次提取事务,从事务信息中确定该事务存储的检查点文件X,如果该事务没有记录检查点文件信息,则把当前检查点文件A作为该事务存储的检查点文件X,把事务的操作以双向链表的形式追加到检查点文件X中偏移N3开始的空间中,并把第一条操作的存储地址记录到事务信息中;

从活动事务集合中依次提取事务,从事务信息中确定该事务存储的检查点文件X,如果该事务没有记录检查点文件信息,则把当前检查点文件A作为该事务存储的检查点文件X,把事务中操作LSN小于等于检查点LSN的操作以双向链表的形式存储到检查点文件X中,存储的位置在已提交事务操作后面以追加的形式存放,并把第一条和最后一条操作的存储地址以及当前检查点文件X的信息记录到事务信息中。

进一步的,所述保存活动事务信息到检查点文件A中的N1到N2活动事务预留区,保存已提交事务信息到检查点文件A中的N2到N3已提交事务预留区具体包括:

保存活动事务信息到检查点文件A中的N1到N2活动事务预留区,如果活动事务的检查点文件指向当前检查点文件A,则每保存一个活动事务都需要为检查点文件A的活动事务引用计数加1,并把检查点文件的最大事务提交LSN设为无穷大;

保存已提交事务信息到检查点文件A中的N2到N3已提交事务预留区,判断当前检查点文件A的活动事务引用计数是否为0,如果是,则把检查点文件的最大事务提交LSN设为保存的已提交事务中最大提交LSN。

进一步的,当目标端数据同步服务故障重启时,加载所有的检查点文件,根据检查点文件设置恢复点,并根据恢复点实现故障恢复功能;具体的:

当目标端数据同步服务故障重启时,加载所有的检查点文件,把检查点文件按文件名中的LSN值大小排序;

读取检查点文件链表中最后一个检查点文件头,提取保存的检查点LSN,如果检查点LSN不为0,则把该检查点文件作为恢复点;否则丢弃该检查点文件,取它上一个检查点文件作为恢复点;

读取作为恢复点的检查点文件中的LSN,并通过读取检查点文件N1到N2的活动事务空间中的事务信息还原到活动事务链表,每还原一个活动事务都把该事务指向的检查点文件活动事务引用计数加1,然后继续接收源端发送的事务操作,对比操作的LSN和恢复点检查点文件中的LSN大小,只接收操作LSN大于检查点文件中的LSN操作,实现故障恢复功能。

进一步的,在清理检查点文件时,根据同步完事务的最大提交LSN,将该LSN和检查点文件链表中的每个检查点文件的最大事务提交LSN进行对比,当该LSN大于或等于检查点文件的最大事务提交LSN时,表示该检查点文件已经同步完成,从而进行清理。

另一方面,本发明提供了一种日志解析同步事务存储的设备,具体为:包括至少一个处理器和存储器,至少一个处理器和存储器之间通过数据总线连接,存储器存储能被至少一个处理器执行的指令,指令在被处理器执行后,用于完成第一方面中的日志解析同步事务存储的方法。

与现有技术相比,本发明的有益效果在于:在目标端数据同步服务接收到的同步操作不能及时入库时,可以将这些未能及时入库的操作高效无误的存储到磁盘,以避免在目标端数据库同步性能不足时造成源端数据库归档日志大量堆积,从而影响到源端数据库运行的安全。

另外,在检查点文件创建完成以后,通过收集活动事务和已提交事务的信息,计算出分别存储它们需要的空间并在检查点文件中进行预留。由于事务中操作存储的位置等信息只有在操作存储完成以后才能确定,采用这种方式可以避免事务信息存储完以后再去对已经存储的事务信息进行修改,实现事务信息一次性的批量写入。

其次,把事务操作按事务为单位依次在检查点文件后面进行追加保存,可以保证在存储事务操作时IO的连续性,以较高的IO性能存储事务操作。

再次,在保存事务操作时,需要先提取该事务上次保存的检查点文件信息,然后把事务上的操作追加到它上次存储的检查点文件中,避免事务操作跨越多个检查点文件,降低复杂度。

附图说明

为了更清楚地说明本发明实施例的技术方案,下面将对本发明实施例中所需要使用的附图作简单地介绍。显而易见地,下面所描述的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1为本发明实施例1提供的一种日志解析同步事务存储的方法流程图;

图2为本发明实施例1提供的步骤100扩展流程图;

图3为本发明实施例1提供的步骤200具体流程图;

图4为本发明实施例1提供的步骤220具体流程图;

图5为本发明实施例1提供的步骤230具体流程图;

图6为本发明实施例1提供的步骤240具体流程图;

图7为本发明实施例1提供的故障恢复的实现流程图;

图8为本发明实施例3提供的一种日志解析同步事务存储的设备结构示意图。

具体实施方式

为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。

本发明是一种特定功能系统的体系结构,因此在具体实施例中主要说明各结构模组的功能逻辑关系,并不对具体软件和硬件实施方式做限定。

此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。下面就参考附图和实施例结合来详细说明本发明。

实施例1:

本发明实施例通过对比事务操作的LSN和检查点LSN的大小,把小于等于检查点LSN的操作以事务为单位保存到对应的检查点文件中,并且在保存时要区分已提交事务和活动事务,因为已提交事务是供同步执行时使用,而活动事务则是供故障恢复时使用。

如图1所示,基于上述现实情况,本发明实施例提供一种日志解析同步事务存储的方法,具体步骤如下。

步骤100:在目标端部署数据同步服务,当接收源端发送的下一个日志操作时,根据操作类型作相应处理。

步骤200:判断当前所有操作内存占用是否大于设定的内存占用值,若大于则触发检查点保存操作:采用最近一次接收到日志操作的LSN,把该LSN设置为当前检查点LSN,对接收的事务操作进行存储。在该步骤中进行内存占用值判断时,如果当前所有操作内存占用不大于内存占用值,则继续接收下一个日志操作。

步骤300:目标端数据同步服务从检查点文件中提取已经提交的事务,按事务的提交LSN大小顺序进行同步,每同步完一个检查点文件时,根据最后一个同步完成事务的提交LSN去清理检查点文件链表中的检查点文件。

具体的,在本优选实施例的一种实施方式中,步骤100中部署的目标端数据同步服务负责接收源端发送过来的日志操作,每个日志操作中都包含了操作的LSN和操作的事务ID等信息,目标端数据同步服务初始化以下信息:

已提交事务链表,用于存放已经接收到提交操作的事务,这些事务根据事务提交操作的LSN大小顺序存放;

活动事务链表,用于存放未接收到提交操作的事务,这些事务根据事务第一个操作的LSN大小顺序存放;

设定一个触发操作保存检查点的内存占用值N,用于当接收的操作占用内存达到这个内存占用值N时,启动检查点保存当前内存中的事务操作。

如图2所示,在本优选实施例的一种实施方式中,步骤100中所述接收源端发送的下一个日志操作时,根据操作类型作相应处理具体包括如下步骤(首先按事务ID归类到它所属的事务T,检查当前的日志操作类型,根据操作类型作下列处理):

步骤101:如果操作是提交或回滚操作,检查当前事务T是否有归属的检查点文件,如果有,则把检查点文件活动事务引用计数减1,当检查点引用计数减为0时,把当前操作的LSN更新为检查点文件的最大事务提交LSN。

步骤102:如果操作是部分回滚操作,检查当前事务是否有归属的检查点文件,如果有,则说明这个事务之前的操作已经被缓存到了检查点文件中,需要在检查点文件中删除需要回滚的操作,取得当前事务在检查点文件中最后一条记录的存储地址,沿着记录的链表向前遍历,删除链表中操作ID大于等于部分回滚操作ID的记录,并把删除后事务在检查点文件中最后一条记录的存储地址更新到检查点文件中去。

步骤103:如果是其它操作类型,则不做检查点文件的处理。

如图3所示,在本优选实施例的一种实施方式中,步骤200中所述检查点保存操作:采用最近一次接收到日志操作的LSN,把该LSN设置为当前检查点LSN,对接收的事务操作进行存储具体包括如下步骤:

步骤210:创建一个检查点文件A,检查点文件命名时以检查点LSN的值来命名,以便对检查点文件进行快速排序,并把文件A的空间从0到N1部分初始化为0,并标记为文件头。

步骤220:收集活动事务集合,在检查点文件A中进行活动事务空间的预留,也即N1到N2活动事务预留区;收集已提交事务集合,在检查点文件A中进行已提交事务空间的预留,也即N2到N3已提交事务预留区。

步骤230:分别从已提交事务集合中依次提取事务、从活动事务集合中依次提取事务,并存储到事务对应的检查点文件中。

步骤240:保存活动事务信息到检查点文件A中的N1到N2活动事务预留区,保存已提交事务信息到检查点文件A中的N2到N3已提交事务预留区。

步骤250:把检查点LSN、活动事务存储区信息N1到N2和已提交事务存储区信息N2到N3保存到检查点文件A的文件头中。

步骤260:完成这个检查点文件A的存储动作,释放已经保存的事务所占内存空间。

步骤270:下一个检查点触发后,采用检查点保存操作的方式(也即重复步骤200的所有步骤)保存检查点文件B,并以此类推,按检查点LSN大小的顺序形成一个检查点文件链表,以完成目标端数据同步服务对事务信息以及事务操作的存储。

如图4所示,在本优选实施例的一种实施方式中,步骤220中所述收集活动事务集合,在检查点文件A中进行活动事务空间的预留;收集已提交事务集合,在检查点文件A中进行已提交事务空间的预留具体包括如下步骤:

步骤221:收集活动事务,采用检查点LSN遍历活动事务链表,把事务的起始LSN小于等于检查点LSN的事务都收集到活动事务集合;采用检查点LSN遍历已提交事务链表,把事务的起始LSN小于等于检查点LSN并且事务的提交LSN大于检查点LSN的事务都收集到活动事务集合,收集完成以后对活动事务集合中的事务进行去重。

该步骤中之所以要去重,是因为在收集完活动事务链表以后,这些活动事务在后续的运行中接收到提交消息后会被加入到已提交事务链表,导致后续在已提交事务链表中收集活动事务时存在重复收集到相同事务的情况(活动事务是以检查点LSN作为条件来定的,由于在确定完检查点LSN后,目标端的数据同步依然在收集源端发过来的操作,那么原先在收集时存在于活动事务链表中的事务会在接收到提交操作以后被移到已提交事务链表中,但是这个事务相对于当前检查点LSN来说,它还是属于活动事务)。另外,在收集时必须先从活动事务链表开始收集,因为如果先从已提交事务链表收集,那么在收集完该链表后再切换到活动事务链表,在收集活动事务链表过程中有些事务可能会因接收到提交操作而被移到已提交事务链表,导致遗漏。

步骤222:计算存储活动事务信息需要的空间大小K字节,K=单个活动事务信息占用字节*活动事务个数,并在检查点文件A中进行空间预留,设N2=N1+K,把N1到N2部分预留为活动事务空间。

在收集活动事务时不能边收集边存储,因为事务操作存放的起始偏移(起始偏移指的是这个事务存储在检查点文件中的偏移地址,从检查点文件的第几个字节处开始存)还未确定,所以先预留出空间,待事务操作存储完成以后标记出事务的记录位置再保存活动事务信息。

步骤223:收集已提交事务,采用检查点LSN遍历已提交事务链表,把事务提交LSN小于等于检查点LSN的事务收集到已提交事务集合。

步骤224:计算存储已提交事务信息需要的空间大小G字节,G=单个事务信息占用字节*事务个数,并在检查点文件A中进行空间预留,设N3=N2+G,把N2到N3部分预留为已提交事务空间。

如图5所示,在本优选实施例的一种实施方式中,步骤230中所述分别从已提交事务集合中依次提取事务、从活动事务集合中依次提取事务,并存储到事务对应的检查点文件中具体包括如下步骤:

步骤231:从已提交事务集合中依次提取事务,从事务信息中确定该事务存储的检查点文件X,如果该事务没有记录检查点文件信息,则把当前检查点文件A作为该事务存储的检查点文件X,把事务的操作以双向链表的形式追加到检查点文件X中偏移N3开始的空间(指紧接着检查点文件存储预留已经提交事务信息空间后的空间)中,并把第一条操作的存储地址记录到事务信息中,以便在提取这个事务时,可以通过这个地址找到该事务的第一个操作进行遍历。

已提交事务如果在上个检查点中作为活动事务的角色已经保存过操作,那么它的事务信息中便会保存有上次存储的检查点文件信息,这种情况下为了保证单个事务操作存储不跨文件,这次检查点存储时依然要把该事务后续的操作保存到上个检查点文件中。

步骤232:从活动事务集合中依次提取事务,从事务信息中确定该事务存储的检查点文件X,如果该事务没有记录检查点文件信息,则把当前检查点文件A作为该事务存储的检查点文件X,把事务中操作LSN小于等于检查点LSN的操作以双向链表的形式存储到检查点文件X中,存储的位置在已提交事务操作后面以追加的形式存放,并把第一条和最后一条操作的存储地址以及当前检查点文件X的信息记录到事务信息中。

存储活动事务的操作和已提交事务的操作区别在于:活动事务由于还未收到提交操作,这个事务存在不确定因素,可能有部分回滚的动作,在发生部分回滚时,需要通过最后一个操作向前回滚,所以活动事务操作要采用双向链表的形式保存,保存最后一个操作的地址到事务信息中;而已提交事务则没有向前回滚的需求,在存储时不需要保存最后一个操作的地址;而在事务信息中记录检查点文件X的信息则是为了下个检查点存储时该事务后续新增的操作能够记录到检查点文件X中,确保单个事务的操作不会存在跨文件现像。

如图6所示,在本优选实施例的一种实施方式中,步骤240中所述保存活动事务信息到检查点文件A中的N1到N2活动事务预留区,保存已提交事务信息到检查点文件A中的N2到N3已提交事务预留区具体包括如下步骤:

步骤241:保存活动事务信息到检查点文件A中的N1到N2活动事务预留区,如果活动事务的检查点文件指向当前检查点文件A,则每保存一个活动事务都需要为检查点文件A的活动事务引用计数加1,并把检查点文件的最大事务提交LSN设为无穷大。

步骤242:保存已提交事务信息到检查点文件A中的N2到N3已提交事务预留区,判断当前检查点文件A的活动事务引用计数是否为0,如果是,则把检查点文件的最大事务提交LSN设为保存的已提交事务中最大提交LSN。如果不为0,检查点文件的最大事务提交LSN设定为无穷大,这样就不会被清理。

在本优选实施例的一种实施方式中,当目标端数据同步服务故障重启时,加载所有的检查点文件,根据检查点文件设置恢复点,并根据恢复点实现故障恢复功能。具体的,如图7所示,上述故障恢复的实现具体包括如下步骤:

步骤401:当目标端数据同步服务故障重启时,加载所有的检查点文件,把检查点文件按文件名中的LSN值大小排序。

步骤402:读取检查点文件链表中最后一个检查点文件头,提取保存的检查点LSN,如果检查点LSN不为0,则把该检查点文件作为恢复点;否则丢弃该检查点文件,取它上一个检查点文件作为恢复点。

步骤403:读取作为恢复点的检查点文件中的LSN,并通过读取检查点文件N1到N2的活动事务空间中的事务信息还原到活动事务链表,每还原一个活动事务都把该事务指向的检查点文件活动事务引用计数加1,然后继续接收源端发送的事务操作,对比操作的LSN和恢复点检查点文件中的LSN大小,只接收操作LSN大于检查点文件中的LSN操作,实现故障恢复功能。

在本优选实施例的一种实施方式中,步骤300中在清理检查点文件时,需要根据同步完事务的最大提交LSN,将该LSN和检查点文件链表中的每个检查点文件的最大事务提交LSN进行对比,当该LSN大于或等于检查点文件的最大事务提交LSN时,表示该检查点文件已经同步完成,从而可以进行清理。

通过上述方案来存储事务时,把两个相邻检查点LSN区间之内的已提交事务信都存储在同一个检查点文件中,这样在事务同步入库时,只要按照检查点文件LSN的大小顺序依次加载入库,即可以保证事务入库的顺序性和数据的一致性。

综上所述,本实施例在目标端数据同步服务接收到的同步操作不能及时入库时,可以将这些未能及时入库的操作高效无误的存储到磁盘,以避免在目标端数据库同步性能不足时造成源端数据库归档日志大量堆积,从而影响到源端数据库运行的安全。

另外,在检查点文件创建完成以后,通过收集活动事务和已提交事务的信息,计算出分别存储它们需要的空间并在检查点文件中进行预留。由于事务中操作存储的位置等信息只有在操作存储完成以后才能确定,采用这种方式可以避免事务信息存储完以后再去对已经存储的事务信息进行修改,实现事务信息一次性的批量写入。

其次,把事务操作按事务为单位依次在检查点文件后面进行追加保存,可以保证在存储事务操作时IO的连续性,以较高的IO性能存储事务操作。

再次,在保存事务操作时,需要先提取该事务上次保存的检查点文件信息,然后把事务上的操作追加到它上次存储的检查点文件中,避免事务操作跨越多个检查点文件,降低复杂度。

实施例2:

基于实施例1提供的日志解析同步事务存储的方法,本实施例2通过一个具体的应用场景来对本发明进行更详细的说明。

上述方案举例如下:

源数据库有表T1(ID VARCHAR)

源端有三个事务对表T1进行如下操作:

TRX1:INSERT INTO T1(ID)VALUES('TRX1_1');

TRX1:SAVEPOINT A;

TRX1:INSERT INTO T1(ID)VALUES('TRX1_11');

TRX2:INSERT INTO T1(ID)VALUES('TRX2_1');

TRX2:COMMIT;

TRX1:ROLLBACK TO SAVEPOINT A;

TRX1:INSERT INTO T1(ID)VALUES('TRX1_2');

TRX3:INSERT INTO T1(ID)VALUES('TRX3_1');

TRX3:COMMIT;

TRX1:COMMIT;

上述操作的顺序在目的端日志接收线程在接收到后会形成下面编号表格中的情况:

存储检查点过程如下:

1、当接收并保存完LSN为4的操作后,触发检查点,此时设检查点LSN为4,活动事务链表中存在事务{TRX1};已提交事务链表中存在事务{TRX2}。

2、创建检查点文件A并完成文件头的预留和初始化:

3、在活动事务链表和已提交事务链表中筛选出事务起始LSN小于等于4的事务存放入活动事务集合,TRX1满足条件。并计算出存储TRX1事务信息需要预留的空间并进行预留。

4、在已提交事务链表中筛选出事务提交LSN小于等于4的事务存放入已提交事务集合,TRX2满足条件。并计算出存储TRX2事务信息需要预留的空间并进行预留。

5、从已提交事务集合中依次提取事务,把事务TRX2的事务操作以追加的形式存入到N3后面的检查点文件中。

其中N3空间中记录1和2两条记录之间存在着双向操作链表的指针信息。

6、从活动事务集合中依次提取事务,把事务TRX1的事务操作以追加的形式存入到N3后面的检查点文件中。

7、保存活动事务信息到检查点文件A中的N1到N2活动事务预留区,并把检查点文件A的活动事务引用计数加1(有几个活动事务就加几)。

8、保存已提交事务信息到检查点文件A中的N2到N3已提交事务预留区,由于检查点文件A的活动事务引用计数不为0,则该检查点文件的最大事务提交LSN为无穷大。

9、把检查点LSN、活动事务存储区信息N1到N2和已提交事务存储区信息N2到N3保存到检查点文件A的文件头中。

10、当前收到LSN为5的部分回滚操作时,根据规则,要针对TRX1在检查点文件A中保存的日志记录进行删除,形成下面状态:

11、当接收并保存完LSN为8的操作后,触发检查点,此时设检查点LSN为8,活动事务链表中存在事务{TRX1};已提交事务链表中存在事务{TRX3}。

创建检查点文件B,并按上述方案形成下面两个检查点文件A和B:

检查点文件A:

当检查点LSN为8时,TRX1仍然是活动事务,所以它的操作会被存储到事务信息中指向的检查点文件A中,防止事务操作跨文件存储,并且操作记录3和4之间存在双向链表指针。

检查点文件B:

当检查点LSN为8时,TRX1仍然是活动事务,所以它的操作会被存储到事务信息中指向的检查点文件A中,检查点文件A的活动事务引用计数依然为1,最大事务提交LSN则为无穷大,而在检查点文件B中没有存储TRX1事务的操作也没有活动事务信息,此时检查点文件B的活动事务引用计数为0,则它的最大事务提交LSN为8。

12、当检查点B完成以后,重启恢复,加载检查点文件A和B并按检查点LSN的大小排序形成{A,B}的检查点文件链表。

13、取检查点文件链表最一个检查点文件B,读取它的文件头并核验检查点LSN的有效性。

14、加载检查点文件B的N1-N2活动事务信息,把TRX1还原到活动事务链表,并把检查点文件A的活动事务引用计数加1。需要说明的是,还原的时候程序是重启的,之前保留的计数在重启以后都会被清零,所以这里还需要将检查点文件A的活动事务引用计数加1。

15、只接收源端发送日志LSN大于8的操作日志。

16、接收到操作LSN为9的TRX1事务提交操作,由于TRX1指向检查点文件A,则把检查点文件A的活动事务引用计数减1,当引用计数为0时,需要更新检查点文件A的最大事务提交LSN为当前操作的LSN,此时检查点文件A的最大事务提交LSN为9,然后把事务TRX1移到已提交事务链表。

17、同步服务按事务提交顺序依次执行TRX2,TRX3和TRX1,当执行完TRX3时,使用它的提交LSN 8去清理检查点文件,此时检查点文件链表中的检查点文件A的最大事务提交LSN为9,大于清理LSN 8,所以不能清,而检查点文件B的最大事务提交LSN为8,小于等于LSN8,则可以清除。

实施例3:

在上述实施例1至实施例2提供的日志解析同步事务存储的方法的基础上,本发明还提供了一种可用于实现上述方法的日志解析同步事务存储的设备,如图8所示,是本发明实施例的设备架构示意图。本实施例的日志解析同步事务存储的设备包括一个或多个处理器21以及存储器22。其中,图8中以一个处理器21为例。

处理器21和存储器22可以通过总线或者其他方式连接,图8中以通过总线连接为例。

存储器22作为一种非易失性计算机可读存储介质,可用于存储非易失性软件程序、非易失性计算机可执行程序以及模块,如实施例1至实施例2中的日志解析同步事务存储的方法、系统。处理器21通过运行存储在存储器22中的非易失性软件程序、指令以及模块,从而执行日志解析同步事务存储的设备的各种功能应用以及数据处理,即实现实施例1至实施例2的日志解析同步事务存储的方法。

存储器22可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实施例中,存储器22可选包括相对于处理器21远程设置的存储器,这些远程存储器可以通过网络连接至处理器21。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。

程序指令/模块存储在存储器22中,当被一个或者多个处理器21执行时,执行上述实施例1至实施例2中的日志解析同步事务存储的方法,例如,执行以上描述的图1至图7所示的各个步骤。

本领域普通技术人员可以理解实施例的各种方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:只读存储器(ReadOnlyMemory,简写为:ROM)、随机存取存储器(RandomAccessMemory,简写为:RAM)、磁盘或光盘等。

以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。

技术分类

06120115638225