CN105373566B - 在线重建索引方法及装置 - Google Patents
在线重建索引方法及装置 Download PDFInfo
- Publication number
- CN105373566B CN105373566B CN201410438770.4A CN201410438770A CN105373566B CN 105373566 B CN105373566 B CN 105373566B CN 201410438770 A CN201410438770 A CN 201410438770A CN 105373566 B CN105373566 B CN 105373566B
- Authority
- CN
- China
- Prior art keywords
- index
- data
- tables
- shadow
- entry address
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/22—Indexing; Data structures therefor; Storage structures
- G06F16/2228—Indexing structures
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/23—Updating
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/22—Indexing; Data structures therefor; Storage structures
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/22—Indexing; Data structures therefor; Storage structures
- G06F16/2282—Tablespace storage structures; Management thereof
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Data Mining & Analysis (AREA)
- Databases & Information Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Software Systems (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种在线重建索引的方法和装置,包括:接收在线重建索引请求,根据所述在线重建索引请求,对所述数据表的标识对应的数据表加架构共享锁;获得闩锁,通过所述闩锁获得所述数据表的结构控制权;在所述获得闩锁后,为所述数据表的原始索引预留影子索引存储空间,分配影子索引的入口地址,在所述数据表的根页上添加所述影子索引的入口地址;在完成在所述数据表的根页上添加所述影子索引的入口地址后,释放所述闩锁;根据所述原始索引的数据,在所述影子索引存储空间中创建影子索引;在重新获得闩锁后,将所述数据表的根页的索引入口地址更新为影子索引入口地址;释放所述重新获得的闩锁和所述架构共享锁。提高了在线重建索引的效率。
Description
技术领域
本发明涉及数据库领域,尤其涉及一种在线重建索引方法及装置。
背景技术
关系数据库一般采用B树索引,B树索引会需要对数据表的数据反复插入和删除等动作,这样会产生大量索引碎片,顺序扫描时间会加长。数据反复被删除后,索引中的索引条目并不是真正被删除,而只是被标记为删除,并没有被清除,这会使得虽然数据量减小,但是导致索引空间变大的问题。因此需要通过重建索引提升数据访问速度,并释放空间,另外,索引树高度过高时,也需要重建索引。
目前,索引重建包括有三种方式:离线丢弃(drop)后重新创立(re-create)、离线重建(rebuild)和在线重建,其中,drop后re-create索引方式一般在应用部署阶段使用,离线重建适合上线后,系统可以短时间停下来进行维护,例如在夜间进行维护。而对7*24小时运行系统,一般采用在线重建方式进行,这种方式下,重建索引过程中,不需要中断现有业务,影响较小。
现有技术中,在在线重建索引过程中,需要获得对数据表的排它锁的控制权,而获得排它锁的控制权需要该数据表上无其它的排它锁或者共享锁,如果该数据表上一直存在其它的排它锁或者共享锁,那么将始终无法获得排它锁的控制权,从而影响在线重建索引的效率和成功率。
发明内容
针对上述问题,本发明的目的在于提供一种提高在线重建索引的效率和成功率的在线重建索引方法及装置。
第一方面,本发明提供一种在线重建索引装置,包括:
接收模块,用于接收在线重建索引请求,所述在线重建索引请求包含数据表的标识;
锁处理模块,用于根据所述在线重建索引请求,对所述数据表的标识对应的数据表加架构共享锁;
所述锁处理模块,还用于获得闩锁,通过所述闩锁获得所述数据表的结构控制权;
入口地址分配模块,用于在所述锁处理模块获得闩锁后,为所述数据表的原始索引预留影子索引存储空间,分配所述影子索引的入口地址,在所述数据表的根页上添加所述影子索引的入口地址;
所述锁处理模块,还用于所述影子索引创建模块完成在所述数据表的根页上添加所述影子索引的入口地址后,释放所述闩锁;
影子索引创建模块,用于根据所述原始索引的数据,在所述影子索引存储空间中创建影子索引;
所述锁处理模块,还用于所述影子索引创建模块完成在所述影子索引存储空间中创建影子索引后,重新获得闩锁;
入口地址处理模块,用于所述锁处理模块重新获得闩锁后,将所述数据表的根页的索引入口地址更新为影子索引入口地址;
所述锁处理模块,还用于所述入口地址处理模块在所述数据表的根页的索引入口地址更新为影子索引入口地址后,释放所述重新获得的闩锁和所述架构共享锁。
在第一方面的第一种可能的实现方式中,还包括:事务处理模块,用于接收对所述数据表的数据的更新请求,根据所述更新请求,对数据表的数据进行更新。
结合第一方面或者第一方面的第一种可能的实现方式,在第一方面的第二种可能的实现方式中,还包括:更新模块,用于在索引数据需要更新时,确定所述数据表的根页中包含所述影子索引的入口地址,将需要更新的索引数据在所述原始索引和所述影子索引上进行更新。
结合第一方面的第一种可能的实现方式,在第一方面的第三种可能的实现方式中,所述入口地址处理模块,具体用于将所述数据表的根页上的索引入口地址更改为所述影子索引的入口地址,删除所述原始索引的入口地址。
结合第一方面的第一种可能的实现方式,在第一方面的第三种可能的实现方式中,所述入口地址处理模块,具体用于将所述影子索引的入口地址修改为有效,删除所述原始索引的入口地址。
第二方面,本发明提供一种在线重建索引的方法,包括:
接收在线重建索引请求,所述在线重建索引请求包含数据表的标识;
根据所述在线重建索引请求,对所述数据表的标识对应的数据表加架构共享锁;
获得闩锁,通过所述闩锁获得所述数据表的结构控制权;
在所述获得闩锁后,为所述数据表的原始索引预留影子索引存储空间,分配影子索引的入口地址,在所述数据表的根页上添加所述影子索引的入口地址;
在完成在所述数据表的根页上添加所述影子索引的入口地址后,释放所述闩锁;
根据所述原始索引的数据,在所述影子索引存储空间中创建影子索引;
在完成在所述影子索引存储空间中创建影子索引后,重新获得闩锁;
在重新获得闩锁后,将所述数据表的根页的索引入口地址更新为影子索引入口地址;
在所述数据表的根页的索引入口地址更新为影子索引入口地址后,释放所述重新获得的闩锁和所述架构共享锁。
在第二方面的第一种可能的实现方式中,还包括:接收对所述数据表的数据的更新请求,根据所述更新请求,对数据表的数据进行更新。
结合第二方面的第一种可能的实现方式,还包括:在所述对数据表的数据进行更新后,当索引数据需要更新时,确定所述数据表的根页中包含所述影子索引的入口地址,将需要更新的索引数据在所述原始索引和所述影子索引上进行更新。
在第二方面的第二种可能的实现方式中,所述将所述数据表的根页的索引入口地址更新为影子索引入口地址,具体为:将所述数据表的根页上的索引入口地址更改为所述影子索引的入口地址,删除所述原始索引的入口地址。
在第二方面的第二种可能的实现方式中,所述将所述数据表的根页的索引入口地址更新为影子索引入口地址,具体为:将所述影子索引的入口地址修改为有效,删除所述原始索引的入口地址。
本发明实施例的方案在启动在线重建索引时,无需加schema排它锁,而改为先加上共享锁,防止重建期间的DDL操作,数据库服务器通过获取到latch,使原始索引TI1瞬间静止无并发,在数据表T的root页上添加影子索引的入口地址后,开始在线重建索引。在重建过程中,如果有事务操作,要以加独立的共享锁,互不干扰。通过本发明实施例的方法,提高了在线重建索引的方法和装置。
附图说明
为了更清楚地说明本发明的技术方案,下面将对实施方式中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施方式,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例提供的一种在线重建索引的装置的结构示意图;
图2是本发明实施例提供的另一种在线重建索引的装置的结构示意图;
图3是本发明实施例提供的另一种在线重建索引的装置的结构示意图;
图4是本发明实施例提供的一种在线重建索引方法的流程示意图;
图5是本发明实施例提供的另一种在线重建索引方法的流程示意图;
图6是本发明实施例提供的另一种在线重建索引方法的流程示意图;
图7是本发明实施例提供的另一种在线重建索引方法的流程示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明实施例提供了一种在线重建索引方法及装置,用于提高在线重建索引的效率和成功率,以下分别进行详细说明。
为了便于理解本发明实施例,下面先对本发明实施例的数据库系统进行描述。在一个数据库系统中,包含了数据库客户端、数据库服务器和数据源,数据库客户端用于接收第三方软件或者管理员等发送的各类请求或者命令,并把各类请求或者命令发送给数据库服务器,数据库服务器根据不同的请求或者命令,做相应处理。数据源为数据库中对数据表、视图、储存过程等资源进行管理的一个对象,如Oracle数据库中的一个架构(schema)或MySQL数据库中的一个数据库(database)。数据源可以包含了多张不同的数据表,而每张数据表都有一个根页(root),在根页上包含了该数据表的索引的入口地址,通过该入口地址可以查询到该数据表的索引,通过索引可以查询到该数据表的各个数值。数据源还保存了该数据表的根页,以及原始索引和影子索引,数据库服务器可以具体为本发明实施例中的在线重建索引装置。
请参阅图1,图1是本发明实施例提供的一种在线重建索引装置的结构示意图,用于执行本发明实施例提供的在线重建索引的方法,如图1所示,该在线重建索引装置包括:至少一个处理器11,例如CPU,至少一个网络接口14或者其他用户接口13,存储器15,至少一个通信总线12。通信总线12用于实现这些组件之间的连接通信。其中,用户接口13可选的可以包括USB接口以及其他标准接口、有线接口。网络接口14可选的可以包括Wi-Fi接口以及其他无线接口。存储器15可能包含高速RAM存储器,也可能还包括非不稳定的存储器(non-volatile memory),例如至少一个磁盘存储器。存储器15可选的可以包含至少一个位于远离前述处理器11的存储装置。
在一些实施方式中,存储器15存储了如下的元素,可执行模块或者数据结构,或者他们的子集,或者他们的扩展集:
操作系统151,包含各种系统程序,用于实现各种基础业务以及处理基于硬件的任务;
应用模块152,包含设备控制服务程序、设备识别服务程序等各种应用程序,用于实现各种应用业务。
具体地,处理器11用于调用存储器15中存储的程序,执行以下操作:
接收在线重建索引请求,所述在线重建索引请求包含数据表的标识;根据所述在线重建索引请求,对所述数据表的标识对应的数据表加架构共享锁;获得闩锁,通过所述闩锁获得所述数据表的结构控制权;在所述获得闩锁后,为所述数据表的原始索引预留影子索引存储空间,分配影子索引的入口地址,在所述数据表的根页上添加所述影子索引的入口地址;在完成在所述数据表的根页上添加所述影子索引的入口地址后,释放所述闩锁;根据所述原始索引的数据,在所述影子索引存储空间中创建影子索引;在完成在所述影子索引存储空间中创建影子索引后,重新获得闩锁;在重新获得闩锁后,将所述数据表的根页的索引入口地址更新为影子索引入口地址;在所述数据表的根页的索引入口地址更新为影子索引入口地址后,释放所述重新获得的闩锁和所述架构共享锁。
上述技术方案中,所本发明实施例的方案在启动在线重建索引时,无需加schema排它锁,而改为先加上共享锁,防止重建期间的DDL操作,数据库服务器内部通过获取到latch,使原始索引TI1瞬间静止无并发,在数据表T的root页上添加影子索引的入口地址后,开始创建影子索引。在创建影子索引中,如果有事务操作,要加独立的共享锁,从而互不干扰。在创建影子索引完成后,首先获取latch,抢得控制权,更改根页的索引的入口地址,即影子索引被扶正,弃用原来的原始索引,完成切换。
请参阅图2,图2是本发明实施例提供的一种在线重建索引装置的结构示意图,用于执行本发明实施例提供的在线重建索引的方法,如图2所示,该在线重建索引装置包括:
接收模块21,用于接收在线重建索引请求,所述在线重建索引请求包含数据表的标识;锁处理模块22,用于根据所述在线重建索引请求,对所述数据表的标识对应的数据表加架构共享锁,锁处理模块22,还用于获得闩锁,通过所述闩锁获得所述数据表的结构控制权;入口地址分配模块23,用于在锁处理模块获得闩锁后,为所述数据表的原始索引预留影子索引存储空间,分配所述影子索引的入口地址,在所述数据表的根页上添加所述影子索引的入口地址;所述锁处理模块,还用于所述影子索引创建模块完成在所述数据表的根页上添加所述影子索引的入口地址后,释放所述闩锁;影子索引创建模块24,用于根据所述原始索引的数据,在所述影子索引存储空间中创建影子索引;所述锁处理模块,还用于所述影子索引创建模块完成在所述影子索引存储空间中创建影子索引后,重新获得闩锁;入口地址处理模块25,用于所述锁处理模块重新获得闩锁后,将所述数据表的根页的索引入口地址更新为影子索引入口地址;锁处理模块22,还用于所述入口地址处理模块更新所述数据表的根页的索引入口地址后,释放所述重新获得的闩锁和所述架构共享锁。
接收模块21接收到数据客户端发送的在线重建索引请求会后,将该在线重建索引请求发送给锁处理模块22,锁处理模块22接收到该在线重建索引请求后,根据在线重建索引请求,确认需要进行在线重建索引,此时根据该数据表的标识查询到其对应的数据表,并核实数据表的加锁情况,如果该数据表上无排它锁,对数据表加共享锁以及申请并获得闩锁,这样就可以获得线程控制权,从而可以实现创建影子索引,这里的共享锁可以是schema级别的。入口地址分配模块23,为所述数据表的原始索引分配影子索引存储空间,此时影子索引存储空间内容为空,分配所述影子索引的入口地址,在所述数据表的根页上添加所述影子索引的入口地址,还需要在数据字典上添加原始索引的影子索引的入口地址,然后锁处理模块22就释放闩锁;影子索引创建模块24根据所述原始索引的数据,在所述影子索引存储空间中创建影子索引,例如:将所述原始索引的数据复制到所述影子索引中,然后重新调整索引数据,成为一个简洁层次少的索引。在完成在影子索引中重建所述原始索引后,锁处理模块22重新获得闩锁。在所述锁处理模块重新获得闩锁后,入口地址处理模块25将所述数据表的根页的索引入口地址更新为影子索引入口地址。锁处理模块22,在完成所述入口地址处理模块在所述数据表的根页的索引入口地址更新为影子索引入口地址后,释放所述重新获得的闩锁和所述架构共享锁。
如图3所示,上述在线重建索引装置,还包括:事务处理模块26,用于接收对所述数据表的数据的更新请求,根据所述更新请求,对数据表的数据进行更新。也就是说,由于本发明避免使用了排它锁,因此在在线重建索引过程中,仍然可以实现对数据表的数据的更新等DML操作。
如图3所示,上述在线重建索引装置,还包括:更新模块27,用于在索引数据需要更新时,确定所述数据表的根页中包含所述影子索引的入口地址,将需要更新的索引数据在所述原始索引和所述影子索引上进行更新。更新模块可以实现当在线重建索引过程中,其它事务对该数据表进行更新所引起的索引数据的更新,可以将更新的索引数据同步添加到原始索引和影子索引中。
如图3所示,上述在线重建索引装置中的入口地址处理模块25,具体用于将所述数据表的根页上的索引入口地址更改为所述影子索引的入口地址,删除所述原始索引的入口地址。通过更改根页上的索引入口地址,可以完成在线重建索引,这样以后新的事务访问索引时,就会访问到这个影子索引的入口地址,当原始索引的入口地址删除后,这个影子索引的入口地址就为新的原始索引的入口地址了。
如图3所示,上述在线重建索引装置中的入口地址处理模块25,具体用于将所述影子索引的入口地址修改为有效,删除所述原始索引的入口地址。通过设置根页上的索引入口地址为有效,可以完成在线重建索引,这样以后新的事务访问索引时,就会访问到这个影子索引的入口地址,当原始索引的入口地址删除后,这个影子索引的入口地址就为新的原始索引的入口地址了。
为了更清楚的说明本发明实施例,下面将详细介绍所述在线重建索引装置执行上述实施例的操作过程。
图4为本发明实施例在线重建索引方法实施例的流程图,具体包括:
步骤401:接收在线重建索引请求,所述在线重建索引请求包含数据表的标识;
步骤402:根据所述在线重建索引请求,对所述数据表的标识对应的数据表加架构共享锁,以及获得闩锁,通过所述闩锁获得所述数据表的结构控制权。
这样就可以获取到对数据表根页的控制权。
步骤403:在获得闩锁后,为所述数据表的原始索引预留影子索引存储空间,分配所述影子索引的入口地址,在所述数据表的根页上添加所述影子索引的入口地址。
步骤404:在完成在所述数据表的根页上添加所述影子索引的入口地址后,释放所述闩锁。
步骤405:根据所述原始索引的数据,在所述影子索引存储空间中创建影子索引。
步骤406:在完成在所述影子索引存储空间中创建影子索引后,重新获得闩锁。
步骤407:在重新获得闩锁后,将所述数据表的根页的索引入口地址更新为影子索引入口地址。
步骤408:在所述数据表的根页的索引入口地址更新为影子索引入口地址后,释放所述重新获得的闩锁和所述架构共享锁。
进一步的,还包括:接收对所述数据表的数据的更新请求,根据所述更新请求,对数据表的数据进行更新。
进一步的,在所述对数据表的数据进行更新后,还包括:当索引数据需要更新时,确定所述数据表的根页中包含所述影子索引的入口地址,将需要更新的索引数据在所述原始索引和所述影子索引上进行更新。
进一步的,所述将数据表的根页的索引入口地址更新为影子索引入口地址,具体为:将所述数据表的根页上的索引入口地址更改为所述影子索引的入口地址,删除所述原始索引的入口地址。
进一步的,所述将数据表的根页的索引入口地址更新为影子索引入口地址,具体为:将所述影子索引的入口地址修改为有效,删除所述原始索引的入口地址。
本发明实施例的方案在启动在线重建索引时,无需加schema排它锁,而改为先加上共享锁,防止重建期间的DDL操作,数据库服务器内部通过获取到latch,使原始索引TI1瞬间静止无并发,在数据表T的root页上添加影子索引的入口地址后,开始在线重建索引。在创建影子索引过程中,如果有事务操作,要以加独立的共享锁,互不干扰。创建影子索引结束后,首先获取latch,抢得控制权,然后完成根页的入口地址变更的过程,即影子索引被扶正,弃用原来的原始索引,完成切换。此时,如果有未完成的事务,并不影响到影子索引的扶正。影子索引扶正后,事务可以继续进行,通过本发明实施例的方法,提高了在线重建索引的方法和装置。
图5为本发明实施例在线重建索引方法实施例的流程图,具体包括:
步骤501:数据库客户端向数据库服务器发送在线重建索引请求,请求数据库在线重建数据表T的原始索引TI1,该在线重建索引请求包含了数据表T的标识。
该数据库客户端可以是应用程序或者维护工具,该在线重建索引请求可以是rebuild index命令。
步骤502:数据库服务器根据该在线重建索引请求,查询数据表T的标识对应的数据表T,并核实数据表T的加锁情况,如果该数据表T上无排它锁,对数据表T加共享锁。这里的共享锁可以是schema级别的,对整个数据表T是有效的。
由于在当前现有技术中,数据库服务器需要对数据表T加schema排它锁,具体可以是schema级别的,对整个数据表T是有效的。因为只有对数据表T加schema排它锁,数据库服务器才能获得对该数据表T的独占,从而可以禁止任何事务对该数据表T进行数据定义语言(data definition language,DDL)操作和除select之外的数据管理语言(datamanipulation language,DML)操作,这样能够保证在在线重建索引过程中数据的一致性。数据库服务器在分配影子索引入口地址分配后,数据库服务器将schema排它锁降级为schema共享锁,此时如果有任何进程需要对该数据表T的结构进行DDL操作,则数据库根据该共享锁拒绝该DDL操作,但是可以对该数据表T进行DML操作,数据表T的数据依然可以被修改。当影子索引重建完成时,需要将root页中的索引地址更新为影子索引的地址,而这种处理,必须需要对数据表T加schema排它锁。然而,在在线重建索引过程中,如果有应用启动事务,需要等待该事务提交后,才能抢到对数据表T的独占机会,从而才能对数据表T加排它锁,以及才能完成在线重建索引,如果该事务一直不提交,随着时间的推移,应用的数据不停更新,在线重建索引始终无法完成,数据库服务器需要保持原始索引和影子索引并行,等待应用提交事务。等待期间,同步修改影子索引的开销是额外的性能代价,直到数据表上的长事务提交后,才能获得对数据表加schema排它锁,才能正常切换索引,完成在线重建索引。如果应用程序有bug,事务一直不提交,此时在线重建索引过程会因等不到独占控制权,无法完成影子索引的扶正,长时间处于两个索引并行,处于饿死状态,显然这严重影响了在线重建索引的成功率和效率。
因此本发明中,在在线重建索引过程中对数据表不加schema排它锁,而只加共享锁,因此其它事务仍然不能对数据表的结构进行修改,即其它事务不能对数据表T进行DDL操作,不会修改该数据表T的索引结构,但是其它事务可以对数据表T的数据进行修改,即不影响其它事务对数据表T进行DML操作。
步骤503:数据库服务器申请闩锁(latch),获得latch后,就是一个处理在线重建索引的线程在瞬间具有对数据表T的结构修改控制权,其它线程不能同时对该数据表T的结构进行修改,因此可以预留原始索引TI1的影子索引TI2的存储空间和分配该影子索引TI2的入口地址,在数据表T的root页上添加该影子索引TI2的入口地址,以及在数据字典上添加该原始索引TI1的影子索引TI2的入口地址,完成上述操作后,释放latch。
通常情况下,在数据表T的root页中只有一个索引的入口地址,就是真实的原始索引TI1的入口地址,根据该原始索引TI1,可以快速查询到数据表T的数据。在原始索引TI1被重建时,数据库服务器会在root页中添加该影子索引TI2的入口地址,此时该影子索引TI2是一个非有效的入口地址。也就是说,在root页中可能存在两个索引的入口地址,但是只有一个是入口地址是有效的,可以通过标志位来标识root页中索引的入口地址有效或者无效,例如:如果标志位为1,数据表示该索引的入口地址为有效的,如果标志位为0,数据表示该索引的入口地址为无效的,因此,原始索引TI1的入口地址的标志位可以为1,影子索引TI2的入口地址的标志位可以为0。当然还可以通过其它方式来标识root页中索引的入口地址有效或者无效。
在进行数据表的数据查询过程中,数据库服务器会直接查询标志位为有效的原始索引TI1的入口地址,而不会查询标志位为无效的影子索引TI2的入口地址,但是在对索引进行修改时,数据库服务器会同时查询标志位为无效和标志位为有效是否都存在入口地址,如果是的话,则数据表示当前索引正在被重建,因此对索引内容进行修改时,需要同时对原始索引TI1和影子索引TI2进行修改。
Latch是用于对内存中共享数据结构的提供互斥访问的一种串行化锁定机制。Latch用于快速,短时间的锁定资源,防止多个并发进程同时修改访问某个共享资源,是一种能够极快地被获取和释放的非常轻量级的锁,Latch可以防止多个并发进程同时修改访问某个共享资源的问题,也就是说,通过latch可以瞬间抢占访问该共享资源,然后可以对该共享资源进修改,从而可以进行修改数据表T的root页。而排它锁主要作用于数据库对象,如:表,索引和视图等,排它锁的释放需要等到事务正确的结束,因此占用的时间的长短由事务大小决定。从上述的描述来看,由于latch是轻量级的,可以快速,短时间的锁定资源,并修改访问某个共享资源。而无需像排它锁那样需要长时间的锁定一个数据库对象,并且抢占排他锁必须等待数据库对象(数据表)没有其它锁才能抢占到,而本发明的latch的抢占是比较快速和容易的。
步骤504:数据库服务器根据所述原始索引的数据,在所述影子索引存储空间中创建影子索引。
在步骤503创建的影子索引TI2的数据一开始为空,只有数据库服务器根据原始索引的数据,在所述影子索引中创建影子索引后,该创建后的影子索引的存储空间才有数据,并且创建后的索引的结构相比于原始索引的结构更加清楚简洁,层次清晰,查询时比较快捷。
对数据表T的数据修改,通常会引起数据表T的索引也需要修改。数据库服务器查询数据表T的root页上的索引入口地址,同时查询到两个索引的入口地址,一个是原始索引TI1的入口地址,一个是影子索引TI2的入口地址,则对原始索引TI1的修改需要同步到对影子索引TI2的修改上,保持原始索引TI1和影子索引TI2两份索引的内容同步。
步骤505:在完成在所述影子索引中重建所述原始索引后,数据库服务器重新申请latch,获得latch后,将数据表T的root页上的影子索引TI2的入口地址更新为所述数据表的根页的索引入口地址;删除原始索引TI1的入口地址,释放latch,以及释放共享锁。
当影子索引TI2重建完成时,数据库服务器向索引latch保护机制申请latch,获得对数据表T的控制权,数据库服务器将数据表T的root页上的影子索引入口地址更改为有效,删除原始索引TI1的入口地址和原始索引TI1,释放数据表T的schema共享锁。这样就实现了扶正影子索引TI2,原始索引TI1作废。数据库服务器将所述数据表的根页上的索引入口地址更改为所述影子索引的入口地址,删除所述原始索引的入口地址。
数据库服务器还可以通过如下方式来实现将数据表T的root页上的影子索引入口地址更改为有效:数据库服务器将root页中该数据表的索引入口地址更改为影子索引TI2的入口地址。
本发明实施例的方案在启动在线重建索引时,无需加schema排它锁,而改为先加上共享锁,防止重建期间的DDL操作,数据库服务器内部通过获取到latch,使原始索引TI1瞬间静止无并发,在数据表T的root页上添加影子索引的入口地址后,开始创建影子索引。在影子索引创建过程中,如果有事务操作,要以加独立的共享锁,互不干扰。影子索引创建结束后,首先获取latch,抢得控制权,然后完成根页的索引入口地址的变更,即影子索引被扶正,弃用原来的原始索引,完成切换。此时,如果有未完成的事务,并不影响到影子索引的扶正。影子索引扶正后,事务可以继续进行。
在另外一个本发明的实施例中,上述过程中,在步骤501之前可能已经存在了一个事务对数据表T的访问,例如:如下面步骤506。只要这个事务对数据表T没有加排它锁,就仍然可以执行步骤501,如图6所示,该方法还包括:
步骤506:数据库客户端对数据表T的数据开始一个事务。
如果该事务对数据表并不是排它锁的,此时数据库服务器还可以接收对该数据表T的在线重建索引请求,后续过程如步骤501至503。
在步骤503中释放latch后,在数据库服务器没有重新申请latch前,该方法还可以包括:
步骤507:数据库客户端向数据库服务器发送对数据表T的数据的更新请求。
步骤508:数据库服务器根据该更新请求,对数据表T的数据进行更新。
步骤509:数据库服务器确定对数据表T的数据更新,会对索引数据产生影响时,就需要对索引数据进行更新,这时确认root页中包含的原始索引TI1存在影子索引TI2的入口地址,因此需要对原始索引TI1和影子索引TI2同步进行索引数据的更新,数据库服务器可以将更新的索引数据同步添加到原始索引和影子索引中。
上述步骤507-509和步骤504之间没有明确的先后顺序关系。
上述过程中,在启动在线重建后,再启动事务,数据表T参与其中,直到索引重建结束,事务依然没有提交。如图7所示,在步骤503之后,在数据库服务器没有重新申请latch前,该方法还可以包括:
步骤510:数据库客户端对数据表T的数据开始一个事务,向数据库服务器发送对数据表T的数据的更新请求。
步骤511:数据库服务器根据该更新请求,对数据表T的数据进行更新。
步骤512:数据库服务器确定对数据表T的数据更新,会对索引数据产生影响时,就需要对索引数据进行更新,这时确认root页中包含的原始索引TI1存在影子索引TI2的入口地址,因此需要对原始索引TI1和影子索引TI2同步进行索引数据的更新,数据库服务器可以将更新的索引数据同步添加到原始索引和影子索引中。
上述步骤510-512和步骤504之间没有明确的先后顺序关系。
在现有技术中,由于在线重建索引要获得对数据表T的独占权,要加排它锁,因为有事务未提交,数据库不能抢得对数据表T的独占权,在线重建索引过程将无法启动。而本发明实施例的技术方案中,在在线重建索引时,只需要对数据表T加共享锁,并在表数据字典入口处标识正在重建,即可以达到防DDL修改,因此避免了申请重量级的排它锁,只需要加共享锁,不会阻止在线重建索引的启动。由于抢占latch的要求比抢占schema排它锁的要求低,不需要等到所有事务都结束才能抢占latch,因此提高了在线重建索引的效率和成功率。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(Read-Only Memory,ROM)或随机存取存储器(Random AccessMemory,简称RAM)等。
以上所揭露的仅为本发明较佳实施例而已,当然不能以此来限定本发明之权利范围,因此依本发明权利要求所作的等同变化,仍属本发明所涵盖的范围。
Claims (10)
1.一种在线重建索引装置,其特征在于,包括:
接收模块,用于接收在线重建索引请求,所述在线重建索引请求包含数据表的标识;
锁处理模块,用于根据所述在线重建索引请求,对所述数据表的标识对应的数据表加架构共享锁;
所述锁处理模块,还用于获得闩锁,通过所述闩锁获得所述数据表的结构控制权;
入口地址分配模块,用于在所述锁处理模块获得闩锁后,为所述数据表的原始索引预留影子索引存储空间,分配所述影子索引的入口地址,在所述数据表的根页上添加所述影子索引的入口地址;
所述锁处理模块,还用于所述入口地址分配模块完成在所述数据表的根页上添加所述影子索引的入口地址后,释放所述闩锁;
影子索引创建模块,用于根据所述原始索引的数据,在所述影子索引存储空间中创建影子索引;
所述锁处理模块,还用于所述影子索引创建模块完成在所述影子索引存储空间中创建影子索引后,重新获得闩锁;
入口地址处理模块,用于所述锁处理模块重新获得闩锁后,将所述数据表的根页的索引入口地址更新为影子索引入口地址;
所述锁处理模块,还用于所述入口地址处理模块在所述数据表的根页的索引入口地址更新为影子索引入口地址后,释放所述重新获得的闩锁和所述架构共享锁。
2.如权利要求1所述在线重建索引装置,其特征在于,还包括:事务处理模块,用于接收对所述数据表的数据的更新请求,根据所述更新请求,对数据表的数据进行更新。
3.如权利要求1-2任意一项所述在线重建索引装置,其特征在于,还包括:更新模块,用于在索引数据需要更新时,确定所述数据表的根页中包含所述影子索引的入口地址,将需要更新的索引数据在所述原始索引和所述影子索引上进行更新。
4.如权利要求1所述在线重建索引装置,其特征在于,所述入口地址处理模块,具体用于将所述数据表的根页上的索引入口地址更改为所述影子索引的入口地址,删除所述原始索引的入口地址。
5.如权利要求1所述在线重建索引装置,其特征在于,所述入口地址处理模块,具体用于将所述影子索引的入口地址修改为有效,删除所述原始索引的入口地址。
6.一种在线重建索引的方法,其特征在于,所述方法包括:
接收在线重建索引请求,所述在线重建索引请求包含数据表的标识;
根据所述在线重建索引请求,对所述数据表的标识对应的数据表加架构共享锁;
获得闩锁,通过所述闩锁获得所述数据表的结构控制权;
在所述获得闩锁后,为所述数据表的原始索引预留影子索引存储空间,分配影子索引的入口地址,在所述数据表的根页上添加所述影子索引的入口地址;
在完成在所述数据表的根页上添加所述影子索引的入口地址后,释放所述闩锁;
根据所述原始索引的数据,在所述影子索引存储空间中创建影子索引;
在完成在所述影子索引存储空间中创建影子索引后,重新获得闩锁;
在重新获得闩锁后,将所述数据表的根页的索引入口地址更新为影子索引入口地址;
在所述数据表的根页的索引入口地址更新为影子索引入口地址后,释放所述重新获得的闩锁和所述架构共享锁。
7.如权利要求6所述的方法,其特征在于,还包括:
接收对所述数据表的数据的更新请求,根据所述更新请求,对数据表的数据进行更新。
8.如权利要求7所述的方法,其特征在于,在所述对数据表的数据进行更新后,还包括:当索引数据需要更新时,确定所述数据表的根页中包含所述影子索引的入口地址,将需要更新的索引数据在所述原始索引和所述影子索引上进行更新。
9.如权利要求6所述的方法,其特征在于,所述将所述数据表的根页的索引入口地址更新为影子索引入口地址,具体为:将所述数据表的根页上的索引入口地址更改为所述影子索引的入口地址,删除所述原始索引的入口地址。
10.如权利要求6所述的方法,其特征在于,所述将所述数据表的根页的索引入口地址更新为影子索引入口地址,具体为:将所述影子索引的入口地址修改为有效,删除所述原始索引的入口地址。
Priority Applications (4)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410438770.4A CN105373566B (zh) | 2014-08-30 | 2014-08-30 | 在线重建索引方法及装置 |
EP15835811.9A EP3142021B1 (en) | 2014-08-30 | 2015-07-14 | Method and device for online index rebuilding |
PCT/CN2015/083997 WO2016029748A1 (zh) | 2014-08-30 | 2015-07-14 | 在线重建索引方法及装置 |
US15/394,242 US20170109384A1 (en) | 2014-08-30 | 2016-12-29 | Online index rebuilding method and apparatus |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410438770.4A CN105373566B (zh) | 2014-08-30 | 2014-08-30 | 在线重建索引方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN105373566A CN105373566A (zh) | 2016-03-02 |
CN105373566B true CN105373566B (zh) | 2018-01-23 |
Family
ID=55375774
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410438770.4A Active CN105373566B (zh) | 2014-08-30 | 2014-08-30 | 在线重建索引方法及装置 |
Country Status (4)
Country | Link |
---|---|
US (1) | US20170109384A1 (zh) |
EP (1) | EP3142021B1 (zh) |
CN (1) | CN105373566B (zh) |
WO (1) | WO2016029748A1 (zh) |
Families Citing this family (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US10216781B2 (en) * | 2015-05-29 | 2019-02-26 | Oracle International Corporation | Maintaining cross-node coherence of an in-memory database object in a multi-node database cluster |
US10558636B2 (en) * | 2016-04-27 | 2020-02-11 | Sap Se | Index page with latch-free access |
CN108376156B (zh) * | 2018-02-08 | 2020-08-14 | 上海达梦数据库有限公司 | 创建数据库索引的方法、装置、服务器及存储介质 |
CN109063132B (zh) * | 2018-08-02 | 2020-08-25 | 上海达梦数据库有限公司 | 闩锁请求方法、闩锁授权方法、装置及终端设备 |
CN111352944B (zh) * | 2020-02-10 | 2023-08-18 | 北京百度网讯科技有限公司 | 数据处理方法、装置、电子设备与存储介质 |
CN112835980B (zh) * | 2021-02-05 | 2024-04-16 | 北京字跳网络技术有限公司 | 索引重建方法、装置、设备、计算机可读存储介质及产品 |
US20230081900A1 (en) * | 2021-09-15 | 2023-03-16 | Cockroach Labs, Inc. | Methods and systems for transactional schema changes |
US11768621B2 (en) * | 2021-12-06 | 2023-09-26 | Gong.Io Ltd. | Live data migration in document stores |
CN114661719B (zh) * | 2022-03-28 | 2023-04-28 | 北京海量数据技术股份有限公司 | 一种在OpenGauss数据库分区表上在线创建全局索引的方法 |
CN115408099A (zh) * | 2022-07-11 | 2022-11-29 | 北京握奇智能科技有限公司 | 一种虚拟机数据访问方法、存储介质及装置 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6591269B1 (en) * | 1999-05-19 | 2003-07-08 | Sybase, Inc. | Database system with methodology for online index rebuild |
CN102411634A (zh) * | 2011-12-27 | 2012-04-11 | 北京人大金仓信息技术股份有限公司 | 一种提升嵌入式数据库实时性的数据存储方法 |
CN103336828A (zh) * | 2013-07-05 | 2013-10-02 | 深圳市康拓普信息技术有限公司 | 实时数据库读取及写入方法 |
CN103605657A (zh) * | 2013-10-14 | 2014-02-26 | 华为技术有限公司 | 一种在线重建索引的方法和装置 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
KR101054026B1 (ko) * | 2009-05-18 | 2011-08-03 | 주식회사 부산은행 | 인덱스 리빌드 자동화 시스템 및 그 방법 |
-
2014
- 2014-08-30 CN CN201410438770.4A patent/CN105373566B/zh active Active
-
2015
- 2015-07-14 WO PCT/CN2015/083997 patent/WO2016029748A1/zh active Application Filing
- 2015-07-14 EP EP15835811.9A patent/EP3142021B1/en active Active
-
2016
- 2016-12-29 US US15/394,242 patent/US20170109384A1/en not_active Abandoned
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6591269B1 (en) * | 1999-05-19 | 2003-07-08 | Sybase, Inc. | Database system with methodology for online index rebuild |
CN102411634A (zh) * | 2011-12-27 | 2012-04-11 | 北京人大金仓信息技术股份有限公司 | 一种提升嵌入式数据库实时性的数据存储方法 |
CN103336828A (zh) * | 2013-07-05 | 2013-10-02 | 深圳市康拓普信息技术有限公司 | 实时数据库读取及写入方法 |
CN103605657A (zh) * | 2013-10-14 | 2014-02-26 | 华为技术有限公司 | 一种在线重建索引的方法和装置 |
Also Published As
Publication number | Publication date |
---|---|
EP3142021B1 (en) | 2019-06-05 |
EP3142021A1 (en) | 2017-03-15 |
CN105373566A (zh) | 2016-03-02 |
US20170109384A1 (en) | 2017-04-20 |
WO2016029748A1 (zh) | 2016-03-03 |
EP3142021A4 (en) | 2017-05-17 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105373566B (zh) | 在线重建索引方法及装置 | |
US11120026B1 (en) | System and method for executing queries on multi-graphics processing unit systems | |
US9501502B2 (en) | Locking protocol for partitioned and distributed tables | |
AU2016244128B2 (en) | Processing database transactions in a distributed computing system | |
EP3120261B1 (en) | Dependency-aware transaction batching for data replication | |
EP3624424A1 (en) | Index updating method and system, and related device | |
CN106547781B (zh) | 一种实现分布式事务的方法、装置及数据库服务器 | |
US8930323B2 (en) | Transaction processing system, method, and program | |
EP2932370B1 (en) | System and method for performing a transaction in a massively parallel processing database | |
US10402285B2 (en) | Hybrid database concurrent transaction control | |
US20110161281A1 (en) | Distributed Transaction Management in a Distributed Shared Disk Cluster Environment | |
US8176022B1 (en) | Locking protocol using dynamic locks and dynamic shared memory | |
CN102999522A (zh) | 一种数据存储方法和装置 | |
EP3824397B1 (en) | Version-based table locking | |
CN111225007B (zh) | 数据库连接方法、装置和系统 | |
CN115617855A (zh) | 一种缓存控制方法、装置、电子设备及存储介质 | |
US9984096B2 (en) | System and method for reducing communications overhead in a distributed transactions environment by modifying implementation of the transaction start function | |
CN104376054B (zh) | 一种持久化实例对象的处理方法及装置 | |
EP3686751A1 (en) | Method and system for data handling | |
US12130796B2 (en) | Method and apparatus for distributed database transactions using global timestamping | |
WO2022111707A1 (en) | Method and apparatus for distributed database transactions using global timestamping | |
CN117596298A (zh) | 一种数据处理方法、装置、电子设备及存储介质 | |
DE102023100602A1 (de) | Konfliktverfolgung zur latenzreduktion bei exklusiven operationen | |
CN115237968A (zh) | 数据库系统中的节点管理方法、装置、设备及存储介质 | |
CN118733560A (zh) | 数据出库方法、装置、电子设备和存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |