在线创建索引的实现方法与流程

文档序号:26589809发布日期:2021-09-10 20:32阅读:100来源:国知局
在线创建索引的实现方法与流程

1.本发明涉及一种数据库索引表创建方法,更具体的说,本发明主要涉及一种在线创建索引的实现方法。


背景技术:

2.在sql on hbase数据库上创建索引,为了保证索引和原表的数据一致性,通常是通过锁表的方式来实现,但是这样会影响实时交易。传统的关系型数据库为了做到不锁表,降低对实时交易的影响,通常会通过创建临时表、日志回放或者两次读原表的方式来创建索引。但是sql on hbase数据库上的索引和传统数据库不同,是以表的形式存在的,所以传统数据库上的在线创建索引的方法在sql on hbase数据库上可以参考,但不一定是最好的方式。传统数据库的创建在线索引的三种方式都能不同程度的降低对实时交易的影响,但是也存在一些缺陷。其中一种是基于临时表的在线创建索引的方案需要将原表的数据导出到临时表中,如果表比较大,对空间的要求比较高。另一种是基于日志回放的在线创建索引的方案在将表里的记录插入到索引的过程中,需要将更新的记录记入日志当中,在表里的记录扫描完毕,会重放日志当中的记录修改,并记入索引。在重放日志的最后阶段还是需要锁表,虽然减少了锁表的时间,但是还是会对交易有一定影响。还有一种是基于两次读原表的方式在线创建索引的方案,第一次扫描表前先开启事务1,拿到当前shanpshot1,扫描前还需要等待所有修改过该表的事务结束,扫描该表,创建索引,不阻塞读写,结束事务1。第二次扫描该表前需要开启事务2,拿到当前的snapshot2,再次扫描该表前还需要等待所有修改过该表的事务结束。最后更新索引结束后,还需要等待事务2之前开启的持有snapshot的事务结束。创建索引的过程需要两次扫描,三次等待。每一次扫描的过程中出现问题都会对dml有影响。因此有必要针对sql on hbase数据库的表创建索引会影响实时交易的问题进行研究和改进。


技术实现要素:

3.本发明的目的之一在于解决上述不足,提供一种在线创建索引的实现方法,以期望解决现有技术中同类数据库在线索引创建方法中的锁表,或者不锁表采用临时表、日志回放、两次读取原表等方式仍然对实时交易产生影响,不利于sql on hbase数据库在电子商务平台中的使用等技术问题。
4.为解决上述的技术问题,本发明采用以下技术方案。
5.本发明所提供的一种在线创建索引的实现方法,方法包括如下步骤。
6.步骤a、根据数据库中原表索引的定义,创建与索引相对应的实体索引表。
7.步骤b、生成索引表的元数据信息,将索引表的状态设为“维护”,并同步索引表的状态信息到各个服务进程中,且当前状态的索引表只接受插入、删除和更新的sql感知。
8.步骤c、读取扫描原表中的记录数据并同步至索引表中,且在同步过程中,如索引表中没有此前插入原表的数据,则将数据插入索引表中,反之则不做进一步处理;继续读取
扫描原表,直至同步完成。
9.步骤d、读取扫描同步后的索引表中的数据,如索引表存在原表中不存在的数据,则作为无效数据删除,反之则继续读取扫描同步后的索引表中的数据,直至无效数据删除完成,索引表创建完成。
10.作为优选,进一步的技术方案是:所述步骤e、将索引表的状态更新为“有效”,并同步当前索引表的状态信息到各个服务进程中,此时查询的sql可使用该索引。
11.更进一步的技术方案是:所述b中插入的sql感知为在原表上插入数据时,同时向索引表中插入同样的数据;删除的sql感知为在原表上删除数据时,同时删除索引表中的相同数据;如索引表中无对应的数据,则不作处理;更新的sql感知为在原表上更新数据时,如索引表中具有对应的数据需要同时更新,则先删除索引表中的原数据,然后再插入新的数据;如删除时索引表中无对应的数据,则直接向索引表中插入新的数据。
12.更进一步的技术方案是:所述步骤b中插入、删除与更新的数据为实时交易记录数据。
13.更进一步的技术方案是:所述步骤b将索引表的状态设为“维护”后,如有正在处理的关联sql,进行重新编译,重新执行并插入或更新至索引表中;如同步之前已经处理的sql,则不再插入或更新至索引表中。
14.更进一步的技术方案是:所述步骤c中为将原表在一个时刻的历史记录同步至索引表中,且如索引表中没有此前插入原表的数据,则将数据插入索引表中,在插入成功后,继续扫描原表中的记录数据,反之则回滚事务继续判断索引表中是否有此前插入原表的数据。
15.更进一步的技术方案是:所述步骤d中如索引表存在原表中不存在的数据,则作为无效数据删除,在删除成功后则继续同步后的索引表中的数据,反之则回滚事务继续判断索引表中是否存在原表中不存在的数据。
16.更进一步的技术方案是:所述步骤a中如创建索引表失败,则删除当前索引表,重复步骤a重新创建新索引表。
17.更进一步的技术方案是:所述步骤b中如索引表的状态设为“维护”后,同步当前索引表的状态信息到各个服务进程时失败时,或者步骤c中如读取扫描原表中的记录数据并同步至索引表中时失败时,则均首先等待所有sql事务终止,然后将索引表的状态设为“失效”,最后删除当前索引表,重复步骤a重新创建新索引表。
18.与现有技术相比,本发明的有益效果之一是:以索引原表为一张单独表为前提,通过增加索引原表的“维护”状态,以分阶段维护索引的方式来实现索引表在线创建而不影响交易,且通过历史数据同步再删除无效数据的方式,确保索引表与原表的数据一致,使得sql on hbase数据库在线创建索引的过程中无需锁表,且不依赖于临时表或日志,亦不影响数据库交易正常进行,同时本发明所提供的一种在线创建索引表的实现方法易于实施,可在各类电商sql on hbase数据库中进行索引在线创建,应用范围广阔。
附图说明
19.图1为用于说明本发明一个实施例的方法流程图。
20.图2为用于说明本发明一个实施例中读取历史数据的逻辑流程图。
21.图3为用于说明本发明一个实施例中删除无效数据的逻辑流程图。
具体实施方式
22.本发明所提供的是一种在线创建索引的实现方法,属于sql on hbase数据库的技术领域。sql on hbase数据库是上层提供传统的关系型数据库sql引擎,而存储引擎是架构在hbase之上,它可以很好的对ansi

sql标准以及事务进行支持,同时又可以很好的利用hbase的分布式架构来提供很方便的扩展性。在sql on hbase数据库上,索引是作为一张单独的表存在的,通过主键和原表关联。在线创建索引是指在生产环境中,不停服务,创建索引的过程中不会影响交易的进行,即并不影响dml操作。本发明的方法基于索引是以一张单独的表的存在方式,通过增加索引的一种“仅可维护”状态,在索引的创建过程中,索引处于“仅可维护”状态的索引只出现在增加、删除和更新的sql的执行计划中,对于查询sql,索引不可见。通过增加索引的状态,可以保证实时交易会被同步到索引中,但是又不影响查询交易,基本可以做到创建索引的过程中不影响实时交易。通过前述的方式提供一种在线创建索引的新思路,在创建索引的过程中,不需要创建临时表,也不需要锁表,更不需要等待现有的事务结束,对基于数据库访问的实时交易几乎没有影响。
23.在本发明中提到的几个概念。
24.索引:sql on hbase里的index是一张单独的表,index通过主键和基表进行关联。
25.索引表:sql on hbase数据库里存储索引数据的表,索引表在数据库的内部是可以作为一张单独的表访问的。
26.索引状态:索引状态是用来标识索引当前是否可用。索引状态可以是:“有效”,“无效”和“维护”。
27.基于上述的在线索引创建思路,本发明的一个实施例是一种在线创建索引表的实现方法,该方法通过增加索引状态,分阶段维护索引的方式来保证不影响实时交易,并确保索引的数据最终和原表一致,在本实施例中,参考图1所示,方法是按照如下步骤进行的。
28.步骤s1、一般而言,sql on hbase数据库具有一张原表,而正如上述所提到的,索引是作为一张单独的表存在的,且通过主键和原表关联,因此可根据数据库中原表索引的定义,创建与索引相对应的实体索引表。
29.步骤s2、在本步骤中,首先生成索引表的元数据信息,然后将索引表的状态设为“维护”,并同步当前索引表的“维护”状态信息到各个服务进程中,此时在“维护”状态下,前述索引表只接受插入、删除和更新的sql感知,不接受查询的sql。
30.此处需要说明到而是,本步骤中插入、删除与更新的数据为实时交易记录数据。并且,插入的sql感知为在原表上插入数据时,同时向索引表中插入同样的数据。删除的sql感知为在原表上删除数据时,同时删除索引表中的相同数据;如索引表中无对应的数据,则不作处理;更新的sql感知为在原表上更新数据时,如索引表中具有对应的数据需要同时更新,则先删除索引表中的原数据,然后再插入新的数据;如删除时索引表中无对应的数据,则直接向索引表中插入新的数据。
31.进一步的,上述将索引表的状态设为“维护”后,如有正在处理的关联sql,进行重新编译,重新执行并插入或更新至索引表中;如同步之前已经处理的sql,则不再插入或更新至索引表中。
32.步骤s3、在前一个步骤已经将同步索引表状态之后的交易信息记录到索引表中;因此在本步骤中,读取扫描原表中的记录数据并同步至索引表中,且在同步过程中,如索引表中没有此前插入原表的数据,则将数据插入索引表中,反之则不做进一步处理;继续读取扫描原表,直至同步完成。
33.结合图2所示,在本步骤中优选的是,上述通过merge的方式把原表里某一时刻的历史记录同步到索引表当中,同步的过程中会通过snapshot读取原表里所有的记录同步到索引当中。如索引表中没有此前插入原表的数据,则将数据插入索引表中,在插入成功后,继续扫描原表中的记录数据,反之则回滚事务继续判断索引表中是否有此前插入原表的数据。具体可参见图2所示的逻辑流程。即在同步的过程中,数据中可能包含前面实时交易里已经插入索引表的数据,因此合并的时候,如果索引表里已经有相应的记录,不做进一步处理;如果索引表里没有对应的记录,则将该记录插入到索引表当中。
34.步骤s4、由于同步历史数据的过程是通过读取snapshot的方式实现的,但是更新的过程中,实时交易可能将历史记录里的部分记录更新或删除,这就会导致索引里包含部分无效的数据。因此在本步骤中仍然通过snapshot的方式读取扫描同步后的索引表中的数据,如索引表存在原表中不存在的数据,则作为无效数据删除,反之则继续读取扫描同步后的索引表中的数据,直至无效数据删除完成;此时数据库的索引表在线创建完成。
35.结合图3所示,在本步骤中优选的是,上述如索引表存在原表中不存在的数据,则作为无效数据删除,在删除成功后则继续同步后的索引表中的数据,反之则回滚事务继续判断索引表中是否存在原表中不存在的数据,具体可参见图3所示的逻辑流程。
36.步骤s5、通过上述方式在线创建生成索引表后,再将原表的状态更新为“有效”,并同步当前原表的状态信息到各个服务进程中。正如上述步骤s2提到的,索引表在“维护”状态下,索引表只接受插入、删除和更新的sql感知,不接受查询的sql。而在本中步骤中当上述在线创建的索引表的状态更新回“有效”后,则查询的sql可使用该索引,执行查询操作。
37.在本发明用于解决技术问题更加优选的一个实施例中,发明人还考虑到在方法中的创建索引表、更改索引表状态、同步数据历史数据等步骤中出错时的应对方式,经过试验以及对于sql on hbase数据库特性的研究,在上述方法的基础上,如果在上述步骤s1中如创建索引表失败,则删除当前索引表,重复上述步骤s1重新创建新索引表。如果上述步骤s2中如索引表的状态设为“维护”后,同步当前索引表的“维护”状态信息到各个服务进程时失败,或者上述步骤s3中如读取扫描原表中的记录数据并同步至索引表中时失败,则均首先等待所有sql事务终止,然后将索引表的状态设为“失效”,最后删除当前索引表,重复步骤s1开始重新创建新索引表,然后继续执行上述步骤s2至步骤s4。
38.换言之,在线创建索引的过程中如果出错,会根据出错的不同阶段做不同的处理。在创建索引表的阶段出错,如果索引表已经创建完成,还未同步索引状态到“维护”,只需要把当前的索引表删掉,重建索引即可。如果索引表的状态已经同步到“维护”状态,首先需要将索引表失效,索引表失效以前要等待所有相关的事务终止,索引表失效后再删除重建即可。如果在同步历史数据阶段出错,同样需要按前述方式先将索引表失效,然后再将其删除重建即可。从而当在线创建索引表出错时,在不同的步骤均可将已创建的索引表删除,然后再重新创建。
39.正如上述实施例所描述的,本发明通过在sql on hbase数据库上给索引增加一种
新的状态“维护”,从而做到将实时交易信息更新到索引中,然后同步历史数据到索引中,再删除索引的无效数据。可以保证实时交易会被同步到索引中,但是又不影响查询交易,基本可以做到创建索引的过程中不影响实时交易。在线创建索引的过程中不需要创建临时表、不需要锁表、也不需要等待现有的事务结束,对实时交易没有影响。
40.除上述以外,还需要说明的是在本说明书中所谈到的“一个实施例”、“另一个实施例”、“实施例”等,指的是结合该实施例描述的具体特征、结构或者特点包括在本技术概括性描述的至少一个实施例中。在说明书中多个地方出现同种表述不是一定指的是同一个实施例。进一步来说,结合任一实施例描述一个具体特征、结构或者特点时,所要主张的是结合其他实施例来实现这种特征、结构或者特点也落在本发明的范围内。
41.尽管这里参照本发明的多个解释性实施例对本发明进行了描述,但是,应该理解,本领域技术人员可以设计出很多其他的修改和实施方式,这些修改和实施方式将落在本技术公开的原则范围和精神之内。更具体地说,在本技术公开、附图和权利要求的范围内,可以对主题组合布局的组成部件和/或布局进行多种变型和改进。除了对组成部件和/或布局进行的变型和改进外,对于本领域技术人员来说,其他的用途也将是明显的。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1