掌桥专利:专业的专利平台
掌桥专利
首页

数据库中历史数据的处理方法、装置及系统

文献发布时间:2023-06-19 09:57:26


数据库中历史数据的处理方法、装置及系统

技术领域

本发明涉及数据库技术领域,尤其涉及一种数据库中历史数据的处理方法、装置及系统。

背景技术

在openGauss和PostgreSQL中,删除只是标记数据为删除标志,所以需要vacuum来定期清理过期数据。但由于数据库只保留了事务标记信息,vacuum必须扫描所有的数据文件的数据块来处理这个问题。因此vacuum对数据量大的表非常慢,而且vacuum冻结结束前不允许执行新事务,导致极端情况下在vacuum冻结时全库不可用。在openGauss和PostgreSQL中vacuum进程经常造成数据库负载过大甚至不可用的问题。

发明内容

有鉴于此,本发明提供一种数据库中历史数据的处理方法、装置及系统,能提高过期数据的清理效率。

一方面,本发明提供一种数据库中历史数据的处理方法,包括:在创建新的数据库时,同时创建独立的历史表空间,所述历史表空间用于存储历史版本数据和事务信息;

执行Vacuum进程时,直接访问所述历史表空间来清除过期数据。

进一步地,在同时创建独立的历史表空间的步骤之后包括:

接收用户的历史表空间管理信息,并根据所述历史表空间管理信息调整所述历史表空间的大小。

进一步地,在同时创建独立的历史表空间的步骤之后包括:

在收到用户的SQL处理信息时,记录SQL处理之前的历史版本数据和事务信息至所述历史表空间。

进一步地,在同时创建独立的历史表空间的步骤之后包括:

接收事务回滚信息,根据所述事实回滚信息中的事务在所述历史表空间的数据信息,回滚所述事务的数据改变;

数据库在事务中断后重启恢复时,读取所述中断的事务在所述历史表空间中的数据信息,并回滚所述中断的事务的数据改变;

在第一事务在改变目标位置的数据,并且第二事务开始读取所述目标位置的数据时,数据库根据历史表空间的事务信息,仅允许所述第二事务获取开始读取所述目标位置的数据时间之前的所述目标位置的数据。

进一步地,在同时创建独立的历史表空间的步骤之后包括:

在收到包括改变目标数据请求的事务信息后,若收到用于查询所述目标数据改变之前的数据值的请求,且确认所述历史表空间存有目标数据改变之前的数据值,则通过SQL语句从所述历史表空间获取所述目标数据改变之前的数据值。

再一方面,本发明还提供一种数据库中历史数据的处理装置,包括:

历史表空间创建模块,用于在创建新的数据库时,同时创建独立的历史表空间,所述历史表空间用于存储历史版本数据和事务信息;

Vacuum模块,用于执行时,直接访问所述历史表空间来清除过期数据。

进一步地,所述的数据库中历史数据的处理装置,其特征在于,还包括:

历史表空间管理模块,用于接收用户的历史表空间管理信息,并根据所述历史表空间管理信息调整所述历史表空间的大小;

SQL模块,用于在收到用户的SQL处理信息时,记录SQL处理之前的历史版本数据和事务信息至所述历史表空间。

进一步地,所述的数据库中历史数据的处理装置,其特征在于,还包括:

事务模块,用于接收事务回滚信息,根据所述事实回滚信息中的事务在所述历史表空间的数据信息,回滚所述事务的数据改变;数据库在事务中断后重启恢复时,读取所述中断的事务在所述历史表空间中的数据信息,并回滚所述中断的事务的数据改变;在第一事务在改变目标位置的数据,并且第二事务开始读取所述目标位置的数据时,数据库根据历史表空间的事务信息,仅允许所述第二事务获取开始读取所述目标位置的数据时间之前的所述目标位置的数据;

闪回模块,用于在收到包括改变目标数据请求的事务信息后,若收到用于查询所述目标数据改变之前的数据值的请求,且确认所述历史表空间存有目标数据改变之前的数据值,则通过SQL语句从所述历史表空间获取所述目标数据改变之前的数据值。

