一种基于ROWID区间的初始化装载方法与装置与流程

文档序号:26101617发布日期:2021-07-30 18:12阅读:67来源:国知局
本发明属于计算机
技术领域
:,更具体地,涉及一种基于rowid区间的初始化装载方法与装置。
背景技术
::目前,基于数据库日志分析的异构数据库复制技术应用广泛,这种技术在源端捕获出数据库的增量数据然后发送到目标端,在目的端通过通用的数据库访问接口将增量数据应用到目的数据库,实现数据复制。这种技术由于使用到通用数据库接口,因此支持异构数据库系统复制,支持异构操作系统环境,并且目的端备机数据库系统可读写,是一种“双活”系统。在进行数据库数据实时同步时,首先需要对目的数据库进行数据初始化操作,来获得数据同步的基础点;在完成数据初始化操作之后,即可在此基础之上进行实时增量数据同步。但在实际数据库应用中,源端数据库中可能存在很多应用,而且这些应用可能会分分秒秒地对数据库进行修改操作,这些修改操作涉及的表如果数据量很大,那么这些表在实现源端数据库到目的端数据库的数据初始化就需要很长的结果集提取时间,在多版本功能的数据库环境下提取结果集时就会经常报错“快照过旧”而导致初始化失败。其中,快照过旧是带多版本功能数据库中很常见的一个错误,主要是由于数据库上频繁的操作快速消耗了回滚段的空间,数据库通过释放其它已提交事务的回滚段空间来进行补充,使得当前结果集提取时无法再通过相应的回滚段来回溯对应记录的修改历史而报错,因为此时对应的回滚段已经被释放不存在了。在传统方案中,同步初始化碰到“快照过旧”错误时,往往采用调整源端数据库的运行参数的方式,比如扩展回滚段空间或延长回滚段空间释放时间等措施,但是这些措施的实施存在很大的不确定性,因为在生产系统调整这些运行参数往往得不到用户的同意,就算同意,调整以后再次装载依然无法避免再次报错,也就是说这个错误仍然不可避免。因此,找到一种可以解决“快照过旧”错误对数据同步时初始化装载功能的影响,保证装载完成开启同步以后源端数据库和目标端数据库的一致性,就成为业界亟待解决的技术问题。技术实现要素:针对现有技术的以上缺陷或改进需求,本发明提供了一种基于rowid区间的初始化装载方法,其目的在于依靠rowid来断点续传结果集数据,保证装载完成开启同步后源端数据库和目标端数据库的一致性,由此解决数据同步初始化装载时提取结果集报“快照过旧”错误的技术问题。为实现上述目的,按照本发明的一个方面,提供了一种基于rowid区间的初始化装载方法,包括:源端按照rowid从小到大的顺序查询待装载表中的数据,并提取结果集发送到目的端,直至结果集提取完成;如果在提取结果集过程中报错“快照过旧”,则利用rowid将本轮查询中已成功提取到结果集的行划分出一个rowid区间,并将该rowid区间对应的装载lsn保存到目的端;开启数据同步后,目的端根据操作日志中的rowid值定位所属的rowid区间,并找到对应的装载lsn以实现数据同步的过滤。优选地,当源端数据库支持闪回查询功能时,所述源端按照rowid从小到大的顺序查询待装载表中的数据,并提取结果集发送到目的端,具体为:在源端查询当前事务的提交lsn,并将当前事务的提交lsn作为本轮查询的装载lsn;源端按照rowid从小到大的顺序,利用本轮查询的装载lsn以闪回方式逐行查询待装载表中的数据,并提取结果集发送到目的端;在提取结果集时,源端记录下本轮查询中已成功提取到结果集的第一行数据的rowid值作为本轮查询的起始rowid。优选地,所述如果在提取结果集过程中报错“快照过旧”,则利用rowid将本轮查询中已成功提取到结果集的行划分出一个rowid区间,并将该rowid区间对应的装载lsn保存到目的端,具体为:如果在提取结果集过程中报错“快照过旧”,则将本轮查询中已成功提取到结果集的最后一行数据的rowid值作为本轮查询的终止rowid,利用本轮查询的起始rowid和终止rowid划分出一个rowid区间;源端将所述待装载表的表id以及本轮查询的装载lsn、起始rowid和终止rowid发送到目的端,由目的端保存到本地的同步表中,以便进行数据同步时使用。优选地,所述同步表的表结构包括objid列、lsn列、start_rowid列和end_rowid列;其中,所述objid列用于存放所述待装载表的表id,所述lsn列用于存放对应rowid区间的装载lsn,所述start_rowid列用于存放对应rowid区间的起始rowid,所述end_rowid列用于存放对应rowid区间的终止rowid。优选地,如果在提取结果集过程中报错“快照过旧”,则根据本轮查询的终止rowid确定下一轮查询的起始rowid,对所述待装载表执行下一轮的数据查询,直至结果集提取完成。优选地,如果在提取结果集过程中未报错“快照过旧”,则在结果集提取完成后,将null值作为本轮查询的终止rowid,利用本轮查询的起始rowid和终止rowid划分出一个rowid区间。优选地,开启数据同步后,所述目的端根据操作日志中的rowid值定位所属的rowid区间,并找到对应的装载lsn以实现数据同步的过滤,具体为:源端捕获源端数据库的操作日志,对所述操作日志解析后将获得的操作信息发送到目的端执行同步;目的端接收到源端发送来的操作信息后根据事务id进行分类管理,当接收到提交操作时,找到提交操作对应的事务准备执行;目的端依次执行该事务中的每个操作,使用操作对应的表id和rowid值在所述同步表中定位该操作所属的rowid区间,得到对应的装载lsn;对比该事务的提交lsn和装载lsn的大小,当提交lsn小于等于装载lsn时将该操作直接丢弃,否则执行入库,完成该操作的同步。优选地,在源端对所述操作日志解析后,获得的所述操作信息包括该操作对应的事务id、表id、操作类型和操作数据,且所述操作数据中包含该数据在源表上的rowid值。优选地,当源端数据库不支持闪回查询功能时,所述源端按照rowid从小到大的顺序查询待装载表中的数据,并提取结果集发送到目的端,具体为:对源端数据库中的待装载表上s锁后,在源端查询当前事务的提交lsn,并将当前事务的提交lsn作为本轮查询的装载lsn;源端执行用于查询待装载表的sql语句,按照rowid从小到大的顺序查询所述待装载表中的数据,并在释放s锁后提取结果集发送到目的端;在提取结果集时,源端记录下本轮查询中已成功提取到结果集的第一行数据的rowid值作为本轮查询的起始rowid。按照本发明的另一方面,提供了一种基于rowid区间的初始化装载装置,包括至少一个处理器和存储器,所述至少一个处理器和存储器之间通过数据总线连接,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令在被所述处理器执行后,用于完成第一方面所述的基于rowid区间的初始化装载方法。总体而言,通过本发明所构思的以上技术方案与现有技术相比,具有如下有益效果:本发明中源端数据库的待装载表采用逻辑递增的rowid值来组织数据的特性,装载时按照rowid从小大到的顺序对待装载表进行结果集的抽取;当抽取报“快照过旧”后,把当前成功抽取的这一部分采用rowid区间结合当前装载lsn保存到目的端,以便在开启同步后目的端可通过操作日志中的rowid值来定位所属的rowid区间以及装载lsn,进而根据该装载lsn对比实现精准过滤。本发明依靠rowid来断点续传结果集数据,保证装载完成开启同步后源端数据库和目标端数据库的一致性,由此解决数据同步初始化装载时提取结果集报“快照过旧”错误的技术问题。附图说明图1是本发明实施例提供的一种基于rowid区间的初始化装载方法流程图;图2是本发明实施例提供的一种源端数据库支持闪回查询功能时的初始化装载方法流程图;图3是本发明实施例提供的一种源端数据库不支持闪回查询功能时的初始化装载方法流程图;图4是本发明实施例提供的一种基于rowid区间的初始化装载装置架构图。具体实施方式为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。实施例1数据同步时源端数据库到目的端数据库表的初始化装载和普通的两个数据库之间表数据的迁移存在很大区别,由于在初始化装载期间可能源表会不断被第三方应用修改,那么前者就需要考虑装载完成以后开启同步时源端和目的端数据的一致性;后者则只需要把当时那一刻的数据镜像复制到目的端就行。因此,前者在装载前需要记录下查询结果集对应的当前数据库的日志序列号(logsequencenumber,简写为lsn),以便在开启同步以后根据该lsn来过滤掉日志中已经装载的数据修改操作。由于装载以表为单位,所以每个表都会有一个独立的装载lsn,这些lsn会登记在目的端数据同步系统中;开启数据同步以后,目的端数据同步系统在接收到表的操作日志时,就可以通过操作日志对应事务的提交lsn来识别哪些操作是已经装载过的,装载过的日志直接丢弃不同步,从而保证了操作涉及的表在源端和目的端数据的一致性。为解决在装载过程中提取结果集时源数据库报“快照过旧”的错误给装载带来的影响,本发明采用依靠rowid来断点续传上一个结果集数据的方式,如果某个表装载期间报错“快照过旧”,那针对这个表把每次装载成功的行使用rowid来划分出一个区间存放到目的端数据同步系统中,并且为每个区间设置一个装载lsn。在装载完成开启同步后,目的端数据同步系统依据操作日志中的rowid值来定位它所属的装载rowid区间,然后找到该操作对应的装载lsn来实现过滤,从而保证从装载到同步过程中数据的一致性。基于上述思路,本发明实施例提供了一种基于rowid区间的初始化装载方法,如图1所示,主要包括以下步骤:步骤101,源端按照rowid从小到大的顺序查询待装载表中的数据,并提取结果集发送到目的端,直至结果集提取完成。数据库的表中的每一行数据都有一个唯一的标识符,就是rowid,也可称为行地址;通常情况下,该值在该行数据插入到数据库表时即被确定且唯一。rowid是一个伪列,它并不实际存在于表中,根据一行数据的rowid能找到一行数据的物理地址信息,从而快速地定位到数据行。rowid是某些数据库组织数据的方式,不同的数据库在rowid结构上有不同的体现形式,有的采用物理地址构成,例如oracke;有的采用逻辑整数,例如dm7、sqlserver等。其中,本发明仅针对rowid采用逻辑整数来组织的数据库,在这种数据库上,rowid永远保持递增,并且在全表查询时结果集中数据是按照rowid从小到大的顺序组织返回的。基于这个前提,当提取结果集报错时就可以利用rowid来断点续传。源端往往存在一个或多个待执行的事务,每个事务包含一个或多个针对待装载表的操作,每个操作对应拥有一个lsn,表示该操作的执行顺序,提交lsn则是指事务中提交操作的lsn;每个待装载表中包含一行或多行数据,每行数据对应一个rowid,且rowid按照从小到大的顺序递增。其中:如果源端数据库支持闪回查询功能,则数据查询和结果集提取的过程具体如下:首先,在源端查询当前事务的提交lsn,并将当前事务的提交lsn作为本轮查询的装载lsn;然后,源端按照rowid从小到大的顺序,利用本轮查询的装载lsn以闪回方式逐行查询待装载表中的数据,并提取结果集发送到目的端;其中,在提取结果集时,源端会记录下本轮查询中已成功提取到结果集的第一行数据的rowid值作为本轮查询的起始rowid。如果源端数据库不支持闪回查询功能,则数据查询和结果集提取的过程具体如下:首先,对源端数据库中的待装载表上s锁后,在源端查询当前事务的提交lsn,并将当前事务的提交lsn作为本轮查询的装载lsn;然后,源端执行用于查询待装载表的sql语句,按照rowid从小到大的顺序查询所述待装载表中的数据,并在释放s锁后提取结果集发送到目的端;其中,在提取结果集时,源端记录下本轮查询中已成功提取到结果集的第一行数据的rowid值作为本轮查询的起始rowid。步骤102,如果在提取结果集过程中报错“快照过旧”,则利用rowid将本轮查询中已成功提取到结果集的行划分出一个rowid区间,并将该rowid区间对应的装载lsn保存到目的端。如果在提取结果集过程中报错“快照过旧”,则将本轮查询中已成功提取到结果集的最后一行数据的rowid值作为本轮查询的终止rowid,从而利用本轮查询的起始rowid和终止rowid划分出一个rowid区间;然后源端将所述待装载表的表id以及本轮查询的装载lsn、起始rowid和终止rowid发送到目的端,由目的端保存到本地的同步表中,以便进行数据同步时使用。另外,如果在提取结果集过程中报错“快照过旧”,则根据本轮查询的终止rowid确定下一轮查询的起始rowid,对所述待装载表执行下一轮的数据查询,直至结果集提取完成;其中,如果本轮查询的终止rowid为x,则下一轮查询的起始rowid>x,确切地说是x+1。如果在提取结果集过程中未报错“快照过旧”,则在结果集提取完成后,将null值作为本轮查询的终止rowid,从而利用本轮查询的起始rowid和终止rowid划分出一个rowid区间。其中,null代表的是无限大,意思是指操作日志中提取的rowid只要大于等于起始rowid便归属于该区间。步骤103,开启数据同步后,目的端根据操作日志中的rowid值定位所属的rowid区间,并找到对应的装载lsn以实现数据同步的过滤。具体地,开启同步后,源端捕获源端数据库的操作日志,对所述操作日志解析后将获得的操作信息发送到目的端执行同步,其中所述操作信息包括该同步操作对应的事务id、表id、操作类型和操作数据,且所述操作数据中包含该数据在源表上的rowid值。目的端接收到源端发送来的操作信息后根据事务id进行分类管理,当接收到提交操作时,找到提交操作对应的事务准备执行;具体是依次执行该事务中的每个操作,使用操作对应的表id和rowid值在所述同步表中定位该操作所属的rowid区间,得到对应的装载lsn;然后对比该事务的提交lsn和装载lsn的大小,当提交lsn小于等于装载lsn时将该操作直接丢弃,否则执行入库,完成该操作的同步。本发明提供的初始化装载方法中,按照rowid从小大到的顺序对待装载表进行结果集的抽取;当抽取报“快照过旧”后,把当前成功抽取的这一部分采用rowid区间结合当前装载lsn保存到目的端,以便在开启同步后目的端可通过操作日志中的rowid值来定位所属的rowid区间以及装载lsn,进而根据该装载lsn对比实现精准过滤。通过依靠rowid来断点续传结果集数据,保证装载完成开启同步后源端数据库和目标端数据库的一致性,由此解决数据同步初始化装载时提取结果集报“快照过旧”错误的技术问题。实施例2在上述实施例1的基础上,本发明实施例进一步以源端数据库支持闪回查询功能时为例,对实施例1中基于rowid区间的初始化装载方法的完整步骤展开详细介绍。具体包括以下步骤:步骤201,分别在源端数据库及目的端数据库部署同步系统。其中,源端数据库同步系统用于从源端数据库读取操作日志,而目的端数据库同步系统则负责把源端发过来的同步操作应用到目的端数据库。为了方便后续操作,所述目的端数据库同步系统初始化时便在目的端创建一张同步表load_lsn,表结构如下:createtableload_lsn(objidint,lsnnumber(20),start_rowidnumber(20),end_rowid(20))。由此可知,所述同步表的表结构包括objid列、lsn列、start_rowid列和end_rowid列。其中,所述objid列用于存放所述待装载表的表id,所述lsn列用于存放对应rowid区间的装载lsn,所述start_rowid列用于存放对应rowid区间的起始rowid,所述end_rowid列用于存放对应rowid区间的终止rowid。步骤202,在源端数据库同步系统中查询源端数据库当前事务的提交lsn,并将该提交lsn作为本轮查询的装载lsn。步骤203,源端数据库同步系统按照rowid从小到大的顺序,利用步骤202中得到的本轮查询的装载lsn以闪回方式逐行查询所述待装载表中的数据;如果此时未设置查询的起始rowid,则进行整表查询,无需附加rowid的起始条件,否则需要增加起始rowid作为过滤条件。当源端数据库支持闪回查询功能时,直接获取源端数据库当前事务中各操作的lsn,然后再根据得到的装载lsn,通过对所述待装载表闪回查询的方式获得和lsn对应的数据镜像,可以避免对待装载表上s锁,从而减轻对源端数据库上生产系统的影响。步骤204,提取结果集发送到目的端,直至结果集提取完成,并在提取结果集时记录下本轮成功提取到结果集的第一行数据的rowid值作为本轮查询的起始rowid,即start_rowid。在整个表装载的过程中,由于采用依靠rowid来实现断点续传结果集数据的方式,如果某个表装载过程中多次报错“快照过旧”,那么除了第一次不需要指定起始rowid以外,其它情况下都需要将上一次提取到的最后一行数据的rowid加1作为下一次查询数据的起始rowid。步骤205,如果在提取结果集过程中报错“快照过旧”,则将本轮查询中已成功提取到结果集的最后一行数据的rowid值作为本轮查询的终止rowid,即end_rowid;否则,将null值作为本轮查询的终止rowid。因此,利用本轮查询的起始rowid和终止rowid可划分出一个rowid区间。其中,当终止rowid为null时,代表的是无限大,意思是从操作日志中提取的rowid只要大于等于对应的起始rowid便归属于该rowid区间。其中,如果在提取结果集过程中报错“快照过旧”,则根据本轮查询的终止rowid确定下一轮查询的起始rowid,即下一轮查询的起始rowid>本轮查询的终止rowid,然后跳转至步骤202执行下一轮的数据查询;否则,跳转至步骤207开启数据同步。步骤206,源端数据库同步系统将所述待装载表的表id以及本轮查询的装载lsn、起始rowid和终止rowid发送到目的端,由目的端保存到本地的同步表load_lsn中,以便进行数据同步时使用。步骤207,开启数据同步,源端数据库同步系统捕获源端数据库的操作日志,并将所述操作日志解析后发送到目的端执行同步。其中,对所述操作日志解析后可获取同步操作对应的事务id、表id、操作类型和操作数据,且所述操作数据中包含了该数据在源表上的rowid。步骤208,目的端数据库同步系统在接收到源端发送来的同步操作以后,根据同步操作所属的事务id进行分类管理;当接收到提交操作时,找到提交操作对应的事务准备执行。步骤209,目的端数据库同步系统依次执行该事务中的每个操作,使用操作对应的表id和rowid值在所述同步表load_lsn中定位该操作所属的rowid区间,然后得到对应的装载lsn。其中,定位rowid区间时采用以下公式:start_rowid≤操作rowid≤end_rowid。步骤210,对比该事务的提交lsn和装载lsn的大小,当提交lsn小于等于装载lsn时将该操作直接丢弃;否则执行入库,完成该操作的同步。这个判断的原理在于,在支持多版本特性的数据库中,在读提交的事务隔离级上,使用某个lsn值对表进行闪回查询时,查询结果集中会包含涉及该表的所有事务提交lsn小于等于该闪回lsn的修改操作。如果当时系统中某个事务针对表的修改操作lsn小于闪回lsn,但是该事务的提交lsn却大于闪回lsn,那么使用闪回lsn去闪回查询时,该事务的修改是不可见的,因为该事务在闪回的lsn上它还没有提交,读提交的事务隔离级只能查询到已经提交的事务修改记录。本发明实施例提供的上述初始化装载方法中,其原理主要是通过利用待装载表上逻辑rowid永远递增的特性,在装载报“快照过旧”错误时,使用提取成功的最后一行的rowid来划分出每个出错的rowid区间,结合每次查询时使用的闪回lsn,在开启同步以后能通过同步事务中的提交lsn和操作上的rowid定位装载区间实现精准过滤,从而避免“快照过旧”错误对初始化装载工作的影响。在传统方案中,同步初始化碰到“快照过旧”错误时,往往采用调整源端数据库的运行参数,比如扩展回滚段空间或延长回滚段空间释放时间等措施,但是这些措施的实施存在很大的不确定性,因为在生产系统调整这些运行参数往往得不到用户的同意;就算同意,调整以后再次装载依然无法避免再次报错。采用本发明实施例提供的方法可以有效处理“快照过旧”错误,采用rowid来续传结果集数据,还可以有效保留装载出错前的数据,不必像之前的方案调整参数以后还要清掉已经装载的数据以便“重头再来”,节约了装载的时间。下面对上述初始化装载方法的基本步骤作如下解释:首先,rowid是某些数据库组织数据的方式,不同的数据库在rowid的结构上有不同的体现形式,本发明仅针对rowid采用逻辑整数来组织的数据库。在这种数据库上rowid永远保持递增,并且在全表查询时,结果集中数据是按照rowid从小到大的形式组织返回的。当提取结果集报错时,就可以使用最后一行的rowid来重新续传上次的查询结果,只需要在下次查询时加入条件rowid>end_rowid就可以实现。这样不管表在装载期间报“快照过旧”多少次,都可以采用相应的rowid区间来划分表示。其次,在多版本特性的数据库上,采用先获取当前数据库最新的装载lsn,然后开始查询;那么语句开始执行时就可以固定该查询语句的数据可见范围为所有事务提交lsn小于等于该装载lsn,把该装载lsn发送到目的端;在开启数据同步以后,就可以根据上述原则来过滤操作日志中查询已经可见的操作,防止重复执行,实现装载和同步衔接后的数据一致性。结合装载时采用rowid区间的划分表示的方法,把每轮查询的装载lsn和rowid区间结合起来,实现解决数据装载时提取结果集报“快照过旧”错误的问题。实施例3在上述实施例2的基础上,本发明实施例提供了一种基于rowid区间的初始化装载方法的具体实例,以便更好理解整个装载过程。在该具体的实施例中,假设源端数据库和目的端数据库现都有表t(idint),表id为1000。为了展示方便,本发明实施例中将事务操作和表中数据以表格的形式进行展示。假设如表1所示,源端数据库的表t中有4行数据,rowid从第1行到第4行依次递增,分别为1、2、3、4。表1:rowidid110220330440基于上述待装载表,本发明实施例中的初始化装载过程具体如下:步骤301,先在源表上执行事务trx1操作:updatetsetid=11whereid=10;updatetsetid=31whereid=30;commit;事务trx1包含三个操作,此时源端数据库生成如表2所示的操作日志。表2:lsn操作日志lsn1updatetsetid=11whereid=10;lsn2updatetsetid=31whereid=30;lsn3commit;步骤302,开始装载,获取当前源端数据库的最新lsn=lsn3,即当前事务trx1的提交lsn=lsn3,并将lsn3作为第一轮查询的装载lsn。步骤303,执行第一轮查询:select*fromtasoflsn(lsn3),即从第一行开始逐行查询表t中的数据,并提取结果集发送到目的端。同时,将表t中第一行数据对应的rowid为1作为第一轮查询的start_rowid。步骤304,假如在提取表t中第三行数据时报错“快照过旧”,由于此时成功提取的最后一行数据为第二行,对应rowid为2,则将rowid为2作为第一轮查询的end_rowid。此时目的端load_lsn表中的记录如表3所示。表3:objidlsnstart_rowidend_rowid1000lsn312步骤305,继续在源表上执行事务trx2操作:updatetsetid=111whereid=11;updatetsetid=311whereid=31;commit;事务trx2包含三个操作,此时源端数据库生成如表4所示的操作日志。表4:lsn操作日志lsn4updatetsetid=111whereid=11;lsn5updatetsetid=311whereid=31;lsn6commit;步骤306,获取当前源端数据库的最新lsn=lsn6,即当前事务trx2的提交lsn=lsn6,并将lsn6作为第二轮查询的装载lsn。步骤307,利用第一轮查询的end_rowid=2确定第二轮查询起始的rowid,执行第二轮查询:select*fromtasoflsn(lsn6)whererowid>2,即从第三行开始逐行查询表t中的数据,并提取结果集发送到目的端。同时,将表t中第三行数据对应的rowid为3作为第二轮查询的start_rowid。步骤308,假如在第二轮提取过程中未报错,则结果集提取完成后,以null作为第二轮查询的end_rowid。此时目的端load_lsn表中的记录如表5所示。表5:objidlsnstart_rowidend_rowid1000lsn3121000lsn63null结合表1、表2和表4可知,按照上述步骤将表t装载完成后,源端数据和目的端数据分别如表6和表7所示。表6:rowidid11112203311440表7:rowidid1112203311440步骤309,开启数据同步。步骤310,先同步事务trx1,其提交lsn为lsn3。事务trx1第一个操作的rowid为1,在load_lsn表中可以定位到它的装载lsn为lsn3,与事务trx1的提交lsn相等,所以将该操作丢弃不执行。事务trx1第二个操作的rowid为3,在load_lsn表中可以定位到它的装载lsn为lsn6,大于事务trx1的提交lsn,所以将该操作丢弃不执行。步骤311,再同步事务trx2,其提交lsn为lsn6。事务trx2第一个操作的rowid为1,在load_lsn表中可以定位到它的装载lsn为lsn3,比事务trx2的提交lsn小,所以要执行该操作:updatetsetid=111whereid=11。事务trx2第二个操作的rowid为3,在load_lsn表中可以定位到它的装载lsn为lsn6,与事务trx2的提交lsn相等,所以将该操作丢弃不执行。按上述步骤完成数据同步以后,目的端数据如表8所示。表8:rowidid11112203311440由此可看出,此时目的端数据(表8)与源端数据(表6)保持一致,因此有效解决了“装载过旧”报错带来的影响。实施例4在上述实施例1的基础上,本发明实施例进一步以源端数据库不支持闪回查询功能时为例,对实施例1中基于rowid区间的初始化装载方法的完整步骤展开详细介绍。具体包括以下步骤:步骤401,分别在源端数据库及目的端数据库部署同步系统。其中,源端数据库同步系统用于从源端数据库读取操作日志,而目的端数据库同步系统则负责把源端发过来的同步操作应用到目的端数据库。为了方便后续操作,所述目的端数据库同步系统初始化时便在目的端创建一张同步表load_lsn,表结构如下:createtableload_lsn(objidint,lsnnumber(20),start_rowidnumber(20),end_rowid(20))。由此可知,所述同步表的表结构包括objid列、lsn列、start_rowid列和end_rowid列。其中,所述objid列用于存放所述待装载表的表id,所述lsn列用于存放对应rowid区间的装载lsn,所述start_rowid列用于存放对应rowid区间的起始rowid,所述end_rowid列用于存放对应rowid区间的终止rowid。步骤402,对源端数据库中的待装载表上s锁。步骤403,在源端数据库同步系统中查询源端数据库当前事务的提交lsn,并将该提交lsn作为本轮查询的装载lsn。当源端数据库不支持闪回查询功能时,可以先使用s锁来锁定待装载表,从而防止其它应用对该表的修改,保证在获得的装载lsn上这一时刻该表的数据是干净的。步骤404,源端数据库同步系统执行查询待装载表的sql语句,按照rowid从小到大的顺序逐行查询所述待装载表中的数据;如果此时未设置查询的起始rowid,则进行整表查询,无需附加rowid的起始条件,否则需要增加起始rowid作为过滤条件。步骤405,释放待装载表连接上的s锁,提取结果集发送到目的端,直至结果集提取完成,并在提取结果集时记录下本轮成功提取到结果集的第一行数据的rowid值作为本轮查询的起始rowid,即start_rowid。在多版本的数据库上,查询语句执行返回时,该查询语句的数据可见范围就已经被固定在这一刻,此时释放s锁后,其它应用对待装载表的修改对该查询语句来说都是不可见的,所以在开始提取结果集之前就应该释放该表的s锁,防止影响其它应用对该表的访问,避免在结果集提取期间对其它应用的影响。在整个表装载的过程中,由于采用依靠rowid来实现断点续传结果集数据的方式,如果某个表装载过程中多次报错“快照过旧”,那么除了第一次不需要指定起始rowid以外,其它情况下都需要将上一次提取到的最后一行数据的rowid加1作为下一次查询数据的起始rowid。步骤406,如果在提取结果集过程中报错“快照过旧”,则将本轮查询中已成功提取到结果集的最后一行数据的rowid值作为本轮查询的终止rowid,即end_rowid;否则,将null值作为本轮查询的终止rowid。因此,利用本轮查询的起始rowid和终止rowid可划分出一个rowid区间。当终止rowid为null时,代表的是无限大,意思是从操作日志中提取的rowid只要大于等于对应的起始rowid便归属于该rowid区间。其中,如果在提取结果集过程中报错“快照过旧”,则根据本轮查询的终止rowid确定下一轮查询的起始rowid,即下一轮查询的起始rowid>本轮查询的终止rowid,确切地说,下一轮查询的起始rowid应等于本轮查询的终止rowid加1;然后跳转至步骤402执行下一轮的数据查询;否则,跳转至步骤408开启数据同步。步骤407,源端数据库同步系统将所述待装载表的表id以及本轮查询的装载lsn、起始rowid和终止rowid发送到目的端,由目的端保存到本地的同步表load_lsn中,以便进行数据同步时使用。步骤408,开启数据同步,源端数据库同步系统捕获源端数据库的操作日志,并将所述操作日志解析后发送到目的端执行同步。其中,对所述操作日志解析后可获取同步操作对应的事务id、表id、操作类型和操作数据,且所述操作数据中包含了该数据在源表上的rowid。步骤409,目的端数据库同步系统在接收到源端发送来的同步操作以后,根据同步操作所属的事务id进行分类管理;当接收到提交操作时,找到提交操作对应的事务准备执行。步骤410,目的端数据库同步系统依次执行该事务中的每个操作,使用操作对应的表id和rowid值在所述同步表load_lsn中定位该操作所属的rowid区间,然后得到对应的装载lsn。其中,定位rowid区间时采用以下公式:start_rowid≤操作rowid≤end_rowid。步骤411,对比该事务的提交lsn和装载lsn的大小,当提交lsn小于等于装载lsn时将该操作直接丢弃;否则执行入库,完成该操作的同步。这个判断的原理在于,在支持多版本特性的数据库中,在读提交的事务隔离级上,先用s锁固定待装载表的数据,然后获得一个装载lsn,对待装载表查询时,查询结果集中会包含涉及该表的所有事务提交lsn小于等于该装载lsn的修改操作。在提取结果集之前释放s锁,在提取结果集期间其它应用对该表的修改将都不可见。本发明实施例提供的上述初始化装载方法中,其原理主要是通过利用待装载表上逻辑rowid永远递增的特性,在装载报“快照过旧”错误时,使用提取成功的最后一行的rowid来划分出每个出错的rowid区间,结合每次查询时使用的装载lsn,在开启同步以后能通过同步事务中的提交lsn和操作上的rowid定位装载区间实现精准过滤,从而避免“快照过旧”错误对初始化装载工作的影响。在传统方案中,同步初始化碰到“快照过旧”错误时,往往采用调整源端数据库的运行参数,比如扩展回滚段空间或延长回滚段空间释放时间等措施,但是这些措施的实施存在很大的不确定性,因为在生产系统调整这些运行参数往往得不到用户的同意;就算同意,调整以后再次装载依然无法避免再次报错。采用本发明实施例提供的方法可以有效处理“快照过旧”错误,采用rowid来续传结果集数据,还可以有效保留装载出错前的数据,不必像之前的方案调整参数以后还要清掉已经装载的数据以便“重头再来”,节约了装载的时间。下面对上述初始化装载方法的基本步骤作如下解释:首先,rowid是某些数据库组织数据的方式,不同的数据库在rowid的结构上有不同的体现形式,本发明仅针对rowid采用逻辑整数来组织的数据库。在这种数据库上rowid永远保持递增,并且在全表查询时,结果集中数据是按照rowid从小到大的形式组织返回的。当提取结果集报错时,就可以使用最后一行的rowid来重新续传上次的查询结果,只需要在下次查询时加入条件rowid>end_rowid就可以实现。这样不管表在装载期间报“快照过旧”多少次,都可以采用相应的rowid区间来划分表示。其次,在多版本特性的数据库上,采用先将待装载表上s锁,然后再获取当前数据库最新的装载lsn开始查询;那么语句开始执行时就可以固定该查询语句的数据可见范围为所有事务提交lsn小于等于该装载lsn,把该装载lsn发送到目的端;在开启数据同步以后,就可以根据上述原则来过滤操作日志中查询已经可见的操作,防止重复执行,实现装载和同步衔接后的数据一致性。结合装载时采用rowid区间的划分表示的方法,把每轮查询的装载lsn和rowid区间结合起来,实现解决数据装载时提取结果集报“快照过旧”错误的问题。实施例5在上述实施例4的基础上,本发明实施例提供了一种基于rowid区间的初始化装载方法的具体实例,以便更好理解整个装载过程。其中,为了展示方便,本发明实施例中将事务操作和表中数据以表格的形式进行展示,且涉及的表与实施例3中相同,因此可参考实施例3中的各个表格。在该具体的实施例中,假设源端数据库和目的端数据库现都有表t(idint),表id为1000。假设如表1所示,源端数据库的表t中有4行数据,rowid从第1行到第4行依次递增,分别为1、2、3、4。基于上述待装载表,本发明实施例中的初始化装载过程具体如下:步骤501,先在源表上执行事务trx1操作:updatetsetid=11whereid=10;updatetsetid=31whereid=30;commit;事务trx1包含三个操作,此时源端数据库生成如表2所示的操作日志。步骤502,开始装载,对表t上s锁,执行locktabletinsharemode。步骤503,获取当前源端数据库的最新lsn=lsn3,即当前事务trx1的提交lsn=lsn3,并将lsn3作为第一轮查询的装载lsn。步骤504,执行第一轮查询:select*fromt,从第一行开始逐行查询表t中的数据。步骤505,释放表t的s锁,执行commit。步骤506,提取结果集发送到目的端,并将表t中第一行数据对应的rowid为1作为本轮查询的start_rowid。步骤507,假如在提取表t中第三行数据时报错“快照过旧”,由于此时成功提取的最后一行数据为第二行,对应rowid为2,则将rowid为2作为本轮查询的end_rowid;此时目的端load_lsn表中的记录如表3所示。步骤508,继续在源表上执行事务trx2操作:updatetsetid=111whereid=11;updatetsetid=311whereid=31;commit;事务trx2包含三个操作,此时源端数据库生成如表4所示的操作日志。步骤509,对表t上s锁,执行locktabletinsharemode。步骤510,获取当前源端数据库的最新lsn=lsn6,即当前事务trx2的提交lsn=lsn6,并将lsn6作为第二轮查询的装载lsn。步骤511,利用第一轮查询的end_rowid=2确定第二轮查询起始的rowid,执行第二轮查询:select*fromtwhererowid>2,即从第三行开始逐行查询表t中的数据。步骤512,释放表t的s锁,执行commit。步骤513,提取结果集发送到目的端,并将表t中第三行数据对应的rowid为3作为第二轮查询的start_rowid。步骤514,假如在第二轮提取过程中未报错,则结果集提取完成后,以null作为第二轮查询的end_rowid。此时目的端load_lsn表中的如表5所示。结合表1、表2和表4可知,按照上述步骤将表t装载完成后,源端数据和目的端数据分别如表6和表7所示。步骤515,开启数据同步。步骤516,先同步事务trx1,其提交lsn为lsn3。事务trx1第一个操作的rowid为1,在load_lsn表中可以定位到它的装载lsn为lsn3,与事务trx1的提交lsn相等,所以将该操作丢弃不执行。事务trx1第二个操作的rowid为3,在load_lsn表中可以定位到它的装载lsn为lsn6,大于事务trx1的提交lsn,所以将该操作丢弃不执行。步骤517,再同步事务trx2,其提交lsn为lsn6。事务trx2第一个操作的rowid为1,在load_lsn表中可以定位到它的装载lsn为lsn3,比事务trx2的提交lsn小,所以要执行该操作:updatetsetid=111whereid=11。事务trx2第二个操作的rowid为3,在load_lsn表中可以定位到它的装载lsn为lsn6,与事务trx2的提交lsn相等,所以将该操作丢弃不执行。按上述步骤完成数据同步以后,目的端数据如表8所示。由此可看出,此时目的端数据(表8)与源端数据(表6)保持一致,因此有效解决了“装载过旧”报错带来的影响。实施例6在上述实施例1-实施例5提供的基于rowid区间的初始化装载方法的基础上,本发明还提供了一种可用于实现上述方法的基于rowid区间的初始化装载装置,如图4所示,是本发明实施例的装置架构示意图。本实施例的基于rowid区间的初始化装载装置包括一个或多个处理器21以及存储器22。其中,图4中以一个处理器21为例。所述处理器21和所述存储器22可以通过总线或者其他方式连接,图4中以通过总线连接为例。所述存储器22作为一种基于rowid区间的初始化装载方法非易失性计算机可读存储介质,可用于存储非易失性软件程序、非易失性计算机可执行程序以及模块,如实施例1中的基于rowid区间的初始化装载方法。所述处理器21通过运行存储在所述存储器22中的非易失性软件程序、指令以及模块,从而执行基于rowid区间的初始化装载装置的各种功能应用以及数据处理,即实现实施例1-实施例5的基于rowid区间的初始化装载方法。所述存储器22可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实施例中,所述存储器22可选包括相对于所述处理器21远程设置的存储器,这些远程存储器可以通过网络连接至所述处理器21。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。所述程序指令/模块存储在所述存储器22中,当被所述一个或者多个处理器21执行时,执行上述实施例1中的基于rowid区间的初始化装载方法,例如,执行以上描述的图1-图3所示的各个步骤。本领域普通技术人员可以理解实施例的各种方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:只读存储器(rom,readonlymemory)、随机存取存储器(ram,randomaccessmemory)、磁盘或光盘等。本领域的技术人员容易理解,以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1