一种数据库修复方法
文献发布时间:2023-06-19 12:02:28
技术领域
本发明涉及一种数据库修复方法,特别涉及数据库修复方法,属于数据库修复技术领域。
背景技术
数据库管理系统更通俗地称为数据库系统,可以高效地创建、管理并保存大量的数据,数据库对于当今社会是至关重要的,数以千计的网站、公司以及科研机构的日常运转幕后都有数据库在发挥着作用,数据库管理系统主要由查询编译器、执行引擎、缓冲区管理器和事务处理器等部分组成,其中,部分查询编译器会对查询进行分析和优化,并将得到的查询计划传递给执行引擎;执行引擎向资源管理器发出一系列对小的数据单元的请求,查找数据的请求被传送给了缓冲区管理器;缓冲区管理器的任务是从磁盘中将需要的数据取到主存的缓冲区中,缓冲区管理器和存储管理器进行通信,以从磁盘获取数据,缓冲区是主存中与页面同等大小的区域,磁盘块的内容可以传送到缓冲区中;事务处理器分成并发控制管理器和日志恢复管理器两个主要部分。
数据库系统可以采用多种不同的数据模型,其中,关系模型是目前应用最广泛的数据模型,采用关系模型作为数据组织方式的数据库系统被称为关系型数据库系统关系模型建立在严格的数学概念基础上,由一组关系组成,每个关系的数据结构是一张规范化的二维表,关系模型的操作主要包括查询、插入、删除和更新,这些操作必须满足关系的完整性约束条件,关系的完整性约束条件包括三大类:实体完整性、参照完整性和用户定义完整性,传统的关系型数据库的数据模型只有关系模型一种,而非关系型数据库则拥有多种不同的数据模型,最常见的几种数据模型包括键值对存储模型、文档存储模型、BigTable列簇式存储模型和图结构存储模型,键值对存储模型是最简单的模型,每个键值关联一个任意的数据值,这个数据值可以是任意的二进制数据,键值对存储模型没有任何模式约束,任何值都可以被随时插入数据库中,许多键值对存储模型数据库都把数据集中存储在内存中,因此很适合于在一些数据库操作密集的应用中作为其他数据库的缓存使用,最常见的键值对存储数据库包括 Redis、Dynamo和Membase。
Redis(REmote DIctionary Server)是一个开源的键值对存储的内存数据库,根据数据库排名网站DB-Engines.com的数据显示,Redis是目前最流行的键值对存储数据库,Twitter、Instagram、Flickr、GitHub、阿里巴巴和新浪微博等众多国内外公司都在它们的产品中应用了Redis数据库。Redis的数据集是一个由键值对组成的字典,Redis 中值的类型除了字符串,还可以是列表、无序集合、有序集合以及哈希值的类型决定了值本身支持的操作。Redis的每种值数据类型都支持丰富的数据操作,所有的操作都是原子性的。Redis还支持发布订阅、通知和键过期等众多特性。除了支持丰富的数据结构、数据操作和特性之外Redis还拥有极为出色的性能,可以支持超过 10 万条每秒的读写频率。Redis通常将所有的数据都存储在内存中,但 Redis 也提供了两种持久化方式,可以将数据保存到磁盘上,一种方式是通过快照将全部数据集以异步方式从内存写入磁盘的RDB文件中,另一种方式则是将数据库的所有写操作语句写入到磁盘的AOF文件中。
现有关系模型数据库中当一行记录被删除后,该记录所占用的行数据区的空间以及行目录区中该行的条目的空间都会变为可覆盖状态。也就是说,这些空间可以被新插入的记录占用覆盖,但在被新的记录覆盖之前,被删除记录依然在文件中完好存在,可以被恢复,由于关系型数据库的数据模型只有关系模型一种,修复和找回数据较为简单,但是而非关系型数据库则拥有多种不同的数据模型,修复较为困难。
发明内容
本发明的目的在于提供数据库修复方法,以解决上述背景技术中提出的关系型数据库的数据模型只有关系模型一种,修复和找回数据较为简单,但是而非关系型数据库则拥有多种不同的数据模型,修复较为困难的问题。
为实现上述目的,本发明提供如下技术方案:数据库修复方法,所述数据库修复方法的具体步骤如下:
第一步骤:提取算法中输入一个Redis的RDB文件,读取该文件后,算法首先提取文件魔数和RDB文件的版本号,确认这是一个版本正确的RDB文件;
第二步骤:提取算法依次提取每个数据库中的键值对数据里键的数据信息;
第三步骤:提取算法依次提取每个数据库中的键值对数据里值的数据信息,值是Redis五种数据结构中的其中一种,包括压缩列表结构、链表结构、集合结构、跳跃表结构和哈希表结构。
作为本发明的一种优选技术方案,第二步骤中,所述键的数据信息都是字符串类型的,可以直接进行提取。
作为本发明的一种优选技术方案,第三步骤中,所述压缩列表结构中含有到压缩列表最后一个元素的偏移字段,其中每一个元素也都有上一个元素大小字段,提取算法利用了这两个字段进行提取,具体提取方法如下:
首先定位到压缩列表的最后一个元素,然后从最后一个元素开始倒序遍历,直到第一个元素。
作为本发明的一种优选技术方案,第三步骤中,所述链表结构提取使用正序遍历,通过链表元素数量字段获知该链表有几个元素,然后依次遍历。
作为本发明的一种优选技术方案,第三步骤中,对于整数集合结构,通过元素数量和整数编码字段依次遍历各个整数,其中,不同的整数编码对应不同的元素长度。
作为本发明的一种优选技术方案,第三步骤中,所述跳跃表、哈希表的结构与链表结构相同,可采用链表结构的处理方法进行提取处理。
作为本发明的一种优选技术方案,第四步骤中,恢复重构Redis数据库中写操作语句的具体步骤如下:
S1:读取该语句所需要的记录数;
S2:提取操作语句命令字;
S3:提取操作语句参数,到文件结尾后,输出操作语句。
与现有技术相比,本发明的有益效果是:
本发明数据库修复方法,通过提取算法依次对键值对中的压缩列表结构、链表结构、集合结构、跳跃表结构和哈希表结构的结构特征进行处理,得到压缩列表结构、链表结构、集合结构、跳跃表结构和哈希表结构,从而得到可以恢复出内存中Redis数据库的键值对数据,对于那些在内存中已经被删除,但还没有将数据变化同步到RDB文件中的数据,也可以通过提取RDB文件中的数据来达到恢复内存中数据的目的。
附图说明
图1为本发明的方法流程示意图;
图2为本发明从AOF文件中恢复重构数据库中写操作语句的方法流程图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
请参阅图1-2,本发明提供了数据库修复方法的技术方案:数据库修复方法,数据库修复方法的具体步骤如下:
第一步骤:提取算法中输入一个Redis的RDB文件,读取该文件后,算法首先提取文件魔数和RDB文件的版本号,确认这是一个版本正确的RDB文件;
具体的,在正常运行的情况下,Redis中所有的数据都保存在物理内存中,考虑到物理内存易失的特性,为了让这些数据在 Redis 服务器重启之后仍然可用,Redis 提供了RDB持久化的机制,当 Redis 数据库服务器运行时,RDB 程序会将当前内存中的数据库快照保存到磁盘的二进制文件中,当 Redis 数据库服务器重新启动时,RDB程序会从磁盘中载入 RDB 文件,还原数据库在内存中的所有数据,在RDB功能中,最核心的是rdbSave和rdbLoad两个函数,前者用于将内存中的数据保存到 RDB 文件中,而后者则用于将RDB文件中的数据重新载入到内存中,通过分析RDB文件的数据结构,可以在不直接分析内存存储结构的情况下恢复出Redis数据库中的键值对数据,即使一些键值对数据已经在内存中被删除了,只要删除数据之后的数据集还没有被同步到磁盘的RDB文件中,这些已删除数据依然能够在RDB文件中找到。
文件最开头保存的 REDIS 这五个字符标识了一个RDB 文件的开始,在读入文件的时候,程序可以通过检查一个文件的前五个字节来快速地判断该文件是否有可能是 RDB文件,RDB 版本号是一个整数,目前的RDB 版本号为 0006,因为不同版本的 RDB 文件互不兼容,所以在读入时,Redis 需要根据版本号来选择不同的读入方式。Redis 支持最大 16个数据库同时存在,每个数据库都有一个编号,该数据库的实际数据以键值对的形式紧随其后存储。在读入 RDB 文件时,程序会根据数据库编号来切换数据库,确保数据被还原到正确的数据库上,RDB 文件的校验和保存在文件末尾,当文件被读取时,Redis 根据校验和的值对文件内容进行校验;
第二步骤:提取算法依次提取每个数据库中的键值对数据里键的数据信息;
具体的,在 Redis 中,所有数据库中的数据都以键值对的形式保存,每个键值对都可以设置一个过期时间,当指定的过期时间流逝的时候,该键值对会自动被 Redis 服务器从数据库中移除,过期时间以绝对 Unix 时间戳的形式存储,值类型字段告诉我们Redis 是用什么样的编码方式存储值数据的,Redis的键都是用字符串存储的,可以直接进行提取,而值则可以是Redis五种数据结构中的其中一种,每种数据结构又根据其元素值的不同有不同的存储结构,因此,值的提取相对较为复杂;
第三步骤:提取算法依次提取每个数据库中的键值对数据里值的数据信息,值是Redis五种数据结构中的其中一种,包括压缩列表结构、链表结构、集合结构、跳跃表结构和哈希表结构。
具体的,Redis 区别于其他非关系型数据库的一大特点就是其对多种数据结构的支持,Redis主要有五种数据结构:字符串、列表、集合、有序集合和哈希,Redis 键值对中的键都是字符串类型,而值则可以是这五种数据结构的其中之一,每种数据结构在RDB文件中可以有多种不同的存储编码方式,具体取决于其中存储的数据;
压缩列表结构中含有到压缩列表最后一个元素的偏移字段,其中每一个元素也都有上一个元素大小字段,提取算法利用了这两个字段进行提取,具体提取方法如下:
首先定位到压缩列表的最后一个元素,然后从最后一个元素开始倒序遍历,直到第一个元素。
链表结构提取使用正序遍历,通过链表元素数量字段获知该链表有几个元素,然后依次遍历。
整数集合结构,通过元素数量和整数编码字段依次遍历各个整数,其中,不同的整数编码对应不同的元素长度。
跳跃表、哈希表的结构与链表结构相同,可采用链表结构的处理方法进行提取处理。
第四步骤:AOF提取算法中输入一个Redis数据库的AOF文件,对AOF文件恢复重构写操作语句,恢复重构Redis数据库中写操作语句的具体步骤如下:S1:读取该语句所需要的记录数;S2:提取操作语句命令字;S3:提取操作语句参数,到文件结尾后,输出操作语句,没有到文件结尾,则继续进行提取操作,具体的,除了 RDB 机制外,Redis还提供了AOF日志机制来实现数据的持久化,AOF的全称是append only file,是一个追加写入的日志文件,所有对数据库进行写入的命令和参数都会记录到AOF文件中,Redis 支持多种不同的写操作,字符串类型支持SET(设置字符串值)、INCR(整数值自增1)和APPEND(字符串拼接)等写操作语句。列表类型支持LPUSH(列表头插入元素)、LPOP(列表头删除元素)和LREM(删除指定位置的元素)等写操作语句,集合支持SADD(新增集合元素)和SREM(删除集合元素)等写操作语句,有序集合支持ZADD(新增有序集合元素)等写操作语句,哈希支持HMSET(添加哈希中的键值对)和HDEL(删除哈希中的键值对)等写操作语句。每种写操作语句都有相应的参数格式,与一般的数据库日志文件不同,AOF文件是纯文本文件,可以直接用文本编辑器打开查看,它的文件格式相比于RDB文件也较为简单。
在本发明的描述中,需要理解的是,指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本发明和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本发明的限制。
在本发明中,除非另有明确的规定和限定,例如,可以是固定连接,也可以是可拆卸连接,或成一体;可以是机械连接,也可以是电连接;可以是直接相连,也可以通过中间媒介间接相连,可以是两个元件内部的连通或两个元件的相互作用关系,除非另有明确的限定,对于本领域的普通技术人员而言,可以根据具体情况理解上述术语在本发明中的具体含义。
尽管已经示出和描述了本发明的实施例,对于本领域的普通技术人员而言,可以理解在不脱离本发明的原理和精神的情况下可以对这些实施例进行多种变化、修改、替换和变型,本发明的范围由所附权利要求及其等同物限定。
- 一种数据库修复方法
- 一种溢出页异常的数据库修复方法、装置及存储介质