又一方面,本发明还提供一种数据库中历史数据的处理系统,包括:

内存,用于缓存数据;

硬盘,用于存储历史表空间,所述历史表空间用于存储历史版本数据和事务信息;

CPU,用于在创建新的数据库时,同时创建所述历史表空间;并用于执行Vacuum进程时,直接访问所述历史表空间来清除过期数据。

进一步地,所述CPU还用于:接收用户的历史表空间管理信息,并根据所述历史表空间管理信息调整所述历史表空间的大小;在收到用户的SQL处理信息时,记录SQL处理之前的历史版本数据和事务信息至所述历史表空间;接收事务回滚信息,根据所述事实回滚信息中的事务在所述历史表空间的数据信息,回滚所述事务的数据改变;数据库在事务中断后重启恢复时,读取所述中断的事务在所述历史表空间中的数据信息,并回滚所述中断的事务的数据改变;在第一事务在改变目标位置的数据,并且第二事务开始读取所述目标位置的数据时,数据库根据历史表空间的事务信息,仅允许所述第二事务获取开始读取所述目标位置的数据时间之前的所述目标位置的数据;以及在收到包括改变目标数据请求的事务信息后,若收到用于查询所述目标数据改变之前的数据值的请求,且确认所述历史表空间存有目标数据改变之前的数据值,则通过SQL语句从所述历史表空间获取所述目标数据改变之前的数据值。

本发明建立了单独的历史表空间存储历史数据增删改,历史表空间中的数据顺序存储,vacuum只需要对其进行顺序扫描,大幅度降低了vacuum扫描的范围,提高了过期数据的清理效率。

附图说明

为了更清楚地说明本发明实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它的附图。

图1为根据本发明示例性第一实施例的数据库中历史数据的处理方法的流程图。

图2为根据本发明示例性第二实施例的数据库中历史数据的处理方法的流程图。

图3为根据本发明示例性第三实施例的数据库中历史数据的处理方法的流程图。

图4为根据本发明示例性第四实施例的数据库中历史数据的处理装置的结构框图。

图5为根据本发明示例性第五实施例的数据库中历史数据的处理系统的结构框图。

具体实施方式

下面结合附图对本发明实施例进行详细描述。

需说明的是,在不冲突的情况下,以下实施例及实施例中的特征可以相互组合;并且,基于本公开中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本公开保护的范围。

需要说明的是,下文描述在所附权利要求书的范围内的实施例的各种方面。应显而易见,本文中所描述的方面可体现于广泛多种形式中,且本文中所描述的任何特定结构及/或功能仅为说明性的。基于本公开,所属领域的技术人员应了解,本文中所描述的一个方面可与任何其它方面独立地实施,且可以各种方式组合这些方面中的两者或两者以上。举例来说,可使用本文中所阐述的任何数目个方面来实施设备及/或实践方法。另外,可使用除了本文中所阐述的方面中的一或多者之外的其它结构及/或功能性实施此设备及/或实践此方法。

如图1所示,本发明一种数据库中历史数据的处理方法,包括:

步骤101,在创建新的数据库时,同时创建独立的历史表空间,所述历史表空间用于存储历史版本数据和事务信息;

步骤102,执行Vacuum进程时,直接访问所述历史表空间来清除过期数据。

本实施例通过建立了单独的历史表空间存储历史数据增删改,历史表空间中的数据顺序存储,vacuum只需要对其进行顺序扫描,大幅度降低了vacuum扫描的范围,提高了过期数据的清理效率。

以下具体结合如图2所示的优选实施例,对数据库中历史数据的处理方法进一步说明。如图2所示,

1.当一个新的数据库被创建时,默认同时创建独立的历史表空间,用来存储旧版本数据和事务信息。

2.用户可根据需要随时管理历史表空间,比如扩大和缩小其空间大小。

