一种闪存数据库数据恢复的方法与流程

文档序号:11199089阅读:454来源:国知局
一种闪存数据库数据恢复的方法与流程
本发明涉及一种闪存的数据存储技术,特别涉及一种闪存数据库数据恢复的方法。
背景技术
:基于日志的恢复技术被广泛应用于传统的磁盘数据库管理系统中。在不同的协议之下,日志记录的设计、日志/数据缓冲区的管理、检查点机制、记录日志和恢复的过程都不一样。以undo日志为例,当事务t需要将数据库元素x(原始值为v)的值更改为v1时,undo日志就会形成如<t,x,v1>的日志记录并存储到磁盘上。当需要对事务t进行回滚操作时,则形成如<t,x,v>的日志记录,将元素x的值重置为v。闪存(flashmemory)是一种长寿命的非易失性存储器。与磁盘相比,闪存具有读写速度快、抗震、省电、体积小等优点。在闪存中重现undo日志恢复过程:(1)数据表初始状态如表1(a)所示,表中包含a、b、c三个元素,初始值分别为va、vb、vc,此时标志位均设为1,表示三个元素取值均有效;(2)当事务t将数据表中的a值从va修改为va’,插入一条新记录,如表1(b)中的最后一行,此时第一行a值的标志位设为0,表示a的取值发生了变化,原值已不再有效;(3)如果事务t需要回滚,则再写入一条新记录,将a值恢复为va,如表1(c)所示。表1(a)取值标志位ava1bvb1cvc1………表1(b)取值标志位ava0bvb1cvc1ava’1………表1(c)取值标志位ava0bvb1cvc1ava’0ava1………从表1(c)中可以看出,最后一条记录和第一条记录完全相同,也就是说最后一行在这种情况下是冗余的。因此闪存中通常存在大量的数据的历史版本,而传统的数据恢复方法又不断地写入已经存在的数据记录,这样既浪费空间又浪费时间。技术实现要素:本发明的目的在于提供一种闪存数据库数据恢复的方法,用于解决上述现有技术的问题。本发明一种闪存数据库数据恢复的方法,其中,包括:扫描日志文件,确认日志文件中是否有仍然有效的事务提交日志记录或事务回滚日志;依据日志文件当前的状态分别进行如下处理:若存在有效的事务提交日志记录,表明涉及该事务的所有更改尚未完全写入到数据文件中,需依据日志记录,完成数据文件的重写;若存在有效的回滚日志记录,则依据事务id查找所有日志记录,并进行回滚操作;若不存在有效的事务提交日志记录,也不存在有效的回滚日志,但存在仍然有效的日志记录,表明该事务尚未完成,检查是否存在部分日志记录已写入数据文件,而部分未写入的情况,如存在,则进行回滚操作。根据本发明的闪存数据库数据恢复的方法的一实施例,其中,回滚操作包括:首先依据事务id从日志文件中找出所有关于事务id对应的该事务仍然有效的日志记录,然后依次判断日志记录操作类型,根据不同操作类型,完成如下操作:若是插入操作,则删除当前插入的数据元素;若是删除操作,则重新插入被删除的数据元素;若是更新操作,则将数据元素的值恢复到初始状态。根据本发明的闪存数据库数据恢复的方法的一实施例,其中,还包括:链式日志,包括一个链表和一个数据表,链表中顺序存储每一个事务产生的不同数据操作的日志记录,数据表中包含一个日志记录中每个数据成员的不同版本数据,链表的日志记录中包含指定数据表的地址;数据表中的日志记录包含事务id、数据成员、前成员和数据地址表四个字段,其中事务id为当前日志记录所属事务的id号;数据成员为当前数据操作指向的数据成员的名称;前成员为当前事务中产生变化的前成员;数据地址表为数据成员所有版本数据的地址,每个版本数据按时间顺序用链表进行连接,当事务提交或回滚后,该数据地址字段设置为空。根据本发明的闪存数据库数据恢复的方法的一实施例,其中,日志记录构建日志文件的方法包括:当一个新事务开启,并产生第一个数据变化时,为第一个更新的数据成员插入一条日志记录;当事务中产生其他数据成员变化时,则插入一条新的日志记录,将其前成员设为上一变化的数据记录;对于插入和删除操作,在数据地址表中使用多个标示符来区别不同版本的数据;如果事务被提交或回滚,则插入一条提交或回滚日志记录,前成员设置为之前更新的成员;记录数据库中所有产生变化的数据成员及其具体的数据操作,并统一存储在日志文件中。根据本发明的闪存数据库数据恢复的方法的一实施例,其中,还包括:在日志文件中写入检查点,表明当前位置为检查点;以日志块为单位对日志进行逐条扫描,当遇到检查点时,确认在检查点之前所有日志记录的有效性,将仍然有效的日志记录写入新的空闲块;当完成对一个日志块的扫描后,对其进行擦除操作,并转入下一个未扫描的日志块;当空闲块已满,则申请新的空闲块,将新的有效记录写入新的空闲块。根据本发明的闪存数据库数据恢复的方法的一实施例,其中,还包括:将当前日志块中的有效记录转存到新的日志块的方法包括:将转存标志位设为1,并创建一个新的日志块;获取第一条日志记录,判断当前转存标志位是否为1,若不为1,则擦除旧的日志块并结束;若为1,则判断当前日志记录是否有效,若仍然有效则将当前日志记录拷贝至新的日志块,并获取下一条日志记录作为当前日志记录;若无效则直接获取下一条日志记录作为当前日志记录;若新的日志块已满,则获取下一个空闲块作为新的日志块;若获取的当前日志记录为空,则将转存标志位设为0,表明转存操作已结束。根据本发明的闪存数据库数据恢复的方法的一实施例,其中,检查点的时间间隔根据应用特点动态调整。根据本发明的闪存数据库数据恢复的方法的一实施例,其中,链式日志的数据存储方法:先将日志记录写入内存或缓存,将日志记录写入日志文件,将数据变化写入数据文件,无效化日志文件中相应日志记录。本发明基于闪存数据库提出一种既能够节约存储空间,又能够提升数据恢复效率的数据恢复方法。链式日志系统利用闪存数据库中存在的历史版本信息进行日志操作,采用链表结构替换顺序结构来存储日志记录以提高数据恢复效率。通过周期性检查点策略来移除失效的日志记录、节约闪存空间,同时有效缩减了日志文件的长度。附图说明图1所示为链式日志系统架构示意图;图2所示为日志记录格式图;图3所示为转存的步骤流程图;具体实施方式为使本发明的目的、内容、和优点更加清楚,下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。图1所示为链式日志系统架构示意图,如图1所示,本发明设计了一种新的日志系统,命名为链式日志。在链式日志系统中,日志管理器1负责日志记录的生成和统一管理;日志文件2是日志记录的集合,由一条条日志记录组成;恢复管理器3负责系统崩溃或事务回滚时数据的恢复管理;dbms4(databasemanagementsystem)是数据库管理系统,负责事务管理、日志管理、数据文件5管理等;数据文件5是数据记录的物理存储地点。图2所示为日志记录格式图,如图2所示,链式日志采用链表结构存储日志记录,系统维护一个链表和一个数据表。其中链表中顺序存储每一个事务产生的不同数据操作的日志,数据表中包含一个日志记录中每个数据成员的不同版本数据,链表日志中包含指定数据表的地址。如图2所示,链式日志用于实现对闪存数据库快速恢复,主要是基于闪存的特点设计了一种新的日志记录格式,可通过日志记录快速获取用户对数据库的操作信息,快速对闪存数据库进行恢复。链式日志的日志记录包含事务id、数据成员、前成员和数据地址表四个字段,其中“事务id”指当前日志所属事务的id号;“数据成员”指当前数据操作指向的数据成员的名称;“前成员”指当前事务中产生变化的前成员,若当前操作的数据成员为该事务第一个成员,则前成员字段设置为“begin”;“数据地址表”指数据成员所有版本数据的地址,每个版本数据按时间顺序用链表进行连接,当事务提交或回滚后,该数据地址字段设置为“null”。如图1以及图2所示,日志文件2由一条条日志记录组成,表2为链式日志的日志文件结构表。日志记录(简称日志)是记录用户对数据库的操作信息,通过日志记录可以得知用户对数据库的操作以及数据的变化,当系统崩溃时,依据日志记录可以恢复数据库;日志文件是指存放日志记录的文件,由多个日志块组成;日志文件在存储时是按块进行存储的,每一个块称作日志块,即日志文件分为多个日志块,每个日志块存储多个日志记录;链式日志是本发明设计的一种新的日志系统,用于实现对闪存数据库快速恢复,主要是基于闪存的特点设计了一种新的日志记录格式,可通过日志记录快速获取用户对数据库的操作信息,快速对闪存数据库进行恢复表2序号事务id数据成员前成员数据地址表1t1xbeginp(x1)->p(x2)->p(x3)2t1yp(x)p(y1)->p(y2)3t2abeginp(a1)->p(a2)4t1zp(y)p(z1)->p(z2)->null5t2bp(a)null->p(b1)6t1commitp(z)null7t2rollbackp(b)null8…………如图1以及图2所示,日志记录统一由日志管理器1负责管理。链式日志记录构建日志文件2的算法及流程如下:第一,当一个新事务开启,并产生第一个数据变化时(插入、修改或删除操作导致数据库产生变化),日志管理器1为第一个更新的数据成员插入一条日志记录,并将其前成员设置为“begin”。如表2第一行所示,事务t1开启,并对数据成员x进行数据操作,顺序更新其数值(从x1到x2,再到x3),所以第一条日志记录赋值为:事务id设为t1,数据成员设为x,前成员设为“begin”,数据地址表设为p(x1)->p(x2)->p(x3)(此处为x1、x2、x3所在数据表中的地址)。第二,当事务中产生其他数据成员变化时,则日志管理器1插入一条新的日志记录,将其前成员设为上一变化的数据记录。如在事务t1中更改数据成员y的取值,将其从y1更改为y2,则日志记录赋值为:事务id仍设为t1,数据成员设为y,前成员设为p(x),数据地址表设为p(y1)->p(y2),如表2第二行所示。第三,对于插入和删除操作,在数据地址表中使用多个标示符来区别不同版本的数据。如在事务中进行插入操作,则将其数据地址表中第一个地址设为“null”,在事务中进行删除操作,则将数据地址表中最后一个地址设为“null”,如表2中第四行表示在t1中删除数据成员z,第五行表示在t2中插入数据成员b。第四,如果事务被提交或回滚,则日志管理器1插入一条提交或回滚日志记录,前成员设置为之前更新的成员,地址表设为“null”。如表2中t1事务被提交(commit),t2事务被回滚(rollback),所以分别写入第六、七行日志记录。通过上述日志算法,日志管理器1可以构建一个个完整的日志记录,记录数据库中所有产生变化的数据成员及其具体的数据操作,并统一存储在日志文件2中,形成日志文件2。如图1所示,为避免产生过长的日志文件2,导致系统效率的降低,本发明使用了检查点策略,以确保仅仅传递仍然有效的日志记录。检查点的设置方法是在日志文件2中写入checkpointing,表明当前位置为检查点。在链式日志中使用检查点策略后,操作流程大致如下:第一,以日志块为单位对日志进行逐条扫描。当遇到检查点时,确认在检查点之前所有日志记录的有效性,将仍然有效的日志记录写入新的空闲块(空闲的日志块,即没有写入日志记录的日志块)。第二,当完成对一个日志块的扫描后,可以对其进行擦除操作,并转入下一个未扫描的日志块。第三,当空闲块已满,则申请新的空闲块,将新的有效记录(有效的日志记录。日志记录有一个标志位,表明当前日志记录是否有效。)写入新的空闲块。如一个日志块可以存放100条日志记录,其中有10条仍然有效,则将10条转存到新的日志块中,旧块可以擦除。图3所示为转存的步骤流程图,如图1以及图3所示,转存的步骤包括:(1)将“转存标志位”设为1,并创建一个新的日志块;其中,转存标志位是指判断当前日志快是否仍然有有效记录的标志,若为1,则表明存在有效记录,若为0,则表明不存在有效记录,可以擦除该日志块。(2)获取第一条日志记录,判断当前“转存标志位”是否为1。若不为1,则擦除旧的日志块并结束;若为1,则判断当前日志记录是否有效,若仍然有效则将当前日志记录拷贝至新的日志块,并获取下一条日志记录作为当前日志记录;若无效则直接获取下一条日志记录作为当前日志记录;(3)若新的日志块已满,则获取下一个空闲块作为新的日志块;(4)若获取的当前日志记录为空,则将“转存标志位”设为0,表明转存操作已结束。过长的检查点间隔会导致产生大的日志文件2,小的检查点间隔会缩短闪存的生命周期,因此,本发明的检查点的时间间隔可根据应用特点动态调整,同时采用周期性检查点的策略。在链式日志系统中,正常情况下数据存储的过程涉及数据库管理系统(dbms4)和日志管理器1,其中dbms4负责数据库正常的事务操作并控制数据文件5的生成,日志管理器1负责日志记录的管理以及日志文件2的生成。链式日志正常的数据存储大致流程如下:第一,dbms4进行正常的事务操作,对产生的数据库变化(涉及数据插入、删除及修改操作)做事务处理,并交由日志管理器1,其中,事务处理是当对源数据进行的一系列更改作为一个整体来保存或取消时,需采用事务进行处理。事务处理包括开启事务、提交事务和回滚事务,提交事务时更新所有操作,回滚事务时取消所有操作。只有插入、删除和更改操作需要使用事务,因为这些操作对数据库中的数据产生更新。若仅仅是读取操作则不需要使用事务。第二,日志管理器1依据链式日志格式要求生成一条条日志记录,并组成日志文件2,完成事务操作的完整记录。第三,事务正常提交,此时dbms4将数据记录写入数据文件5(二级存储介质)。第四,日志管理器1将已提交的事务所涉及的日志记录做无效化处理,整个事务提交过程完成。由上述数据存储过程可知,数据存储的大致流程是:先将日志记录写入内存或缓存->日志记录写入日志文件2->数据变化写入数据文件5->无效化日志文件2中相应日志记录。而数据恢复必需借助于日志记录,即崩溃发生在日志记录写入日志文件2之前,则无需恢复,因为当前没有日志记录;若崩溃发生在日志记录已经无效化之后,也无需恢复,因为当前数据已写入数据文件5。综上所述,数据恢复只发生在日志文件2生成之后,数据文件5完成之前。参考图1,本发明的闪存数据库数据恢复的方法的数据恢复过程包括:(1)恢复管理器3通过扫描日志文件2,确认日志文件2中是否有仍然有效的事务提交日志(commit记录)或事务回滚日志(rollback记录)。依据日志文件2当前的状态分别进行如下处理。(2)若存在有效的事务提交日志记录(commit记录),表明涉及该事务的所有更改尚未完全写入到数据文件5中,此时需依据日志记录,完成数据文件5的重写。即已经提交的事务,不管更新是否完全反馈到数据文件5中,只要重做一次所有涉及该事务的日志记录,就可保证数据文件5中的数据记录为正常事务提交时的状态。如表2中,事务t1已提交,但不知是否已完全写入数据文件5中。此时若崩溃,则恢复管理器3首先依据事务id从日志文件2中找出所有关于t1的有效记录(表2的第一、第二、第四行),然后依次将日志记录中涉及的数据变化重新写入数据文件5,如表2第一行是将数据成员x的值依次修改为p(x1)->p(x2)->p(x3),第二行是将数据成员y的值依次修改为p(y1)->p(y2),第四行是先将数据元素z的值修改为p(z1)->p(z2),然后删除数据元素z,数据恢复过程只需将事务t1中数据元素的最终状态写入数据文件5即可(即将x值修改为x3,y值修改为y2,删除z),而中间的过程变化可以省略,这样大大提高了日志恢复的效率。(3)若存在有效的回滚日志记录(rollback日志),则也需依据事务id查找所有日志记录,并进行回滚操作。回滚流程是首先依据事务id从日志文件2中找出所有关于该事务仍然有效的日志记录,然后依次判断日志记录操作类型,根据不同操作类型,完成如下操作:若是插入操作(即日志记录第一个数据地址为“null”),则删除当前插入的数据元素;若是删除操作(最后一个数据地址为“null”),则重新插入被删除的数据元素;若是更新操作(除上述两种情况之外),则将数据元素的值恢复到初始状态(即第一个数据地址的值)。如表2中事务t2有回滚日志,则依据事务id找到仍然有效的日志记录(表2第三行、第五行),然后进行回滚:即将数据元素a的值设为初始值a1,删除数据元素b。(4)若不存在有效的事务提交日志,也不存在有效的回滚日志,但存在仍然有效的日志记录,表明该事务尚未完成,可能存在部分日志记录已写入数据文件5,而部分未写入的情况,此时需显示的插入一条事务回滚。然后依据上述第三步进行回滚操作。如表2中,假设在第五行数据记录填写完毕后崩溃,此时事务t1未写入“commit”日志记录,此时需回滚t1所有的操作,即首先在日志文件2中插入一条回滚记录,如表3所示。表3:t1rollbackp(z)null然后将数据元素x的值恢复为p(x1),数据元素y的值恢复到p(y1),插入数据元素z,并将其值设为p(z1)。本发明的闪存数据库数据恢复的方法,设计了一种新的日志记录格式,将变更的数据成员及其所有不同版本的数据地址保存为在同一日志记录中,便于在日志回滚或提交时根据事务id快速找到有效数据记录,增加数据恢复的效率。同时本发明遵循wal(writeaheadlogging)规则来决定何时刷新日志,即本地数据库被更改时,必须有相应的日志记录,反之未必如此。当系统出现冲突时,更新将仅仅被日志文件2存储,而不会传递到数据库中。因此在执行恢复操作时,上述机制能够确保数据库的一致性与完整性。本发明闪存数据库数据恢复的方法,利用链式日志系统的闪存数据库中存在的历史版本信息进行日志操作,采用链表结构替换顺序结构来存储日志记录以提高数据恢复效率。通过周期性检查点策略来移除失效的日志记录、节约闪存空间,同时有效缩减了日志文件的长度。以上所述仅是本发明的优选实施方式,应当指出,对于本
技术领域
的普通技术人员来说,在不脱离本发明技术原理的前提下,还可以做出若干改进和变形,这些改进和变形也应视为本发明的保护范围。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1