一种基于日志解析的部分回滚解析方法和数据同步系统
技术领域
本发明属于数据同步技术领域,更具体地,涉及一种基于日志解析的部分回滚解析方法和数据同步系统。
背景技术
基于日志解析来进行ORACLE数据库到其他异构数据库的数据同步,即是通过实时读取ORACLE数据库的REDO日志文件或归档日志文件,捕获出增量的REDO记录,然后分析REDO记录中改变向量(Change vector)的内容解析出ORACLE数据库的DML操作以及相应的数据,将这些信息转换后发送到目标数据库进行SQL逆向恢复,然后执行同步。
为了进行事务级的同步,支持事务部分回滚同步,捕获分析同步线程在解析ORACLE的REDO记录时,需要按照SCN的顺序将同一事务的所有REDO操作进行归集,并且按照事务内部操作的顺序,对DML操作进行内部编号。在解析出数据库的部分回滚操作后,首先根据回滚操作的DBA找到所属回滚事务,然后根据DBA定位回滚事务中的操作行编号,同步过程中删除大于回滚行编号之后的DML操作,即可完成部分回滚的同步。
为此,对于源端ORACLE数据库上的所有未提交的待同步事务,需要在内存中申请空间用于缓存该事务各操作的所有DBA信息以及相对应的操作编号。这样,当捕获到事务的部分回滚操作后,就能从缓存DBA信息中定位到需删除的回滚操作。但是,当源端ORACLE数据库执行大事务操作后,内存中需要缓存大量事务DML操作的DBA信息,造成源端系统内存资源紧张。针对这种问题,需要对这种部分回滚方式进行优化,减少源端日志分析的内存占用。
鉴于此,克服该现有技术产品所存在的不足是本技术领域亟待解决的问题。
发明内容
针对现有技术的以上缺陷或改进需求,本发明提供了一种基于日志解析的部分回滚解析方法和数据同步系统,其目的在于,采用中间数据库来管理DBA信息可以避免占用源端数据库的内存资源,保证源端数据库运行的性能,而且不需要进行复杂的内存和文件的交换算法,易于实现。此外,日志分析线程和入库线程异步执行,互不干扰,不会影响日志分析线程的效率,保证了同步的效率。
为实现上述目的,按照本发明的一个方面,提供了一种基于日志解析的部分回滚解析方法,在源端搭建中间数据库,在所述中间数据库创建信息表,源端数据同步服务包括入库线程和日志分析线程,所述日志分析线程和所述入库线程异步执行,所述入库线程配套创建有信息队列;
所述部分回滚解析方法包括:
对源端数据库的日志进行解析得到待同步操作;
所述日志分析线程获取所述待同步操作的事务标识、日志序列号和数据块地址,将所述待同步操作的事务标识、日志序列号和数据块地址添加至所述信息队列;
所述入库线程从所述信息队列中获取所述待同步操作的事务标识、日志序列号和数据块地址,并将所述待同步操作的事务标识、日志序列号和数据块地址添加至所述信息表;
在执行部分回滚操作时,根据所述部分回滚操作所指向的数据块地址和所述信息表,确定所述部分回滚操作所指向的目标事务和所述部分回滚操作所指向的目标操作的日志序列号,以对所述目标事务进行部分回滚。
优选地,在执行部分回滚操作时,根据所述部分回滚操作所指向的数据块地址和所述信息表,确定所述部分回滚操作所指向的目标事务和所述部分回滚操作所指向的目标操作的日志序列号,以对所述目标事务进行部分回滚包括:
在执行部分回滚时,所述入库线程在所述信息表中,查找与所述部分回滚操作所指向的数据块地址相同的数据块地址,以确定所述部分回滚操作所指向的目标操作;
所述入库线程根据所述目标操作的事务标识,确定所述部分回滚操作所指向的目标事务;
确定所述目标操作的日志序列号SCN1,其中,所述日志序列号SCN1为所述部分回滚操作所指向的目标操作的日志序列号。
优选地,所述部分回滚解析方法还包括:
在确定所述部分回滚操作所指向的目标操作后,针对所述目标事务,所述入库线程删除所述信息表中,日志序列号不小于SCN1的操作的相关信息,以清理所述信息表。
优选地,在执行部分回滚操作时,根据所述部分回滚操作所指向的数据块地址和所述信息表,确定所述部分回滚操作所指向的目标事务和所述部分回滚操作所指向的目标操作的日志序列号,以对所述目标事务进行部分回滚还包括:
所述入库线程将所述目标操作的事务标识和所述目标操作的日志序列号SCN1发送给所述日志分析线程,以便于所述日志分析线程将所述目标操作的事务标识和所述目标操作的日志序列号SCN1发送给目标端,进而进行所述目标事务的部分回滚。
优选地,所述日志分析线程获取所述待同步操作的事务标识、日志序列号和数据块地址,将所述待同步操作的事务标识、日志序列号和数据块地址添加至所述信息队列包括:
所述日志分析线程判断所述待同步操作的操作类型;
当所述待同步操作为DML操作时,提取所述待同步操作的事务标识、日志序列号和数据块地址,并将所述待同步操作的事务标识、日志序列号和数据块地址添加至所述信息队列。
优选地,所述日志分析线程判断所述待同步操作的操作类型之后还包括:
当所述待同步操作的操作类型为提交操作或回滚操作时;
获取所述待同步操作的事务标识,并将所述待同步事务的标识添加至所述信息队列。
优选地,所述入库线程从所述信息队列中获取所述待同步操作的事务标识、日志序列号和数据块地址,并将所述待同步操作的事务标识、日志序列号和数据块地址添加至所述信息表包括:
所述入库线程从所述信息队列中取出所述待同步操作;
判断所述待同步操作的操作类型;
当所述待同步操作为DML操作时,从所述信息队列获取所述待同步操作的事务标识、日志序列号和数据块地址;
将所述待同步操作的事务标识、日志序列号和数据块地址添加至所述信息表。
优选地,判断所述待同步操作的操作类型之后还包括:
当所述待同步操作为提交操作或回滚操作时,从所述信息队列获取所述待同步操作的事务标识;
根据所述待同步操作的事务标识,在所述信息表中删除与所述待同步操作从属于同一事务的操作的相关信息,以清理所述信息表。
优选地,在获取所述待同步操作的操作信息之后,在进行对所述信息表的入库操作之前,还包括:
判断相邻的两个所述待同步操作的操作类型是否相同;
若相同,则根据相应的操作类型,批量执行入库操作。
为实现上述目的,按照本发明的另一个方面,提供了一种数据同步系统,所述数据同步系统包括至少一个处理器;以及,与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被程序设置为执行本发明所述的部分回滚解析方法。
总体而言,通过本发明所构思的以上技术方案与现有技术相比,具有如下有益效果:采用中间数据库来管理DBA信息可以避免占用源端数据库的内存资源,保证源端数据库运行的性能,而且不需要进行复杂的内存和文件的交换算法,易于实现。此外,日志分析线程和入库线程异步执行,互不干扰,不会影响日志分析线程的效率,保证了同步的效率。
附图说明
图1是本发明实施例提供的一种基于日志解析的部分回滚解析方法的流程示意图;
图2是本发明实施例提供的日志分析线程的执行过程的流程示意图;
图3是本发明实施例提供的入库线程的执行过程的流程示意图;
图4是本发明实施例提供的一种数据同步系统的结构示意图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
在本发明的描述中,术语“内”、“外”、“纵向”、“横向”、“上”、“下”、“顶”、“底”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本发明而不是要求本发明必须以特定的方位构造和操作,因此不应当理解为对本发明的限制。
此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。
实施例1:
当数据库中某个事务产生部分回滚时,日志中会记录部分回滚日志,部分回滚日志中包含有日志本身的SCN以及部分回滚操作涉及的DBA值,但并没有提供部分回滚针对事务的TRXID,想要定位部分回滚的事务只能通过它提供的DBA值在当前所有活动事务中查找对应的DBA,当找到DBA的操作后,从操作所属事务中删除从该操作起的后续所有操作来完成部分回滚的解析。但是,当源端ORACLE数据库执行大事务操作后,内存中需要缓存大量事务DML操作的DBA信息,造成源端系统内存资源紧张。
为解决前述问题,本实施例提供一种基于日志解析的部分回滚解析方法,在源端搭建中间数据库,在所述中间数据库创建信息表,所述信息表用于存储存放源端日志同步服务从日志流中解析出来的操作事务ID、SCN和对应的DBA信息。
源端数据同步服务包括入库线程和日志分析线程,其中,所述入库线程负责把操作的DBA信息插入到中间数据库,所述日志分析线程用于解析日志记录,所述日志分析线程和所述入库线程异步执行,所述入库线程配套创建有信息队列,所述信息队列用于存储DML操作日志记录中的SCN、TRXID(事务标识)和DBA信息。
其中,信息表的结构为CREATE DBA_INFO(SCN BIGINT,TRXID BIGINT,DBABIGINT),为了快速的定位DBA,可以为DBA列创建索引,CREATE INDEX IND_DBA ON DBA_INFO(DBA);为了快速根据事务ID按SCN为条件清理DBA信息,可以为TRXID列创建索引,CREATE INDEX IND_TRXID ON DBA_INFO(TRXID,SCN)。
参阅图1,所述部分回滚解析方法包括如下步骤:
步骤101:对源端数据库的日志进行解析得到待同步操作。
其中,待同步操作包括DML操作、回滚操作和部分回滚操作。
在本实施例中,对源端数据的日志记录进行解析,得到每个日志记录对应的待同步操作。
步骤102:所述日志分析线程获取所述待同步操作的事务标识、日志序列号和数据块地址,将所述待同步操作的事务标识、日志序列号和数据块地址添加至所述信息队列。
在本实施例中,ORACLE日志中每条DML操作的REDO日志记录除了拥有严格递增的日志序列号SCN、TRXID(操作所属的事务ID)和它对应的操作标记以外,还拥有DML操作对应数据的数据块地址DBA(data block address,简写为DBA)。
在本实施例中,针对每个待同步操作将其事务标识号、日志序列号和数据块地址建立关联后(例如,进行绑定封装),添加至所述信息队列。可以根据事务标识号、日志序列号或者数据块地址中的任一个信息,得到该待同步操作的其他两个信息。例如,根据数据块地址,可以得到待同步操作的事务标识和日志序列号。
步骤103:所述入库线程从所述信息队列中获取所述待同步操作的事务标识、日志序列号和数据块地址,并将所述待同步操作的事务标识、日志序列号和数据块地址添加至所述信息表。
在本实施例中,所述入库线程与所述日志分析线程异步执行,互不冲突干扰,由于日志解析速度较快,而DBA入库需要和中间数据库进行交互导致性能较慢,如果把这两种操作放在单线程中运行会严重拖慢日志解析的速度,采用日志分析线程和入库线程异步工作的方式可以有效解决前述问题。
步骤104:在执行部分回滚操作时,根据所述部分回滚操作所指向的数据块地址和所述信息表,确定所述部分回滚操作所指向的目标事务和所述部分回滚操作所指向的目标操作的日志序列号,以对所述目标事务进行部分回滚。
在本实施例中,所述日志分析线程在接收到部分回滚操作后,根据部分回滚操作所述指向的数据块地址遍历所述信息表,在所述信息表中查找到与所述数据块地址相同的数据块地址DBA-1,从而确定与前述数据块地址DBA-1绑定在一起的事务标识ID-1和日志序列号SCN-1,根据事务标识ID-1确定所述部分回滚操作所指向的目标事务,其中,日志序列号SCN-1为所述部分回滚操作所述指向的目标操作的日志序列号,将所述目标事务中日志序列号大于等于SCN-1的操作删除,以对所述目标事务进行部分回滚。
在实际应用场景下,ORACLE数据库产生的每条日志记录中都SCN值代表该操作的顺序,TRXID代表该日志记录所属的事务,并且每个日志记录都拥有操作的类型(INSERT、UPDATE、DELETE、ROLLBACK和COMMIT等),如果是DML操作,在日志头上还记录有该操作针对表对像的ID信息,以及该日志记录对应数据在日志文件中的位置信息DBA(占8字节)。
日志分析线程在解析到部分回滚操作涉及的DBA信息时,需要在当前所有活动事务操作中定位该DBA才能得到具体针对的事务以及回滚操作的位置,日志分析线程要实现此功能,必须记录所有活动事务的每个操作的DBA信息,当活动事务规模很大量,就需要组织管理大量的DBA信息,这些信息放在内存中则会挤占源端数据库服务器的运行内存,可能会影响到源数据库的运行,采用缓存到磁盘文件的方式又需要实现一套复杂的内存和文件的交换算法,加大了日志分析服务实现的复杂度同时也降低了可靠性。
在本实施例中,采用中间数据库来管理DBA信息可以避免占用源端数据库的内存资源,保证源端数据库运行的性能,而且不需要进行复杂的内存和文件的交换算法,易于实现。此外,日志分析线程和入库线程异步执行,互不干扰,不会影响日志分析线程的效率,保证了同步的效率。
下面分别说明所述日志分析线程和所述入库线程的执行过程。
结合图2,所述日志分析执行线程的执行过程如下:
所述日志分析线程判断所述待同步操作的操作类型,当所述待同步操作为DML操作时,跳到下述步骤A,当所述待同步操作为部分回滚操作时,跳到下述步骤B,当所述待同步操作的操作类型为提交操作或回滚操作时,跳到下述步骤C。
步骤A:通过日志分析线程提取所述待同步操作的事务标识、日志序列号和数据块地址,并将所述待同步操作的事务标识、日志序列号和数据块地址添加至所述信息队列。
可以理解为,提取当前DML操作日志记录中的SCN、TRXID和DBA信息,把这些信息封装后添加到DBA信息队列中后立即返回,DBA入库线程会异步的把该信息入库,从而可以有效的提升日志解析的性能,然后继续解析下一条日志记录。
步骤B:通过日志分析线程提取所述待同步操作的数据块地址和日志序列号,并将所述待同步操作的数据块地址和日志序列号添加至所述信息队列,并等待所述入库线程完成该部分回滚操作后,返回部分回滚操作对应的事务信息。
可以理解为,提取当前部分回滚操作日志记录中的SCN和其指向的DBA信息,把这些信息封装以后添加到DBA信息队列,并等待DBA入库线程完成该部分回滚操作,当DBA入库线程完成该操作的部分回滚以后,它会返回该部分回滚的DBA信息所属的事务信息,事务信息包括部分回滚操作所指向的目标操作所属事务的TRXID和该部分回滚操作所指向的目标操作的SCN值。
日志分析线程将部分回滚操作所指向的TRXID和SCN值发送至目标端,保证目标端把对应事务中大于等于该SCN值的操作进行删除处理,完成该部分回滚操作的日志解析,然后解析下一条日志记录。
步骤C:获取所述待同步操作的事务标识,并将所述待同步事务的标识添加至所述信息队列。
具体地,提取提交或回滚日志记录的TRXID,然后把该信息封装以后添加到DBA信息队列中并立即返回,然后继续解析下一条日志记录。
结合图3,所述入库执行线程的执行过程如下:
所述入库线程从所述信息队列中取出所述待同步操作,判断当前操作信息的类型,当所述待同步操作为DML操作时,则跳到下述步骤D;当所述待同步操作为部分回滚操作时,则跳到下述步骤E;当所述待执行操作为提交或回滚时,则跳到下述步骤F。
步骤D:从所述信息队列中获取所述待同步操作的事务标识、日志序列号和数据块地址;将所述待同步操作的事务标识、日志序列号和数据块地址添加至所述信息表。
在优选的实施例中,在获取所述待同步操作的操作信息之后,在进行对所述信息表的入库操作之前,还包括:判断相邻的两个所述待同步操作的操作类型是否相同;若相同,则根据相应的操作类型,批量执行入库操作。
可以理解为,待同步操作为DML操作的DBA入库信息时,则把该DBA信息插入到信息表中,在插入时,如果DBA信息队列中存在连续的多条DML操作的DBA信息,则采用批量绑定的方式进行入库,可以有效的提升DBA信息入库的效率,处理完成以后,继续分析下一个待执行操作。
步骤E:在执行部分回滚时,所述入库线程在所述信息表中,查找与所述部分回滚操作所指向的数据块地址相同的数据块地址,以确定所述部分回滚操作所指向的目标操作;所述入库线程根据所述目标操作的事务标识,确定所述部分回滚操作所指向的目标事务;确定所述目标操作的日志序列号SCN1;针对所述目标事务,删除日志序列号不小于SCN1的操作的相关信息,以清理所述信息表。
所述入库线程将所述目标操作的事务标识和所述目标操作的日志序列号SCN1发送给所述日志分析线程,以便于所述日志分析线程将所述目标操作的事务标识和所述目标操作的日志序列号SCN1发送给目标端,进而进行所述目标事务的部分回滚。
可以理解为,通过部分回滚的DBA信息中的DBA值在DBA信息表中查找它所属的事务信息,获得对应事务的TRXID和该DBA对应操作的SCN,然后把TRXID和SCN值返回给日志分析线程通知它已经完成了部分回滚操作,最后删除DBA信息表中属于该事务并且SCN值大于等于DBA对应操作SCN的行,继续分析下一个待同步操作。
步骤F:当所述待同步操作为提交操作或回滚操作时,获取所述待同步操作的事务标识;根据所述待同步操作的事务标识,删除与所述待同步操作从属于同一事务的操作的相关信息,以清理所述信息表
可以理解为,获取提交或回滚操作中的TRXID信息,删除DBA信息表中该事务的DBA记录,继续分析下一个待同步操作。
在本实施例中,采用日志分析线程和DBA入库线程异步工作这是由于日志解析速度较快,而DBA入库需要和第三方数据库进行交互导致性能较慢,如果把这两种操作放在单线程中运行会严重拖慢日志解析的速度。在拆开执行以后,DBA入库线程采用DBA信息链表的缓冲方式,可以有效的判断相邻的两个DBA信息操作的类型是否是同类型的DBA信息入库操作,实现合并批量入库有效提升DBA信息入库的效率。
实施例2:
为了便于理解前述实施例1的技术方案,在本实施例中,以一简单的具体实例进行举例说明,在此需要说明的是,在实际情况下,数据规模远大于本实施例所举的例子。
举例而言,源数据库现有表T(C1 INT),在源端执行下列操作:
INSERT INTO T(C1)VALUES(1);
SAVEPOINT SP1;
INSERT INTO T(C1)VALUES(2);
SAVEPOINT SP2;
INSERT INTO T(C1)VALUES(3);
ROLLBACK TO SAVEPOINT SP1;
COMMIT;
源端数据库会产生日志流:INSERT(C1=1)+INSERT(C1=2)+INSERT(C1=3)+ROLLBACK(TO INSERT(C=2))+COMMIT
日志分析线程解析过程如下:
(1)日志分析线程提取到日志INSERT(C1=1),获取它的日志记录的SCN值为SCN1、事务ID为TRX1和数据地址DBA1,把它们封装以后添加到DBA信息队列。
(2)日志分析线程提取到日志INSERT(C1=2),获取它的日志记录的SCN值为SCN2、事务ID为TRX1和数据地址DBA2,把它们封装以后添加到DBA信息队列。
(3)日志分析线程提取到日志INSERT(C1=3),获取它的日志记录的SCN值为SCN3、事务ID为TRX1和数据地址DBA3,把它们封装以后添加到DBA信息队列。
(4)日志分析线程提取部分回滚操作涉及数据地址DBA2(保存点SP1后的第一个数据地址),然后添加到DBA信息队列,并等待DBA入库线程返回执行结果。
(5)日志分析线程获得DBA入库线程返回的执行结果,取得部分回滚操作针对的事务ID为TRX1和回滚第一个操作的SCN值为SCN2。
(6)日志分析线程定位到事务ID为TRX1的事务,以便于目标端该事务上所有SCN值大于等于SCN2的操作删除,完成部分回滚。
(7)日志分析线程提取到日志COMMIT,获取它的事务ID为TRX1,把它添加到DBA信息队列后完成该事务的解析。
DBA入库线程执行过程如下:
(1)DBA入库线程提取到INSERT操作的DBA信息,通过判断,发现DBA信息链表上连续的存在三个INSERT操作的DBA信息,把它们批量入库:INSERT INTO DBA_INFO(SCN,TRXID,DBA)VALUES(SCN1,TRX1,DBA1)(SCN2,TRX1,DBA2)(SCN3,TRX1,DBA3);
(2)DBA入库线程提取到部分回滚操作,通过DBA信息来获得到该操作涉及的事务信息,执行SELECT TRX,SCN FROM DBA_INFO WHERE DBA=DBA1;查询获得事务信息为TRX1和SCN2,然后把结果返回给日志分析线程;接着再执行DBA信息表的清理任务来清理事务TRX1需要回滚掉的DBA信息,执行:DELETE FROM DBA_INFO WHERE TRXID=TRX1AND SCN>=SCN2;
(3)DBA入库线程得取到提交操作,通过事务ID来清理DBA信息表中该事务的所有DBA信息,执行DELETE FROM DBA_INFO WHERE TRXID=TRX1。
实施例3:
请参阅图4,图4是本发明实施例提供的一种数据同步系统的结构示意图。本实施例的数据同步系统包括一个或多个处理器61以及存储器62。其中,图4中以一个处理器61为例。
处理器61和存储器62可以通过总线或者其他方式连接,图4中以通过总线连接为例。
存储器62作为一种基于数据同步的非易失性计算机可读存储介质,可用于存储非易失性软件程序、非易失性计算机可执行程序以及模块,上述实施例的方法以及对应的程序指令。处理器61通过运行存储在存储器62中的非易失性软件程序、指令以及模块,从而执行各种功能应用以及数据处理,实现前述实施例的方法。
其中,存储器62可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实施例中,存储器62可选包括相对于处理器61远程设置的存储器,这些远程存储器可以通过网络连接至处理器61。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
值得说明的是,上述装置和系统内的模块、单元之间的信息交互、执行过程等内容,由于与本发明的处理方法实施例基于同一构思,具体内容可参见本发明方法实施例中的叙述,此处不再赘述。
本领域普通技术人员可以理解实施例的各种方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:只读存储器(Read Only Memory,简写为ROM)、随机存取存储器(RandomAccessMemory,简写为RAM)、磁盘或光盘等。
本领域的技术人员容易理解,以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。