一种在OpenGauss数据库分区表上在线创建全局索引的方法与流程

文档序号:30507651发布日期:2022-06-25 00:50阅读:333来源:国知局
一种在OpenGauss数据库分区表上在线创建全局索引的方法与流程
一种在opengauss数据库分区表上在线创建全局索引的方法
技术领域
1.本发明涉及数据库索引创建技术领域,尤其涉及一种在opengauss数据库分区表上在线创建全局索引的方法。


背景技术:

2.传统的分区表创建全局索引的方式如下:接收用户创建索引的请求,启动事务t,对分区表添加sharelock锁,校验请求合法性,创建索引元数据,对分区表中的数据创建索引条目,释放锁并提交事务。该过程非常简洁,但由于对分区表添加了sharelock锁,使得在创建索引的过程中,无法对分区表进行数据的插入、删除或更新操作,倘若发生上述操作,对应的事务需要等待创建索引的事务结束后才能继续执行。在分区表数据量很小或者创建索引耗时比较短的情况下,等待时间相应较短,若分区表数据量很大(例如tb级),创建索引的时间会非常长,在生产环境执行创建索引的操作会导致业务阻塞,这是无法接受的。
3.因此,如何提供一种不阻塞业务的创建索引方法,成为亟待解决的技术问题。


技术实现要素:

4.有鉴于此,本发明针对现有技术中存在的缺点,提供了一种在opengauss数据库分区表上在线创建全局索引的方法,能够避免在创建索引时阻塞业务的问题。
5.一方面,本发明提供一种在opengauss数据库分区表上在线创建全局索引的方法,包括:
6.步骤1:为待创建的索引写入元数据;
7.步骤2:对分区表中已经存在的数据创建索引条目;
8.步骤3:对创建索引时并发新增或修改的数据创建索引条目;
9.步骤4:将该索引置为可用。
10.进一步地,本发明方法的步骤1中,为待创建的索引写入元数据,包括:
11.步骤101:接收来自用户的分区表在线创建全局索引请求,启动事务t1;
12.步骤102:对分区表加shareupdateexclusivelock锁;
13.步骤103:获取索引字段信息,进行合法性校验,将索引元数据信息写入数据字典,对分区表加shareupdateexclusivelock会话锁,提交事务t1。
14.进一步地,本发明方法的步骤2中,对分区表中已经存在的数据创建索引条目,包括:
15.步骤201:启动事务t2,等待之前并发的对该分区表进行增加、删除或修改数据的事务结束,获取快照s1;
16.步骤202:leader线程根据分区统计信息,计算需要的一类follower数量;
17.步骤203:每个一类follower线程以分区为单位对分区中对快照s1可见的数据创建索引条目,每个一类follower线程对自身创建的所有索引条目进行排序,并将得到的索引排序结果以临时文件的形式传递给leader线程后退出;
18.步骤204:leader线程将所有一类follower线程的索引排序结果进行排序得到全部有序的索引条目,并将索引元数据置为可写状态,提交事务t2。
19.进一步地,本发明方法的步骤202中,所述一类follower线程数量不超过系统设置的阈值。
20.进一步地,本发明方法的步骤203中,所述索引条目包含所属分区的唯一标识oid,每个一类follower线程维护一块内存用于存储创建的索引条目。
21.进一步地,本发明方法的步骤203中,当所述一类follower线程维护的内存不足时,将当前存储的索引条目按照索引字段排序后写入临时文件,重置内存用于后续存储索引条目。
22.进一步地,本发明方法的步骤s3中,对创建索引时并发新增或修改的数据创建索引条目,包括:
23.步骤301:启动事务t3,等待可能在事务t2后启动的并发事务结束,这些事务包括对分区表进行增加、删除或修改数据的事务,获取快照s2;
24.步骤302:leader线程遍历步骤2中创建的索引条目,并将所述索引条目按照分区划分为多个部分,根据分区统计信息,计算需要的二类follower数量;
25.步骤303:每个二类follower线程以分区为单位对该分区内的索引条目按照索引对应的分区数据的物理位置进行排序;
26.步骤304:二类follower线程从头开始遍历对应的分区对快照s2可见的数据,判断该数据是否已经创建索引条目,若未创建则创建并插入索引中;
27.步骤305:leader线程等待所有二类follower线程处理完成后提交事务t3。
28.进一步地,本发明方法的步骤302中,所述二类follower线程数量不超过系统设置的阈值。
29.进一步地,本发明方法的步骤s4中,将该索引置为可用,包括:启动事务t4,等待所有持有比快照s2还旧的快照的事务结束,将索引isvalid置为true,释放对分区表添加的shareupdateexclusivelock会话锁,提交事务t4。
30.另一方面,本发明还提供一种计算机设备,包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述处理器执行所述程序时实现所述方法的步骤。
31.本发明的在opengauss数据库分区表上在线创建全局索引的方法,具有以下优点:
32.1)通过调整创建索引期间对分区表加锁的模式,将sharelock改为shareupdateexclusivelock,引入会话锁,避免了阻塞对分区表数据的新增、修改或删除,同时保证创建索引期间分区表定义不会被修改或删除;
33.2)将创建索引的过程由传统方法中的一个事务拆解为四个事务,通过事务t2、t3和t4阶段的等待,保证了创建的索引的正确性;
34.3)通过leader线程创建follower线程并行处理提升了在线创建索引的效率。
附图说明
35.为了更清楚地说明本发明实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域
普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它的附图。
36.图1为根本发明示例性第一实施例的在opengauss数据库分区表上在线创建全局索引的方法的流程图;
37.图2为根据本发明示例性第二实施例的在opengauss数据库分区表上在线创建全局索引的方法的流程图;
38.图3为根据本发明示例性第三实施例的在opengauss数据库分区表上在线创建全局索引的方法的流程图;
39.图4为根据本发明示例性第三实施例的在opengauss数据库分区表上在线创建全局索引的方法的流程图。
具体实施方式
40.下面结合附图对本发明实施例进行详细描述。
41.需说明的是,在不冲突的情况下,以下实施例及实施例中的特征可以相互组合;并且,基于本公开中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本公开保护的范围。
42.需要说明的是,下文描述在所附权利要求书的范围内的实施例的各种方面。应显而易见,本文中所描述的方面可体现于广泛多种形式中,且本文中所描述的任何特定结构及/或功能仅为说明性的。基于本公开,所属领域的技术人员应了解,本文中所描述的一个方面可与任何其它方面独立地实施,且可以各种方式组合这些方面中的两者或两者以上。举例来说,可使用本文中所阐述的任何数目个方面来实施设备及/或实践方法。另外,可使用除了本文中所阐述的方面中的一或多者之外的其它结构及/或功能性实施此设备及/或实践此方法。
43.本发明实施例涉及的名词解释如下:
44.事务:数据库的事务(transaction)是一种机制、一个操作序列,包含了一组数据库操作命令。事务把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行,因此事务是一个不可分割的工作逻辑单元。
45.快照:快照是数据库中实现事务隔离和并发控制的技术,快照记录了数据库运行时某个时刻点的状态,通过快照可以判断数据在事务中的可见性。
46.索引:索引是为了提升数据库中数据检索效率的辅助数据,有两种基本的索引类型:顺序索引和散列索引,本发明只涉及顺序索引。
47.锁:一种在事务期间持有的防止共享数据被并发修改的机制。shareupdateexclusivelock是一种锁的模式,该模式的锁不会阻塞对表数据的新增、修改或删除操作,但会阻塞对表定义的修改或删除。
48.会话锁:一种在会话期间持有的防止共享数据被并发修改的机制,可以跨事务存在。sharelock是一种锁模式,该模式的锁会阻塞对表数据的新增、修改或删除操作,也会阻塞对表定义的修改或删除。
49.leader线程:指创建索引过程中负责管理所有数据和事务的线程。
50.一类或二类follower线程:指由leader线程根据需要创建的后台工作线程。
51.图1为根据本发明示例性第一实施例的一种在opengauss数据库分区表上在线创
建全局索引的方法的流程图,如图1所示,本实施例的方法包括:
52.步骤1:为待创建的索引写入元数据;
53.步骤2:对分区表中已经存在的数据创建索引条目;
54.步骤3:对创建索引时并发新增或修改的数据创建索引条目;
55.步骤4:将该索引置为可用。
56.具体的,本实施例方法的步骤s4中,将该索引置为可用,包括:启动事务t4,等待所有持有比快照s2还旧的快照的事务结束,将索引isvalid置为true,释放对分区表添加的shareupdateexclusivelock会话锁,提交事务t4。
57.图2为根据本发明示例性第二实施例的一种在opengauss数据库分区表上在线创建全局索引的方法的流程图,图2为图1所示方法的优选实施例,如图1和图2所示,本实施例方法的步骤1中,为待创建的索引写入元数据,包括:
58.步骤101:接收来自用户的分区表在线创建全局索引请求,启动事务t1;
59.步骤102:对分区表加shareupdateexclusivelock锁;
60.步骤103:获取索引字段信息,进行合法性校验,将索引元数据信息写入数据字典,对分区表加shareupdateexclusivelock会话锁,提交事务t1。
61.图3为根据本发明示例性第三实施例的一种在opengauss数据库分区表上在线创建全局索引的方法的流程图,图3为图1和图2所示方法的优选实施例,本实施例方法的步骤2中,对分区表中已经存在的数据创建索引条目,包括:
62.步骤201:启动事务t2,等待之前并发的对该分区表进行增加、删除或修改数据的事务结束,获取快照s1;
63.步骤202:leader线程根据分区统计信息,计算需要的一类follower数量;
64.步骤203:每个一类follower线程以分区为单位对分区中对快照s1可见的数据创建索引条目,每个一类follower线程对自身创建的所有索引条目进行排序,并将得到的索引排序结果以临时文件的形式传递给leader线程后退出;
65.步骤204:leader线程将所有一类follower线程的索引排序结果进行排序得到全部有序的索引条目,并将索引元数据置为可写状态,提交事务t2。
66.具体操作时,本实施例方法可以有如下多种优选方式中的任何一种,具体包括:
67.本实施例方法的步骤202中,一类follower线程数量不超过系统设置的阈值。
68.本实施例方法的步骤203中,所述索引条目包含所属分区的唯一标识oid,每个一类follower线程维护一块内存用于存储创建的索引条目。
69.本实施例方法的步骤203中,当所述一类follower线程维护的内存不足时,将当前存储的索引条目按照索引字段排序后写入临时文件,重置内存用于后续存储索引条目。
70.本实施例方法的步骤204中,将索引元数据置为可写状态,通过将索引元数据的isready标记置为true实现。
71.图4为根据本发明示例性第四实施例的一种在opengauss数据库分区表上在线创建全局索引的方法的流程图,图4为图1、图2和图3所示方法的优选实施例,本实施例方法的步骤s3中,对创建索引时并发新增或修改的数据创建索引条目,包括:
72.步骤301:启动事务t3,等待可能在事务t2后启动的并发事务结束,这些事务包括对分区表进行增加、删除或修改数据的事务,获取快照s2;
73.步骤302:leader线程遍历步骤2中创建的索引条目(此时并发事务会更新索引),并将所述索引条目按照分区划分为多个部分,根据分区统计信息,计算需要的二类follower数量;
74.步骤303:每个二类follower线程以分区为单位对该分区内的索引条目按照索引对应的分区数据的物理位置进行排序;
75.步骤304:二类follower线程从头开始遍历对应的分区对快照s2可见的数据,判断该数据是否已经创建索引条目,若未创建则创建并插入索引中;
76.步骤305:leader线程等待所有二类follower线程处理完成后提交事务t3。
77.具体操作时,本实施例方法的步骤302中,二类follower线程数量不超过系统设置的阈值。
78.另一方面,本发明还提供一种计算机设备,包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述处理器执行所述程序时实现所述方法的步骤。
79.该计算机设备具有上述在opengauss数据库分区表上在线创建全局索引的方法相应的技术效果。
80.以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以权利要求的保护范围为准。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1