一种基于日志解析同步的事务操作合并执行方法及装置
【技术领域】
本发明涉及计算机技术领域,尤其涉及一种基于日志解析同步的事务操作合并执行方法及装置。
【背景技术】
传统的基于数据库自身的主备机制实现数据库数据的实时复制,是进行数据容灾备份、保障数据安全的重要解决方案。目前如ORACLE公司的DataGuard、达梦数据库的DM7主备产品等都是实现这种解决方案的成熟商业化产品。数据库主备机制下,一般备机作为备份节点,只提供只读访问,可以在备机上做一些报表分析、数据挖掘等只读访问的应用,而不能像主机一样提供读写访问。另外,数据库主备机制要求备机数据库系统和主机一致,对于异构数据库系统环境,则不能利用数据库自身的主备机制实现有效的数据实时复制。
针对数据库主备机制实现数据复制的不足,目前基于软件的异构数据库复制技术应用广泛。这种技术在源端捕获出数据库的增量数据,然后发送到目标端,在目标端通过通用的数据库访问接口将增量数据应用到目标数据库,实现数据复制。这种技术因为使用到通用数据库接口,因此支持异构数据库系统复制,支持异构操作系统环境,并且目标端备机数据库系统可读写,是一种“双活”系统。
目前,有多种技术方式实现获取源端数据库的增量数据,其中,基于数据库日志捕获分析的数据实时同步技术,因其对源数据库侵入性小、捕获分析性能高,得到较大发展及研究。这种技术通过分析源数据库归档或联机日志,捕获出数据库的INSERT、UPDATE、DELETE操作日志,然后发送到目标端;目标端对日志信息进行逆向生成,恢复成SQL语句方式,然后使用数据库通用接口应用到目标数据库,实现数据复制。因此,在数据库实时复制过程中,目标端的执行效率是影响数据同步性能的重要因素。
通常,源端数据库上并发执行的各个事务中可能存在各种规模,数据库系统都会根据并发控制机制去执行,把相冲突的事务操作互斥执行,并且在日志文件中顺序的记录下各个事务的操作日志;数据同步时应该针对小事务采用事务合并执行的策略,把源端多次执行的操作合并以后批量执行,以便提升同步性能。然而,现有的数据同步系统往往是以事务为单位进行同步的,在确定事务提交以后才会被分配到执行线程执行;在这种机制下,事务合并的方法往往采取事务追加的方式进行合并,这种合并策略虽然可以解决部分的应用场景下同步效率的问题,但是事务合并以后事务之间的操作合并效率以及操作合并率并不高,目标端的执行效率仍较低,无法有效提升同步性能。
为解决上述问题,在事务合并时可采用按各个事务的提交LSN作为分割线的方式来合并事务之间的操作,把待合并事务在同一个分割区间内相同的操作合并在一起执行。然而,由于合并的事务规模有大有小,如果事务规模较小,待合并的操作都缓存在内存中,可以采用先把事务操作合并好后再执行;而如果事务规模较大,有些事务的操作已经被缓存到磁盘,这时采用边执行边合并的方式则会更加高效。因此,如何基于上述原理高效地合并这些待执行的事务操作,提高事务之间操作的合并率就成为业界亟待解决的重要技术问题。
【发明内容】
本发明需要解决的技术问题是:
现有的数据同步系统往往是以事务为单位进行同步,采取简单的叠加进行事务合并,事务之间的操作合并率并不高,目标端的执行效率仍较低,无法有效提升同步性能;因此,如何高效地合并待执行的事务操作,提高事务之间操作的合并率是本发明所要解决的重要技术问题。
本发明通过如下技术方案解决上述技术问题:
第一方面,本发明提供了一种基于日志解析同步的事务操作合并执行方法,合并过程中采用待执行操作链表来缓存具有相同操作信息的操作,则方法包括:
取多个待合并的事务并按事务提交顺序存放至待合并事务链表中;
从待合并事务链表中提取基准事务的基准操作的操作信息以及基准事务的提交LSN;其中,所述基准事务依次取为待合并事务链表中现存待合并的第一个事务,所述基准操作依次取为所述基准事务中现存待合并的第一个操作;
以所述基准事务和所述基准操作为基准,依次判断所述待合并事务链表中基准事务后续各事务的当前操作是否满足合并条件,如果满足则将当前操作添加到待执行操作链表中;
其中,所述满足合并条件是指:当前操作与所述基准操作的操作信息一致,且LSN小于所述基准事务的提交LSN;当所述当前操作满足合并条件但与待执行操作链表中操作的操作信息不一致时,则批量执行并清空待执行操作链表中的操作后,再将当前操作添加到待执行操作链表中。
优选地,每当添加一个操作至所述待执行操作链表中后,判断所述待执行操作链表中的操作数是否达到预设的操作规模;如果达到预设的操作规模,则批量执行并清空所述待执行操作链表中的操作。
优选地,所述取多个待合并的事务并按事务提交顺序存放至待合并事务链表中,具体包括:
源端数据库同步系统从源端数据库读取日志后,按捕获日志的顺序进行日志解析,并将解析以后的操作按顺序发送到目的端数据库同步系统;
目的端数据库同步系统接收到源端的操作后,以事务为单位进行管理,并按事务提交的先后顺序将接收到的事务添加到待执行事务链表;
根据配置的事务合并后操作的规模大小,从所述待执行事务链表中取出多个已提交的事务添加到待合并事务链表。
优选地,所述待合并事务链表中的每个事务分别配套有一个操作游标,用于指示事务在进行操作合并时当前操作在该事务中的位置;
则所述从待合并事务链表中提取基准事务的基准操作的操作信息以及基准事务的提交LSN,具体包括:
初始化所述待合并事务链表中每个事务的操作游标指向对应事务中的第一个操作;
将所述待合并事务链表中当前待合并的第一个事务设置为基准事务,将基准事务的操作游标所指向的操作设置为基准操作;
从待合并事务链表中提取基准事务的基准操作的操作信息以及基准事务的提交LSN;其中,所述操作信息包括操作涉及的表和涉及的操作类型。
优选地,所述以所述基准事务和所述基准操作为基准,依次判断所述待合并事务链表中基准事务后续各事务的当前操作是否满足合并条件,如果满足则将当前操作添加到待执行操作链表中,具体包括:
将所述待合并事务链表中的下一个事务作为当前事务,并将当前事务的操作游标所指向的操作作为当前操作;
判断当前操作是否满足合并条件,如果满足,则继续判断当前操作是否与所述待执行链表中操作的操作信息一致;
如果一致,则将当前操作添加到待执行操作链表中;如果不一致,则批量执行并清空待执行操作链表中的操作后,将当前操作添加到待执行操作链表中。
优选地,在所述将当前操作添加到待执行操作链表中之后,所述方法还包括:
将当前事务的操作游标下移到所在事务的下一个操作,并判断该操作是否为提交操作;
如果是提交操作,则将当前事务从所述待合并事务链表中移除,并将所述待合并事务链表中的下一个事务作为当前事务继续进行操作合并;
如果不是提交操作,则将当前事务中操作游标当前所指向的该操作作为当前操作,并执行所述判断当前操作是否满足合并条件。
优选地,对于所述待合并事务链表中任一待合并的事务,如果该事物的前面部分操作已经存盘,后续剩余操作缓存在内存中,则初始化该事物的操作游标指向存盘文件中第一个操作的偏移位置;
在移动操作游标时,当操作游标逐渐下移到存盘文件的末尾时,将操作游标定位到内存中的操作缓存链表上。
优选地,如果当前操作不满足合并条件,则所述方法还包括:
判断当前事务在所述待合并事务链表中是否还存在下一个事务;
如果存在,则继续将所述待合并事务链表中下一个事务作为当前事务进行操作合并;
如果不存在,则判断所述基准事务的基准操作是否与所述待执行操作链表中操作的操作信息一致;
如果一致,则将基准操作添加到待执行操作链表;如果不一致,则批量执行并清空待执行操作链表中的操作后,将基准操作添加到待执行操作链表中。
优选地,在所述将基准操作添加到待执行操作链表中之后,所述方法还包括:
将基准事务的操作游标下移到所在事务的下一个操作,并判断该操作是否为提交操作;
如果是提交操作,则将基准事务从所述待合并事务链表中移除,并将所述待合并事务链表中当前待合并的第一个事务作为基准事务继续进行操作合并;
如果不是提交操作,则将基准事务中操作游标当前所指向的该操作作为基准操作继续进行操作合并。
第二方面,本发明提供了一种基于日志解析同步的事务操作合并执行装置,包括至少一个处理器和存储器,所述至少一个处理器和存储器之间通过数据总线连接,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令在被所述处理器执行后,用于完成第一方面所述的基于日志解析同步的事务操作合并执行方法。
与现有技术相比,本发明的有益效果是:
本发明提供的一种基于日志解析同步的事务操作合并执行方法中,以先提交事务的操作为基准,以先提交事务的提交LSN作为分割界限,依次判断后提交事务的当前操作是否与基准操作一致并且LSN小于基准事务的提交LSN,进而确定是否可进行操作合并,这样就将相同的操作合并到一起,以便在执行的时候可以批量执行,提高了事务之间操作的合并率;当前操作和待执行操作链表中的操作不一致时,或待执行操作链表中的操作数达到预设规模时,则批量执行并清空待执行操作链表后再添加,从而可实现边合并边执行,与操作合并全部完成后再统一执行相比,提高了事务之间操作的合并效率,有效提高目标端数据复制的执行效率,进一步提升同步性能。
【附图说明】
为了更清楚地说明本发明实施例的技术方案,下面将对本发明实施例中所需要使用的附图作简单地介绍。显而易见地,下面所描述的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的一种基于日志解析同步的事务操作合并执行方法的流程图;
图2为本发明实施例提供的一种事务操作合并方法的具体流程图;
图3为本发明实施例提供的一种基于日志解析同步的事务操作合并执行装置的架构图。
【具体实施方式】
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。下面就参考附图和实施例结合来详细说明本发明。
实施例1:
数据同步在目标端数据库同步事务时,应该本着尽量减少和数据库交互的次数来执行操作,因为每次和数据库交互都会带来额外的开销,批量一千行执行一次插入的操作所花费时间远比执行一千次每次只插入一行花费的时间少,因此操作合并是数据同步中一项非常重要的技术。而基于日志解析同步又是以事务为单位,所以把多个小事务合并成一个大事务,然后针对该大事务中的操作合并后执行可以有效地提升同步性能。
数据库日志在把数据库中的操作写入日志时采用的是串行方式,也就是说,数据库内部并行执行的事务操作产生的日志会交替地写入到日志文件中。鉴于上述原因,假如只有一个活动事务对某个表做DML操作,那么数据库日志中将会连续地记录这个表的DML操作日志;假如有两个活动事务分别针对同一个表做DML操作,那么数据库日志中将会交替地记录这个表上两个事务的DML日志。数据同步在目标端数据库同步这两个事务时,采取事务合并的方式同步这两个事务,如果采用简单的叠加方式,在两个事务操作都是同一个操作的情况下,针对这种最理想的状态两个事务的操作可以合并成一次批量执行;但是如果这两个事务的操作是各种DML操作交替执行,那么就算事务合并了,这种采用简单叠加方式合并后事务操作之间的合并率也会比较低。
为解决上述问题,数据同步在目标端数据库同步这两个事务时,可以采取第一个事务提交LSN为界来混合这两个事务的操作,把第二个事务在第一个事务提交LSN之前的操作合并到第一个事务提交LSN之前的操作里面再执行;依次类推,如果有第三第四个事务则都可以采用相同的逻辑合并操作,按待合并的各个事务提交的LSN为分割线,对每个区间内的操作进行合并执行。本发明主要是基于上述原理实现边执行边合并,着力于解决事务合并时操作的合并效率,提高事务合并以后事务之间操作的合并率,从而有效提升同步性能。
根据上述思路,本发明实施例提供了一种基于日志解析同步的事务操作合并执行方法,如图1所示,主要包括以下步骤:
步骤201,取多个待合并的事务并按事务提交顺序存放至待合并事务链表中。
其中,每个事务涉及一张或多张表的操作,每个操作对应拥有一个日志序列号(Log Sequence Number,简写为LSN),以表征该操作的执行顺序,源端解析出的各操作会按顺序(即按LSN从小到大的顺序)发送至目的端。目的端接收到各事务的操作之后,可根据预先配置的事务合并后操作的规模大小,一次性选取多个已提交的事务作为待合并事务。为了方便操作,可预先初始化一个待合并事务链表,选择完成后将选择出的需要合并的事务添加到所述待合并事务链表;其中,所述待合并事务链表中的事务按事务的提交顺序(即提交LSN由小到大的顺序)存放。
步骤202,从待合并事务链表中提取基准事务的基准操作的操作信息以及基准事务的提交LSN;其中,所述基准事务依次取为待合并事务链表中现存待合并的第一个事务,所述基准操作依次取为所述基准事务中现存待合并的第一个操作。
所述基准事务的基准操作是用来作为操作合并的一个基准,后面每个待合并事务中的操作只有与基准操作的操作信息一致,且LSN小于所述基准事务的提交LSN才能被合并。其中,所述操作信息包括操作涉及的表和涉及的操作类型(包括插入“INSERT”、更新“UPDATE”和删除“DELETE”),操作信息一致是指操作涉及的表和涉及的操作类型都一致,操作信息一致即认为是相同操作。
在进行操作合并的过程中,每完成一个事务的操作合并后,将该事务从所述待合并事务链表中移除,即所述待合并事务链表会不断更新。那么,所述基准事务可依次取为所述待合并事务链表中现存待合并的第一个事务,所述基准操作则依次取为所述基准事务中现存待合并的第一个操作(提交操作除外)。具体地,第一轮合并以第一个事务的第一个操作为基准,第二轮合并以第一个事务的第二个操作为基准,以此类推;当第一个事务完成操作合并后,从所述待合并事务链表中删除,此时可依次将下一个事务的各操作为基准,以此类推,直至遍历完每个事务的每个操作。
为方便操作,这里可为所述待合并事务链表中的每个事务分别配套一个操作游标,并初始化每个事务的操作游标指向对应事务的第一个操作。在基准事务中,操作游标所指向的操作即为本轮的基准操作;对于同一基准事务,每完成一轮合并后,将操作游标下移到下一个操作,重新将操作游标新指向的操作作为下一轮的基准操作即可。
步骤203,以所述基准事务和所述基准操作为基准,依次判断所述待合并事务链表中基准事务后续各事务的当前操作是否满足合并条件,如果满足则将当前操作添加到待执行操作链表中。
为方便操作,可预先初始化一条待执行操作链表,用于缓存操作信息一致的操作(即相同操作),以便后续批量执行;只有满足合并条件的操作才可被添加至所述待执行操作链表中进行操作合并。其中,所述满足合并条件是指:当前操作与所述基准操作的操作信息一致,且LSN小于所述基准事务的提交LSN。另外,每当添加一个操作至所述待执行操作链表中后,判断所述待执行操作链表中的操作数是否达到预设的操作规模M;如果达到预设的操作规模M,则批量执行并清空所述待执行操作链表中的操作,以便及时释放内存,实现边合并边执行,提高整体合并效率。
上述过程实际上就是以在先提交事务的操作为基准,按照提交顺序依次对所述待合并事务链表中每个在后提交事务进行操作合并。也就是说,以任一基准操作为基准时,都需要遍历所述待合并事务链表中后续的每个事务进行操作合并;例如,第一轮合并以第一个事务的第一个操作为基准,则在该基准下需依次判断后面的第二个、第三个、第四个等所有事务的各操作是否满足合并条件,进而确定是否可进行操作合并。为方便描述,可将正在进行操作合并的在后提交事务记为当前事务,当前事务中正在进行操作合并的操作记为当前操作;对于每个在后提交事务,所述当前操作可按LSN顺序依次取为该事务中的每个操作。
在任一在后提交事务进行操作合并的过程中,如果当前操作满足合并条件且与待执行操作链表中操作的操作信息一致,则将所述当前操作添加到待执行操作链表中,然后继续将该事务的下一个操作作为当前操作进行合并;如果所述当前操作满足合并条件但与待执行操作链表中操作的操作信息不一致,则批量执行并清空待执行操作链表中的操作后,再将所述当前操作添加到待执行操作链表中,然后继续将该事务的下一个操作作为当前操作进行合并,同样也可实现边合并边执行,有效提高合并效率;如果所述当前操作不满足合并条件,则直接继续将所述待合并事务链表中下一个事务作为当前事务进行操作合并。具体的合并过程将在实施例2中展开详细介绍,在此不做赘述。
当执行线程遍历完所述待合并事务链表,意味着所述待合并事务链表中的所有事务都完成操作合并,此时如果所述待执行操作链表中还存在未执行的操作,直接批量执行,即可完成事务的合并。
本发明实施例提供的上述事务合并执行方法中,以先提交事务的操作为基准,以先提交事务的提交LSN作为分割界限,依次判断后提交事务的当前操作是否与基准操作一致并且LSN小于基准事务的提交LSN,进而确定是否可进行操作合并;这主要是基于源端数据库生成的操作在两个提交日志之间是无数据冲突的原则来合并操作,以提交日志为界,把范围内的操作按表和操作类型归类,这样就可以有效提升操作的合并率,实现批量执行以提升入库性能。
另外,当前操作和待执行操作链表中的操作不一致时,或者待执行操作链表中的操作数达到预设的操作规模时,会先批量执行并清空待执行操作链表,再继续进行操作合并,以便及时释放内存,实现边合并边执行,与操作合并全部完成后再统一执行相比,提高了事务之间操作的合并效率,有效提高目标端数据复制的执行效率,进一步提升同步性能。
实施例2:
上述实施例1中介绍了一种基于日志解析同步的事务操作合并执行方法的主要步骤,在此基础上,本发明实施例进一步对实施例1中事务合并执行方法的完整步骤展开详细介绍。
结合图2,本发明实施例提供的一种基于日志解析同步的事务操作合并执行方法,具体包括以下步骤:
步骤101,在源端数据库及目的端数据库部署同步系统。其中,源端数据库同步系统用于从源端数据库读取日志,而目的端数据库同步系统则负责把源端发过来的同步操作应用到目的端数据库。
为了方便后续操作,在所述目的端数据库同步系统启动后,可在目的端初始化一条待执行事务链表、一条待合并事务链表和一条待执行操作链表。其中,所述待执行事务链表用来存放待执行入库的事务,所述待合并事务链表用来存放需要合并操作的事务(即待合并的事务),所述待执行操作链表用于在操作合并过程中存放相同的操作,即操作信息一致的操作。
步骤102,源端数据库同步系统从源端数据库读取日志后,按捕获日志的顺序进行日志解析,并将解析以后的操作按顺序发送到目的端数据库同步系统。
步骤103,目的端数据库同步系统接收到源端的操作后,以事务为单位进行管理,并按事务提交的先后顺序将接收到的事务添加到待执行事务链表。
步骤104,根据配置的事务合并后操作的规模大小,从所述待执行事务链表中取出多个已提交的事务添加到待合并事务链表。
其中,步骤101-步骤104对应于实施例1中的步骤201,目的是选出待合并的事务。选出的事务要从待执行链表中移出,这样下次再选择待合并的事务时,上次未能合并的事务就可以继续这个动作。在提取待合并的事务时,提取个数可根据预先配置的事务合并后操作的规模值来决定;假如设定合并以后的操作个数为N,那么在提取事务时就可以统计事务合并后的操作数;当操作数达到或超过N时,停止选择。在这里,N如果设置得过小会影响操作合并的效果,而如果设置得过大则会影响执行线程之间的并行度,因此需要根据同步环境来决定N值,在此不做具体限定。
步骤105,初始化所述待合并事务链表中每个事务的操作游标指向对应事务中的第一个操作。
这里为操作方便,为所述待合并事务链表中的每个事务分别设置一个操作游标,用于指示事务在进行操作合并时当前操作在该事务中的位置;操作游标在初始化时预设为每个事务的第一个操作。
其中,对于所述待合并事务链表中任一待合并的事务,如果该事物的前面部分操作已经存盘,后续剩余操作缓存在内存中,则初始化该事物的操作游标指向存盘文件中第一个操作的偏移位置。
步骤106,将所述待合并事务链表中当前待合并的第一个事务设置为基准事务,将基准事务的操作游标所指向的操作设置为基准操作。
其中,所述基准事务的基准操作是用来作为操作合并的一个基准,后面待合并的事务中的操作只有和基准操作的操作信息一致,并且操作LSN小于基准事务提交LSN才能被合并。
步骤107,从待合并事务链表中提取基准事务的基准操作的操作信息以及基准事务的提交LSN;其中,所述操作信息包括操作涉及的表和涉及的操作类型。
步骤108,将所述待合并事务链表中的下一个事务作为当前事务,并将当前事务的操作游标所指向的操作作为当前操作。其中,在首次进行操作合并时,所述当前操作即为下一个事务的第一个操作。
步骤109,判断当前操作是否满足合并条件,即当前操作是否与基准操作的操作信息一致,且操作LSN小于基准事务的提交LSN;如果满足则跳转至步骤110,如果不满足则跳转至步骤112。
步骤110,判断当前操作是否与所述待执行链表中操作的操作信息一致。如果一致,则将当前操作添加到待执行操作链表中;如果不一致,则批量执行并清空待执行操作链表中的操作后,将当前操作添加到待执行操作链表中。
其中,如果一致,则在将当前操作添加到待执行操作链表中之后,还需进一步判断当前所述待执行操作链表中的操作数是否达到预设的操作规模M;如果达到,则执行并清空待执行操作链表中的操作,避免该链表缓存太多的操作占用内存,实现边合并边执行。
步骤111,将当前事务的操作游标下移到所在事务的下一个操作,并判断该操作是否为提交操作。
如果是提交操作,证明该事务的操作合并已完成,则将当前事务从所述待合并事务链表中移除,并将所述待合并事务链表中的下一个事务作为当前事务继续,即跳转至步骤108。其中,在移除之后还需判断当前事务在所述待合并事务链表中是否还存在下一个事务,如果存在,则跳转至步骤108继续将下一个事务作为当前事务继续进行操作合并;如果不存在,则跳转至步骤113。
如果不是提交操作,则将当前事务中操作游标当前所指向的该操作作为当前操作,并执行所述判断当前操作是否满足合并条件,即跳转至步骤109。
其中,在移动操作游标时,如果操作游标指向的是存盘文件中的操作偏移,则当操作游标逐渐下移到存盘文件的末尾时,需要将操作游标定位到内存中的操作缓存链表上。
步骤112,判断当前事务在所述待合并事务链表中是否还存在下一个事务。如果存在,则继续将所述待合并事务链表中下一个事务作为当前事务进行操作合并,即跳转至步骤108;如果不存在,则跳转至步骤113。
步骤113,判断所述基准事务的基准操作是否与所述待执行操作链表中操作的操作信息一致。
如果一致,则将基准操作添加到待执行操作链表;如果不一致,则批量执行并清空待执行操作链表中的操作后,将基准操作添加到待执行操作链表中。
其中,如果一致,则在将基准操作添加到待执行操作链表中之后,还需进一步判断当前所述待执行操作链表中的操作数是否达到预设的操作规模M;如果达到,则执行并清空待执行操作链表中的操作,避免该链表缓存太多的操作占用内存,实现边合并边执行。
步骤114,将基准事务的操作游标下移到所在事务的下一个操作,并判断该操作是否为提交操作。
如果是提交操作,证明该事务的操作合并已完成,则将基准事务从所述待合并事务链表中移除,并将所述待合并事务链表中当前待合并的第一个事务作为基准事务继续进行操作合并,即跳转至步骤106。其中,移除之后还需进一步判断当前所述待合并事务链表是否为空,如果为空,则证明所有的事务已完成操作合并,结束整个合并过程;如果不为空,则继续将所述待合并事务链表中当前待合并的第一个事务作为基准事务继续进行操作合并。
如果不是提交操作,则将基准事务中操作游标当前所指向的该操作作为基准操作,跳转至步骤107继续进行操作合并。
其中,在移动操作游标时,如果操作游标指向的是存盘文件中的操作偏移,则当操作游标逐渐下移到达存盘文件的末尾时,需要把操作游标定位到内存中的操作缓存链表上。
步骤115,执行线程完成所述待合并事务链表中所有事务的操作合并后,批量执行所述待执行操作链表中现有的操作,至此完成事务的操作合并。
本发明实施例提供的上述事务合并执行方法,其原理主要是利用每个待合并事务的提交LSN做为分割界限,以第一个事务的第一个操作为基准,判断后面事务的待合并操作是否满足合并的条件;如果满足,则把它们添加进待执行操作链表来实现操作合并。当添加的操作和待执行操作链表中的操作不一致时,或则待执行操作链表中的操作数达到预设的操作规模时,则批量执行并清空待执行操作链表后再添加,这样边合并边执行的方式,比采用简单事务叠加合并的方式合并率更高,执行次数就更少,从而提升同步性能。
下面对上述事务操作合并执行方法的基本步骤作如下解释:
首先,数据库的日志流中记录的操作先后顺序可以直接反映出各个事务的操作在数据库内部执行的先后顺序,而以日志流中的提交操作作为分界线则反映出各个事务操作在数据库内部执行的并行度,两个事务的操作在日志流中以第一个提交操作为界,前面重合的那部分操作可以表示在源数据库中是并行执行的,而后面单个事务的操作在源数据库运行时可能会访问到前面一个事务的数据。那么这两个事务在合并时,如果采用简单叠加的方式,那只有当先提交事务的最后一个操作和后提交事务的第一个操作都相同的情况下才能合并执行。而本发明采用以先提交事务在日志流中的提交操作为分割线,在后提交的事务中寻找符合合并条件的操作,把这些操作尽可能地合并到前面事务的相同操作中一起批量执行,以便提升事务合并以后操作的合并率。
其次,采用边合并边执行的方式不用考虑待合并事务的规模或合并以后的操作规模,因为这种方式不需要保存合并以后的操作顺序信息,合并到待执行链表中的操作当达到预设的操作规模时可以直接执行以便释放内存。如果采用合并以后再执行的策略,那么在合并大事务时,则需要对合并以后的操作顺序进行存盘来避免过多的内存开销,在执行时又需要从磁盘中读取合并后的操作,带来额外的磁盘IO开销。本发明采用边合并边执行的方式可以有效规避这个问题,从而提升事务操作合并的性能。
实施例3:
在上述实施例1和实施例2的基础上,本发明实施例提供了一种基于日志解析同步的事务操作合并执行方法的具体实例,以便更好地理解整个事务合并执行过程。
在该具体的实施例中,假设源端数据库和目的端数据库现都有表T1(IDVARCHAR)。
源端应用有两个事务TRX1和TRX2,对表T1进行如下操作:
TRX1:INSERT INTO T1(ID)VALUES('TRX1_T1_1');
TRX2:INSERT INTO T1(ID)VALUES('TRX2_T1_10');
TRX1:UPDATE T1 SET ID='TRX1_T1_2'WHERE ID='TRX1_T1_2';
TRX1:COMMIT;
TRX2:INSERT INTO T1(ID)VALUES('TRX2_T1_20');
TRX2:COMMIT;
上述各操作的顺序在日志接收线程接收到之后,会形成如表1所示的情况。
表1:
事务ID |
操作 |
LSN |
TRX1 |
INSERT INTO T1(ID)VALUES('TRX1_T1_1') |
1 |
TRX2 |
INSERT INTO T1(ID)VALUES('TRX2_T1_10') |
2 |
TRX1 |
UPDATE T1 SET ID='TRX1_T1_2'WHERE ID='TRX1_T1_2' |
3 |
TRX1 |
COMMIT; |
4 |
TRX2 |
INSERT INTO T1(ID)VALUES('TRX2_T1_20'); |
5 |
TRX2 |
COMMIT; |
6 |
结合图2给出的执行步骤,本发明实施例中的事务合并过程具体如下:
步骤301,取多个待合并的事务并按事务提交顺序存放至待合并事务链表中。按照事务合并时的选择规则,生成的待合并链表中的事务详细情况为{TRX1,TRX2},即待合并链表中有TRX1、TRX2两个事务,且按照事务提交顺序,TRX1为第一个事务(提交LSN=4),TRX2为第一个事务(提交LSN=6)。
对于事务TRX1,它的操作信息如表2所示:
表2:
对于事务TRX2,它的操作信息如表3所示:
表3:
事务ID |
操作 |
LSN |
TRX2 |
INSERT INTO T1(ID)VALUES('TRX2_T1_10') |
2 |
TRX2 |
INSERT INTO T1(ID)VALUES('TRX2_T1_20') |
5 |
TRX2 |
COMMIT; |
6 |
步骤302,初始化一个待执行操作链表。为了陈述方便,此处以表格做为链表来解释操作合并的过程,所述待执行操作链表如表2所示。
表4:
步骤303,初始化待合并事务链表中所有事务的操作游标,分别指向各个事务的第一个操作。其中,事务TRX1的初始操作游标指向LSN为1的操作,事务TRX2的初始操作游标指向LSN为2的操作。
步骤304,以待合并事务链表中第一个事务TRX1为基准事务,其操作游标指向的操作(LSN=1)为当前的基准操作。
步骤305,提取基准事务TRX1的基准操作的操作信息为INSERT(T1),基准事务TRX1的提交LSN为4,即首轮合并操作以LSN=4为分割界限。
步骤306,判断下一个事务TRX2的操作游标指向的操作是否满足合并条件。该操作的操作信息为INSERT(T1),操作LSN为2,满足合并条件,将该操作(LSN=2)添加到待执行操作链表,形成如表5所示的操作局面。
表5:
LSN |
操作 |
备注 |
2 |
INSERT INTO T1(ID)VALUES('TRX2_T1_10') |
TRX2 |
步骤307,将事务TRX2的操作游标移到下一个操作,指向LSN为5的操作。
步骤308,判断下一个事务TRX2此时的操作游标指向的操作是否满足合并条件。该操作的操作信息为INSERT(T1),操作LSN为5,操作LSN比基准事务TRX1的提交LSN(LSN=4)要大,不满足合并条件,需判断是否还存在下一个事务。
步骤309,事务TRX2已经是待合并事务链表中的最后一个事务,因此将基准事务TRX1的基准操作(LSN=1)添加到待执行操作链表,形成如表6所示的操作局面。
表6:
LSN |
操作 |
备注 |
2 |
INSERT INTO T1(ID)VALUES('TRX2_T1_10') |
TRX2 |
1 |
INSERT INTO T1(ID)VALUES('TRX1_T1_1') |
TRX1 |
步骤310,将基准事务TRX1的操作游标移动到下一个操作(LSN=3),以该操作为当前的基准操作。
步骤311,提取基准事务TRX1的基准操作的操作信息为UPDATE(T1),基准事务TRX1的提交LSN为4,即该轮合并操作仍以LSN=4为分割界限。
步骤312,判断下一个事务TRX2此时操作游标指向的操作是否满足合并条件。该操作的操作信息为INSERT(T1),操作LSN为5,操作信息与基准操作UPDATE(T1)不一致,不满足合并条件,需判断是否还存在下一个事务。
步骤313,事务TRX2已经是待合并事务链表中的最后一个事务,因此需判断此时的基准操作(LSN=3)是否与所述待执行操作链表中操作的操作信息一致。
步骤314,基准操作的操作信息为UPDATE(T1),与此时待执行操作链表中操作的操作信息INSERT(T1)不一致,因此先执行并清空待执行操作链表中的INSERT(T1)操作,再将基准操作UPDATE(T1)添加到待执行操作链表中,形成如表7所示的操作局面。
表7:
LSN |
操作 |
备注 |
3 |
UPDATE T1 SET ID='TRX1_T1_2'WHERE ID='TRX1_T1_2' |
TRX1 |
步骤315,将基准事务TRX1的操作游标继续移动到下一个操作(LSN=4),下一个操作是提交操作,表示事务TRX1已经合并完成,则将事务TRX1从待合并事务链表中移除,现在剩{TRX2}一个事务。
步骤316,将事务TRX2作为基准事务,其操作游标此时指向的操作(LSN=5)为当前的基准操作,按照上述逻辑继续进行操作合并。
需要说明的是,本发明实施例是以涉及两个事务TRX1、TRX2和一个表T1为例进行说明,但并不用以限制本发明。当涉及的事务数量和表数量出现变化时,具体的事务操作合并执行过程仍可参考上述实施例中的步骤,在此不做赘述。
实施例4:
在上述实施例1-实施例3提供的基于日志解析同步的事务操作合并执行方法的基础上,本发明还提供了一种可用于实现上述方法的基于日志解析同步的事务操作合并执行装置,如图3所示,是本发明实施例的装置架构示意图。本实施例的基于日志解析同步的事务操作合并执行装置包括一个或多个处理器21以及存储器22。其中,图3中以一个处理器21为例。
所述处理器21和所述存储器22可以通过总线或者其他方式连接,图3中以通过总线连接为例。
所述存储器22作为一种基于日志解析同步的事务操作合并执行方法非易失性计算机可读存储介质,可用于存储非易失性软件程序、非易失性计算机可执行程序以及模块,如实施例1-实施例3中的基于日志解析同步的事务操作合并执行方法。所述处理器21通过运行存储在所述存储器22中的非易失性软件程序、指令以及模块,从而执行基于日志解析同步的事务操作合并执行装置的各种功能应用以及数据处理,即实现实施例1-实施例3的基于日志解析同步的事务操作合并执行方法。
所述存储器22可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实施例中,所述存储器22可选包括相对于所述处理器21远程设置的存储器,这些远程存储器可以通过网络连接至所述处理器21。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
所述程序指令/模块存储在所述存储器22中,当被所述一个或者多个处理器21执行时,执行上述实施例1-实施例3中的基于日志解析同步的事务操作合并执行方法,例如,执行以上描述的图1和图2所示的各个步骤。
本领域普通技术人员可以理解实施例的各种方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:只读存储器(ROM,Read Only Memory)、随机存取存储器(RAM,Random AccessMemory)、磁盘或光盘等。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。