3.当用户发出增删改SQL时,记录修改前的旧版本数据和相关的事务信息到历史表空间。

4.如果事务被回滚,数据库会读取此事务在历史表空间的数据信息,并回滚所有数据改变。

5.如果一个事务遇到错误或其他原因被中断,数据库重启恢复时,数据库会读取此事务在历史表空间的数据信息,并回滚所有已经写入数据文件的数据改变。

6.当一个事务在进行数据改变,另一个事务开始读取同样位置数据时,数据库会根据历史表空间事务信息只让此事务看到其开始时间之前的版本数据。

7.当用户的事务包含数据改变,且此事务被提交后,用户想要查看被改变数据提交之前的值。如果此旧版本数据还未被历史表空间删除,可以用SQL语句从历史表空间中得到。这就是逻辑闪回功能。

8.当Vacuum进程被定期执行时,其可以直接访问历史表空间来清除过期数据。对比原有的扫描全数据库,显然提高效率。

本实施例在数据库创建时,默认创建单独的系统表空间,即历史表空间,来存储历史数据,从而在vacuum可以直接通过历史表空间寻址删除数据,节省了扫描全数据库的时间,调高了效率,增加了数据库的可用性;用户可以单独管理此历史表空间,比如控制大小,转移存储位置等;历史表空间中用来记录信息的数据结构是一个循环链接的page环,这样可以删除无用数据,循环使用表空间,从而最大化地解决空间;此历史表空间,可用来快速回滚事务;可用来恢复一个被中断的事务;可用来保障并发读一致性;也可用来提供一些逻辑闪回(flashback)的操作。该实施例的方法可以通过软件和硬件的方式实现,并集成在设备或者装置中。

图3所示实施例是在上述实施例的基础上进行优化,对此发明进行具体描述。需要说明的是,未在本实施例中详尽描述的技术细节可参见上述图1以及图2所示实施例。如图3所示,该方法具体包括如下步骤:

1.当一个新的数据库被创建时,默认同时创建独立的历史表空间,用来存储旧版本数据和事务信息。

2.用户可根据需要随时管理历史表空间,比如扩大和缩小其空间大小。

3.当用户发出增删改SQL时。

4.在历史表空间中构建一个循环链接的page环。

5.判断历史表空间中的当前page是否数据已满?

6.如果未满,直接在此page写入旧版本数据和相关事务信息。

7.如果已满,查看page环中下个page是否包含未被Vacuum进程清除的旧版本数据?

8.如果没有,分配page环中下个page为数据写入page。

9.如果有,从历史表空间中新分配一个新的page加入到此page环中。

10.在分配的写入page中,写入旧版本数据和相关事务信息。

11.记录修改前的旧版本数据和相关的事务信息到历史表空间。

12.如果事务被回滚,数据库会读取此事务在历史表空间的数据信息,并回滚所有数据改变。

13.如果一个事务遇到错误或其他原因被中断,数据库重启恢复时,数据库会读取此事务在历史表空间的数据信息,并回滚所有已经写入数据文件的数据改变。

14.当一个事务在进行数据改变,另一个事务开始读取同样位置数据时,数据库会根据历史表空间事务信息只让此事务看到其开始时间之前的版本数据。

15.当用户的事务包含数据改变,且此事务被提交后,用户想要查看被改变数据提交之前的值。如果此旧版本数据还未被历史表空间删除,可以用SQL语句从历史表空间中得到。这就是逻辑闪回功能。

16.当Vacuum进程被定期执行时,其可以直接访问历史表空间来清除过期数据。

本实施例在数据库创建时,默认创建单独的系统表空间历史表空间,后续用户还可以通过系统SQL命令来控制其大小;在事务对数据进行增删改操作时,把对应的事务信息,增删改操作和对应的数据信息保存在单独的历史表空间中;当vacuum进程开始清理数据时,从单独的历史表空间中就可以找到对应需要处理的数据块直接处理,而不是原来vacuum所做的全库扫描。上述技术方案建立了单独的历史表空间存储历史数据增删改,因为是顺序存储,所以vacuum只需要对其进行顺序扫描,大幅度降低了vacuum扫描的范围,提高了过期数据的清理效率。

图4为根据本发明示例性第四实施例的数据库中历史数据的处理装置的结构框图。具体如图4所示,数据库中历史数据的处理装置包括:

历史表空间创建模块(图中未示出),用于在创建新的数据库时,同时创建独立的历史表空间,所述历史表空间用于存储历史版本数据和事务信息;

Vacuum模块,用于定期执行清理过期数据,当被执行时,其可以直接访问历史表空间来清除过期数据。

优选地,上述处理装置还包括以下模块中的至少一个:

历史表空间管理模块,用来创建和管理历史表空间。数据库被创建时,会默认同时创建独立的历史表空间,用来存储旧版本数据和事务信息。用户可利用此管理模块来控制其大小,转移存储位置等。

SQL模块,此模块收到用户的SQL后,解析并生成执行计划。用户可利用此模块来发布增删改SQL。用户也可以利用SQL来控制历史表空间大小,转移其存储位置等。

事务模块,用来管理事务。比如事务回滚时,其会根据历史表空间相关信息回滚所有数据改变。事务被中断,数据库重启时,此模块根据历史表空间信息回滚所有已经落盘的数据改变。

闪回模块,用来实现逻辑闪回功能,当用户的事务包含数据改变,且此事务被提交后,用户想要查看被改变数据提交之前的值。如果此旧版本数据还未被历史表空间删除,可以用SQL语句从历史表空间中得到。

本实施例针对openGauss和PostgreSQL中vacuum进程经常造成数据库负载过大甚至不可用的问题,用单独表空间,历史表空间,来存储历史数据来消除这种隐患。用户可以单独管理此历史表空间,比如控制大小,转移存储位置等。历史表空间中用来记录信息的数据结构是一个循环链接的page环,这样可以删除无用数据,循环使用表空间,从而最大化地解决空间。此历史表空间,可用来快速回滚事务、用来恢复一个被中断的事务、可用来保障并发读一致性、也可用来提供一些逻辑闪回(flashback)的操作。

图5为根据本发明示例性第四实施例的数据库中历史数据的处理系统的结构框图。具体如图5所示,数据库中历史数据的处理系统包括:

用于数据缓存的内存,用来从硬盘中读取历史表空间数据、数据字典、数据和索引信息到内存,并在内存中修改。

用于历史表空间存储的硬盘,用来持久化历史表空间数据。

用于SQL计算的CPU,用来解析并生成各种SQL的执行计划。具体如:在创建新的数据库时,同时创建所述历史表空间;并用于执行Vacuum进程时,直接访问所述历史表空间来清除过期数据。

优选地,所述CPU还用于:接收用户的历史表空间管理信息,并根据所述历史表空间管理信息调整所述历史表空间的大小;在收到用户的SQL处理信息时,记录SQL处理之前的历史版本数据和事务信息至所述历史表空间;接收事务回滚信息,根据所述事实回滚信息中的事务在所述历史表空间的数据信息,回滚所述事务的数据改变;数据库在事务中断后重启恢复时,读取所述中断的事务在所述历史表空间中的数据信息,并回滚所述中断的事务的数据改变;在第一事务在改变目标位置的数据,并且第二事务开始读取所述目标位置的数据时,数据库根据历史表空间的事务信息,仅允许所述第二事务获取开始读取所述目标位置的数据时间之前的所述目标位置的数据;以及在收到包括改变目标数据请求的事务信息后,若收到用于查询所述目标数据改变之前的数据值的请求,且确认所述历史表空间存有目标数据改变之前的数据值,则通过SQL语句从所述历史表空间获取所述目标数据改变之前的数据值。

以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以权利要求的保护范围为准。

相关技术
  • 数据库中历史数据的处理方法、装置及系统
  • 用于嵌入式系统中的文件型实时历史数据库算法
技术分类

06120112363051