一种事务型数据库之间巨大事务增量同步方法与流程

文档序号:28748268发布日期:2022-02-07 23:51阅读:103来源:国知局
一种事务型数据库之间巨大事务增量同步方法与流程

1.本发明属于oltp数据库领域同构数据库或异构数据库之间增量同步技术领域,尤其是涉及一种事务型数据库之间巨大事务增量同步方法。


背景技术:

2.随着国产数据库市场的发展与成熟,企业在信息化建设过程中交易系统的数据库选择更加丰富,在一个企业中不同的信息化系统往往存在多套不同的数据库。随着企业信息化系统的发展,这些数据库之间的数据逐渐产生相互之间同步需求。oltp数据库都有逻辑日志,这类数据库的增量同步为了减少对用户应用系统的入侵往往都采用基于解析逻辑日志获取增量的方式实现两个数据库之间的数据的增量同步,逻辑日志中记录的源库发生所有的动作,这里面包含事务开始操作,数据操作,提交/回滚操作,而且源库的操作往往是多个用户并发操作,所以逻辑日志中记录的操作往往也是多个事务的交叉串行记录,解析逻辑日志的过程中,需要还原事务与在源库的所有操作集合以及最终的提交顺序,在遇到源库发生全表更新,或者批量插入,批量更新的的巨大事务的情况,一条简单的批量update或者全表update会被序列化为几十万甚至上千万的记录,这样的事务在同步过程中,解析逻辑日志还原事务的过程中就会耗费非常巨大的内存,即使有足够大的内存向目标库一次性写入也会存在断点续传代价高,效率等问题,本发明主要是解决该场景面临的内存和断点续传代价高以及效率问题。
3.本发明通过一种能够按照设定阈值在内存与外存透明切换的容器设计并且结合事务拆分等技术解决巨大事务同步过程中内存、断点续传代价高及效率问题。


技术实现要素:

4.有鉴于此,本发明旨在提出一种事务型数据库之间巨大事务增量同步方法,以解决巨大事务同步过程中内存、断点续传代价高及效率问题。
5.为达到上述目的,本发明的技术方案是这样实现的:一种事务型数据库之间巨大事务增量同步方法,包括以下步骤:s1、日志流式挖掘模块将业务系统数据库中的逻辑日志进行流式解析,得到重做sql,并将所述重做sql交给事务还原模块进行事务还原;s2、初始化事务还原模块的事务缓存map;s3、所述事务还原模块接收到重做sql后放入到自身所属事务缓存列表容器中进行缓存,同时,需要判断所述事务缓存map中是否有存在本重做sql对应的自身所属事务的缓存列表容器,若有,则调用本列表容器的记录接口并存入,若没有,则新建列表容器并放入事务缓存map后,把本重做sql存入新建的列表容器;直到事务还原模块接收到丢弃或保存语句后,标识重做sql的事务还原完毕;s4、设定拆分事务大小阈值,并判断步骤s3中所述事务还原模块中还原的重做sql的事务是否需要拆分,重做sql的事务达到设定阈值后,把重做sql的事务拆分多个小事务,
并对每个小事务进行重新计算,发送给数据投递模块;若未达到阈值则直接发送给数据投递模块;s5、数据投递模块将接收的事务重做sql至目标数据库,目标数据库每执行每一个事务的重做sql后,并记在目标库成功执行的事务对应的逻辑日志点,如果是拆分的小事务并记录当前小事务对应逻辑日志点,以及最后一条重做sql对应的全局唯一的sequence号。
6.进一步的,步骤s1中日志流式挖掘模块进行逻辑日志解析时,需要先检查断点续传信息存储模块是否记录了断点续传信息;断点续传信息包括:最后一次成功同步的对应逻辑日志点,以及最后一条重做sql对应的全局唯一的sequence号;若存储有;使断点续传信息存储模块记录的逻辑日志点作为起始点开始逻辑日志的解析;若存储没有,则从业务系统数据库中逻辑日志的初始位置开始解析日志。
7.进一步的,所述步骤s2中事务还原缓存map为内存与外存透明切换的列表容器;内存与外存透明切换的列表容器的设计方法如下:s21、根据用户设定的内存与外存透明切换的列表容器最大占用内存大小或者记录条数,初始化一个列表容器,并设置当前条数为0,大小为0,并初始化列表内存区域;s22、内存与外存透明切换的列表容器添加记录接口,当添加记录接口被调用时,内存与外存透明切换的列表容器检查本容器内已经存储的元数据条数和占用内存大小是否超过初始化时设定的阈值,如果没有超过阈值则存放在内存中;如果超过了阈值,本条记录按照规定格式存储到外存中;并更新内存与外存透明切换的列表容器缓存的记录条数和占用内存大小;s23、内存与外存透明切换的列表容器获取并记录接口,当获取记录接口被调用时,根据传入的偏移量,先判断改偏移量对应的记录是在内存还是在外存中,如果在内存中则直接返回数据,如果在外存,则把根据偏移量在外存中数据读取对应的记录到内存中,并返回记录;s24、内存与外存透明切换的列表容器具备获取元数据信息方法,本方法可以提供容器总记录条数,占用内存大小;s25、内存与外存透明切换的列表容器具备容器销毁方法,本方法被调用时,检查被销毁容器是否使用到外部存储,如果使用到,则删除外存的缓存文件;释放内存,并返回。
8.进一步的,步骤s3中,判断所述事务缓存map中是否有存在本次重做sql的事务的容器的具体过程如下:s31、根据接收的重做sql的事务id,判断事务缓存map中是否有存在本次重做sql的事务的列表;如果不存在,则在事务还原缓存map中初始化一个列表容器,并放入将本次重做sql的事务;s32、如果存在,则从事务还原缓存map”中获取本次重做sql的事务的列表容器,并调用本列表容器的容器添加记录接口,把本次重做sql的事务添加至列表容器中;s33、如果接收重做sql的事务为commit,本次重做sql的事务的所有重做sql已经解析完毕,进入到事务拆分模块;s34、如果接收重做sql的事务为rollback,本次重做sql的事务在源库已经撤回,不需要向目标库同步,根据rollback的事务id,从缓存区获取改事务对应的内存与外存透
明切换的列表容器,调用容器销毁方法,释放内存和外存。
9.进一步的,步骤s4中判断事务还原模块中还原的重做sql的事务是否需要拆分的具体过程如下:s41、根据重做sql的事务id获取对应列表容器内的重做sql的事务总sql条数;s42、根据重做sql的事务总sql条数,判断是否达到设定的拆分事务大小阈值,如果没有达到拆分事务大小阈值,直接发送给数据投递模块,通过数据投递模块将重做sql的事务写入到目标数据库;s43、如果达到拆分事务大小阈值,根据设定的拆分事务大小阈值将重做sql的事务拆分成多个小事务;多个小事务的个数=本次重做sql的事务的总条数/拆分事务大小阈值;其中,多个小事务个数带有小数位,则自动进位;断点续传信息存储模块记录本事务的元数据信息。
10.进一步的,元数据信息包括:小事务包含的sql条数、小事务中最后一条重做sql对应的全局唯一的sequence号、原始大事务对应的逻辑日志开始点。
11.进一步的,步骤s5中数据投递模块向目标数据库写入事务的过程如下:s51、启动刚开始向目标数据库写入事务时,检查断点续传信息存储模块中是否存储了最后一次成功同步的对应逻辑日志点,以及最后一条重做sql对应的全局唯一的sequence号;如果有,则对比最后一次成功同步的最后一条重做sql的全局唯一的sequence号,如果当前要写入事务的最后一条重做sql对应的全局唯一的sequence号小于断点续传信息存储模块中的sequence号,则丢弃本事务,反之进入步骤s52;如果没有则执行步骤s52;s52、将接收的事务对应的重做sql写入目标库,并保证每个重做sql的写入幂等性;s53、事务的重做sql在目标数据库执行完毕并提交之后,记录本事务对应的逻辑日志点,如果是拆分的小事务并记录当前小事务对应逻辑日志点,以及最后一条重做sql对应的全局唯一的sequence号;s54、调用列表容器中的容器销毁方法,释放内存和外存资源。
12.相对于现有技术,本发明所述的一种事务型数据库之间巨大事务增量同步方法具有以下有益效果:(1)本发明所述的一种事务型数据库之间巨大事务增量同步方法,在数据保证数据一致性和内存可控的前提下实现源库巨大事务的增量同步;(2)本发明所述的一种事务型数据库之间巨大事务增量同步方法,支持根据客户的硬件情况设定内存与外存的使用比例,平衡硬件开支与性能的均衡点;(3)本发明所述的一种事务型数据库之间巨大事务增量同步方法,相对传统的直接事务还原,该方法性能与硬件开销可控,断点续传代价低;(4)本发明所述的一种事务型数据库之间巨大事务增量同步方法,能够保证增量同步中断后不丢失数据的断点续传;对源业务系统的数据库零入侵。
附图说明
13.构成本发明的一部分的附图用来提供对本发明的进一步理解,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:图1为本发明实施例所述的一种事务型数据库之间巨大事务增量同步方法框架图。
具体实施方式
14.需要说明的是,在不冲突的情况下,本发明中的实施例及实施例中的特征可以相互组合。
15.在本发明的描述中,需要理解的是,术语“中心”、“纵向”、“横向”、“上”、“下”、“前”、“后”、“左”、“右”、“竖直”、“水平”、“顶”、“底”、“内”、“外”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本发明和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本发明的限制。此外,术语“第一”、“第二”等仅用于描述目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”等的特征可以明示或者隐含地包括一个或者更多个该特征。在本发明的描述中,除非另有说明,“多个”的含义是两个或两个以上。
16.在本发明的描述中,需要说明的是,除非另有明确的规定和限定,术语“安装”、“相连”、“连接”应做广义理解,例如,可以是固定连接,也可以是可拆卸连接,或一体地连接;可以是机械连接,也可以是电连接;可以是直接相连,也可以通过中间媒介间接相连,可以是两个元件内部的连通。对于本领域的普通技术人员而言,可以通过具体情况理解上述术语在本发明中的具体含义。
17.下面将参考附图并结合实施例来详细说明本发明。
18.一种事务型数据库之间巨大事务增量同步方法,包括以下步骤:s1、日志流式挖掘模块将业务系统数据库中的逻辑日志进行流式解析,得到重做sql,并将所述重做sql交给事务还原模块进行事务还原;s2、初始化事务还原模块的事务缓存map;s3、所述事务还原模块接收到重做sql后放入到自身所属事务缓存列表容器中进行缓存,同时,需要判断所述事务缓存map中是否有存在本重做sql对应的自身所属事务的缓存列表容器,若有,则调用本列表容器的记录接口并存入,若没有,则新建列表容器并放入事务缓存map后,把本重做sql存入新建的列表容器;直到事务还原模块接收到丢弃或保存语句后,标识重做sql的事务还原完毕;s4、设定拆分事务大小阈值,并判断步骤s3中所述事务还原模块中还原的重做sql的事务是否需要拆分,重做sql的事务达到设定阈值后,把重做sql的事务拆分多个小事务,并对每个小事务进行重新计算,发送给数据投递模块;若未达到阈值则直接发送给数据投递模块;s5、数据投递模块将接收的事务重做sql至目标数据库,目标数据库每执行一个事务的重做sql后,记录成功执行的事务的编号到断点续传模块,以及对应的逻辑日志点。
19.步骤s1中日志流式挖掘模块进行逻辑日志解析时,需要先检查断点续传信息存储
模块是否记录了断点续传信息;断点续传信息包括:最后一次成功同步的对应逻辑日志点,以及最后一条重做sql对应的全局唯一的sequence号;若存储有;使断点续传信息存储模块记录的逻辑日志点作为起始点开始逻辑日志的解析;若存储没有,则从业务系统数据库中逻辑日志的初始位置开始解析日志。
20.所述步骤s2中事务还原缓存map为内存与外存透明切换的列表容器;内存与外存透明切换的列表容器的设计方法如下:s21、根据用户设定的内存与外存透明切换的列表容器最大占用内存大小或者记录条数,初始化一个列表容器,并设置当前条数为0,大小为0,并初始化列表内存区域;s22、内存与外存透明切换的列表容器添加记录接口,当添加记录接口被调用时,内存与外存透明切换的列表容器检查本容器内已经存储的元数据条数和占用内存大小是否超过初始化时设定的阈值,如果没有超过阈值则存放在内存中;如果超过了阈值,本条记录按照规定格式存储到外存中;并更新内存与外存透明切换的列表容器缓存的记录条数和占用内存大小;s23、内存与外存透明切换的列表容器获取并记录接口,当获取记录接口被调用时,根据传入的偏移量,先判断改偏移量对应的记录是在内存还是在外存中,如果在内存中则直接返回数据,如果在外存,则把根据偏移量在外存中数据读取对应的记录到内存中,并返回记录;s24、内存与外存透明切换的列表容器具备获取元数据信息方法,本方法可以提供容器总记录条数,占用内存大小;s25、内存与外存透明切换的列表容器具备容器销毁方法,本方法被调用时,检查被销毁容器是否使用到外部存储,如果使用到,则删除外存的缓存文件;释放内存,并返回。
21.步骤s3中,判断所述事务缓存map中是否有存在本次重做sql的事务的容器的具体过程如下:s31、根据接收的重做sql的事务id,判断事务缓存map中是否有存在本次重做sql的事务的列表;如果不存在,则在事务还原缓存map中初始化一个列表容器,并放入将本次重做sql的事务;s32、如果存在,则从事务还原缓存map”中获取本次重做sql的事务的列表容器,并调用本列表容器的容器添加记录接口,把本次重做sql的事务添加至列表容器中;s33、如果接收重做sql的事务为commit,本次重做sql的事务的所有重做sql已经解析完毕,进入到事务拆分模块;s34、如果接收重做sql的事务为rollback,本次重做sql的事务在源库已经撤回,不需要向目标库同步,根据rollback的事务id,从缓存区获取改事务对应的内存与外存透明切换的列表容器,调用容器销毁方法,释放内存和外存。
22.步骤s4中判断事务还原模块中还原的重做sql的事务是否需要拆分的具体过程如下:s41、根据重做sql的事务id获取对应列表容器内的重做sql的事务总sql条数;s42、根据重做sql的事务总sql条数,判断是否达到设定的拆分事务大小阈值,如果没有达到拆分事务大小阈值,直接发送给数据投递模块,通过数据投递模块将重做sql的
事务写入到目标数据库;s43、如果达到拆分事务大小阈值,根据设定的拆分事务大小阈值将重做sql的事务拆分成多个小事务;多个小事务的个数=本次重做sql的事务的总条数/拆分事务大小阈值;其中,多个小事务个数带有小数位,则自动进位;断点续传信息存储模块记录本事务的元数据信息。
23.元数据信息包括:小事务包含的sql条数、小事务中最后一条重做sql对应的全局唯一的sequence号、原始大事务对应的逻辑日志开始点。
24.步骤s5中数据投递模块向目标数据库写入事务的过程如下:s51、启动刚开始向目标数据库写入事务时,检查断点续传信息存储模块中是否存储了最后一次成功同步的对应逻辑日志点,以及最后一条重做sql对应的全局唯一的sequence号;如果有,则对比最后一次成功同步的最后一条重做sql的全局唯一的sequence号,如果当前要写入事务的最后一条重做sql对应的全局唯一的sequence号小于断点续传信息存储模块中的sequence号,则丢弃本事务,反之进入步骤s52;如果没有则执行步骤s52;s52、将接收的事务对应的重做sql写入目标库,并保证每个重做sql的写入幂等性;s53、事务的重做sql在目标数据库执行完毕并提交之后,记录本事务对应的逻辑日志点,如果是拆分的小事务并记录当前小事务对应逻辑日志点,以及最后一条重做sql对应的全局唯一的sequence号;s54、调用列表容器中的容器销毁方法,释放内存和外存资源。
25.重做sql:也称redosql,是从逻辑日志中解析出来的sql,该sql能够重复数据库之前做过的sql操作。
26.比如:用户在数据库中执行,一条插入sql,insert into t1 values(1,2);通过解析逻辑日志,得到的重做sql,就是insert into t1 values(1,2);日志流式挖掘模块:对源数据库的逻辑日志进行流式解析并从中获取重做sql。
27.事务还原模块:负责把日志流式挖掘模块解析出来的重做sql进行事务还原。
28.事务拆分模块:负责判断源库事务是否超过系统设置阈值,如果超过把大事务拆分成若干个小事务。
29.数据投递模块:负责把还原后的事务或者拆分后的事务写入到目标数据库。
30.断点续传信息存储模块:负责记录整个同步的断点续传信息,用来保障在系统出现停止或者以外推出时,能够在不丢失数据的情况下继续同步。
31.内存与外存透明切换的列表容器:一种经过特殊设计的列表容器数据结构,能够根据预定的阈值,自动判断使用内存还是外存,能够实现在可控内存前提下通过内外存结合的方式存储巨大的列表。
32.实施例如下:一、首先在客户业务系统内创建事务场景:1.客户源业务系统据库a,安装于服务器一上,服务器一的ip地址为172.10.1.5
2.目标数据库b,安装于服务器二上,服务器二的ip地址为172.10.2.53.源数据库、目标数据库均对应包含表:t1,t2,t3,t4,t54.源库业务系统客户年底统一更新明细状态,批量更新1000万条数据;5.设定内存中最大允许存储1万条数据,事务拆分阈值设定为1万条;上述事务场景及设置完成。
33.如图1所示的框架图进行事务的重做sql过程如下:1)、检查断点续传信息,没有断点续传信息,从逻辑日志当前点开始流失解析源库逻辑日志;2)、初始化事务缓存map;3)、事务还原模块接收到s1发送来的tx1的重做sql,检查s2初始化的“事务缓存map”中是否包含tx1为key的重做sql列表,如果没有,初始化一个重做列表,调用s21,并放入“事务缓存map”。
34.4)、从“事务缓存map”中获取tx1的重做sql列表,调用s22接口,tx1事务的前1万条重做sql缓存在内存中,后999万条sql写入到磁盘中,维护重做sql列表的元数据信息:事务总条数1000万条,占用内存大小9mb,占用磁盘大小999mb。
35.5)、事务拆分模块,收到tx1事务id后,调用s24接口,获取到总重做sql条数1000万条,满足事务拆分标准;小事务个数为1000个计算公式:10000000/10000=1000;表1拆分后事务列表。
36.6)、数据投递模块投递数据,如果是同步系统启动后一次向目标库写入数据,检查断点续传信息中记录的检查断点续传信息中是否存储了“最后一次成功同步的对应逻辑日志点,以及最后一条重做sql对应的全局唯一的sequence号”,断点续传信息为空;
7)、循环处理tx1_1到tx1_1000的拆分事务写入到目标数据库中,每写成功一个事务,并记录当前小事务对应逻辑日志点,以及第一条重做sql在原始事务中的index。
37.8)、调用重做sql列表的s25“容器销毁方法”,释放内存和磁盘资源。
38.9)、如果7)处理过程中出现中断,再次启动写入时,检查断点续传信息中是否存储了最后一次成功同步的对应逻辑日志点,以及最后一条重做sql对应的全局唯一的sequence号,对比事务最后一条重做sql对应的全局唯一的sequence号,如果小于断点续传信息中存储的sequence号,则丢弃当前事务,否则写入数目标库;10)、如果7)处理过程中同步整体中断,回到1)使用断点续传信息中记录的最后一次成功同步的对应逻辑日志点,以及最后一条重做sql对应的全局唯一的sequence号,进行数据挖掘,再次处理即可。
39.以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1