内存数据库故障恢复(数据库)
时间:2022-11-05 02:30:02 | 来源:信息时代
时间:2022-11-05 02:30:02 来源:信息时代
内存数据库故障恢复 : 将被破坏的内存数据库中的数据还原为正常数据的过程。内存数据库恢复比传统的数据库恢复更复杂,它既有S-DB(即传统的DRDB)恢复问题,也有M-DB恢复问题,这里主要介绍后者。MMDB恢复与DRDB恢复的差别主要表现在日志设施、检验点技术和数据重装策略等方面。
1. 一般恢复模型
已开发的内存数据库恢复技术有多种,其恢复机制采用不同的体系结构。但基于恢复的原理,一般恢复模型必须考虑下列各点:
(1)恢复的焦点是内存而不是磁盘数据库,即不考虑磁盘故障的恢复,因为这种恢复与传统的磁盘数据库恢复几乎一样。
(2)恢复本身的I/O要求的满足不应以牺牲事务对M-DB的存取性能为代价,这尤其意味着恢复应尽可能进行与事务处理异步的I/O。
(3) 由于恢复的代价在一个事务执行的总代价中占的比例上升,所以恢复的性能对整个系统的总体性能更为关键,因而传统的恢复技术,如REDO/UNDO式记日志、同步地作检验点、在“静止状态”(无事务活跃)下执行恢复等等都已不适用,要开发适合于MMDB的恢复技术与工具。
考虑到上述各点,一个MMDB的恢复机制如图1所示。其中稳定日志缓冲区(SLB)在M2的T-DB中,它是稳固内存(如可用UPS实现)。日志管理器接收记日志请求,在SLB中写有关日志记录,并将已提交事务的数据库变更日志记录按对应的数据库片成簇为页,然后写入稳固日志(LOG)中。由此可见,LOG中只保留已提交事务的日志记录,即REDO-Only记录。SLB同时又兼作事务的“影子”工作区,每个事务有各自的SLB,其更改操作都在其中进行。每当提交处理时,日志管理器将SLB中记录写入LOG后,相应SLB便释放以供别的事务重用。一旦事务提交,提交处理器先请求日志管理器写“事务提交” 日志记录,然后用提交的各变更的“后映像”刷新O-DB。若一个事务ABORT,则仅简单地放弃其SLB就行了。执行检验点操作时,根据日志提供的信息,将上次检验点以来O-DB中变更的数据库片刷新到S-DB中,并请求记“检验点” 日志记录。交换处理器本来是负责O-DB与S-DB间的数据交换,但它同时兼备恢复时的重装功能。每当系统发生故障后,恢复管理器先调用交换处理器按一定的策略将S-DB的相关数据库片重装入O-DB,并依LOG(包括SLB中的当前部分)记录REDO O-DB直到最近的一致状态。
图1 MMDB恢复机制体系结构
2. 记日志
有三种类型的记录: 关于系统运行、关于事务行为及关于数据库变更。系统运行记录包含系统运行情况的信息,如日期、时间、入/出事务的目录:事务调度时间、事务的开始、提交或夭折; 检验点等。事务记录记载活动事务的有关信息: 事务标识符、对应代码(程序)标识符; 操作类型及其对象标识符、输入/出数据; 事务开始时间、完成时间等。数据库变更记录则包含了所变更的数据的定位(数据单位的类型、数据标识符),它的前/后映像等。
(1)记日志的策略: 在上述恢复机制模型下,记日志的策略可以有三种:按值、按活动和按事务。按值记日志策略在日志中记下由各事务变更的任何数据部分的定位及其新值(后映像)。按事务记日志则记录关于事务本身的描述,以便在恢复时可以通过重执行这些事务来重构它们所作出的改变。按活动记日志实际是按事务记日志策略的变种,它记载有关一个事务的所有记录级活动(如插入、修改记录操作)的信息,如操作的类型、对象(记录标识)、主体(事务标识)、参数(值)等。显然这三种策略不是彼此独立各自完备的,它们可以相辅相成,综合应用,且无论采用什么策略,有关系统运行记录都是不可缺少的,这样才能实现完整的系统恢复,包括数据库恢复、事务处理恢复、系统服务恢复。
(2)日志记录的成簇: 就是将已提交事务的数据库变更日志记录按对应被变更的数据片而组合成页。页的大小是预先定义的,当一页填满时则一次写入LOG,若对应一个数据库片有多个页时,它们被拉链。这样做至少有三个优点: ①减少写入外存LOG的次数;②在恢复时,很容易一次找到对应于一个特定数据库片的所有日志记录,从而省时,同时还有利于“渐增恢复”; ③通过记下各数据库片的地址,传给检验点处理,使做检验点操作很简便。
按图1中所示的恢复模型,MMDB的记日志与传统的日志相比有下列特点: ①日志缓冲区与事务的工作区合一,只有一个后映像副本。这样不但节省了内存空间,也省了写两个后映像副本(工作区,日志缓冲区各一)的一半的时间。②LOG中只存储已提交的后映像,无前映像,即只需REDO-only,无须UNDO。这样不仅使记LOG的空间与时间几乎缩小一半,且以后恢复时,也省去做UNDO操作的开销。③传统的日志记录法是将所有活动事务的记录彼此掺杂而序列地记在单一的缓冲区中。这样需要保留一张已提交事务表,每当将日志缓冲区的记录写入磁盘LOG时,都要先去掉它的前映像,而一旦这些事务的提交数据永久地写入磁盘数据库,则要在表中删去它们,这样要花费时空开销。现在是各自的SLB,只记录了后映像,故省去前述的开销。④每个活动事务有各自的SLB,然后按数据库片聚簇成页,再一次一页地写入磁盘LOG中。这样可以并行地工作,还有前面所述成簇的优点,故使恢复的效率和系统性能提高。
3.检验点操作
一般检验点操作是让数据库处于“静止”状态,即让当前事务执行完,而不让新的事务开始。这对现代应用,如实时性应用是不现实的。对MMDB可以采用一些新的方法与技术。
(1)作检验点的策略: 作检验点的目的是为了减小恢复的工作量,缩短恢复时间,它限制恢复活动仅对那些自上次检验点以来开始的事务进行,其任务就是将这些事务对数据库所作的变更进行备份。作备份(检验点)的策略有三种: 一是“事务一致性”备份(检验点),它原子地反映一个事务活动,即原子地看到一事务,故备份或者全是后映像(事务提交)或全是前映像(事务夭折),不会有的是前映像,有的后映像。二是“活动一致性”备份,它原子地反映每一活动(不是整个事务),故备份可能既有前映像也有后映像,但不会有反映部分变更状态的记录。三是“模糊”备份(检验点),它不保证事务或活动的原子性。
(2)检验点算法: 上述三种策略实际上是两大类型: 一类是一致性(事务或活动)备份检验点; 另一类是非一致性备份检验点。一致性检验点要保证在检验点期间,被备份的数据不同时被活动的事务修改,要达到这个目的可以有多种算法,代表性的有: ①“静止”检验点: 周期地如前所述让数据库处于“静止”(一致)状态,再将M-DB的变更数据(又称“脏数据”)复制到S-DB,在整个复制期间停止事务对这些数据的存取。这就是一般传统的检验点操作算法。如前所述,它要频繁地长时间地推迟事务,这对现代应用是不可接受的,故该方法对高性能应用不适合。②“黑白”检验点: 这种算法的基本思想是每一数据库片有一个“黑白”位表明它是否在当前检验点中,另外有一个“变更”位表明其是否是“脏”的,每当事务变更它时,就置1。所有片的颜色最初为白,一旦进入检验点则置为“黑”,出检验点时又恢复为“白”。该算法一次锁住一片,其时间是它被备份的时间。这里的“备份时间”还不一定是真的直接复制到S-DB的时间,还可用Spooling技术,这样时间更短。③“更新时复制”检验点: 它是前两种技术的综合。它首先如“静止”检验点一样使数据库处于一致状态,然后作检验点操作,其算法类似于“黑白”法。该算法对每一数据库片使用了一个指向其一致性“瞬像”的指针,即每当更改数据片时,事务要保存老副本,而以指针指向它。“黑白”及“变更”位与上法一样。上述的“黑白”和“更新复制”算法都可用来产生事务或活动一致性备份,这只要事务处理分别阻塞任何事务或事务的活动存取黑片即可。④“批复制变更”检验点: 按这种方法,每一数据库片有一“脏”(变更)位表示它变更过,还有一“时标”TS,表示最近被变更的时间(按系统时钟)。设TC为当前检验点开始时间或为0(如果无检验点进行),此后,这一个事务企图变更一个数据库片时,则比较该片的TS与TC,如果TS<TC,且该片是“脏”的,则建立该片的一个新副本,然后对新副本进行变更,且更新其TS成最近的变更时间。
其算法分两段进行: 第1段: ①系统最初是静止的,置TC为当前时钟时间以表示一检验点开始,设Sm为自上一检验点以来变更了的数据库片的集合; ②建立活动事务表,然后可重新继续事务的活动(此时不会再改变Sm中片的老版本); ③若有S∈Sm,TS<TC,则写S到一稳定(stable)存储器文件Sst;④在日志中写“检验点开始”记录,它包括TC及各活动事务。此时第1段结束。第2段:①将Sm中的片写到S-DB中以作备份(此备份就是TC时的M-DB的一致状态);②在日志中写“检验点结束”记录;③去掉Sst(此前,若系统发生故障,则它用来作恢复),重置TC。该算法产生活动一致性备份,且检验点与事务活动并行(异步)进行。
(3)检验点操作过程: 该检验点算法的操作过程如下: 每当日志管理器写一提交日志记录并按数据库片将该提交事务所作的变更组合成页时,将变更数据库片的地址写入其与检验点处理的“通信区”。其检验点操作过程如下: ①检验点处理周期地检查“通信区”,若有变更片地址,则启动一个“检验点事务”来执行备份工作。②“检验点事务”请求在相应片上的READ锁(只要读锁就足以保证“事务一致性”备份),以免被提交处理同时写。③若READ锁获准,则复制被锁片到I/O缓冲区后立即释放锁。所以一片只被锁住在内存复制它所需时间,这样检验点事务只对一般事务产生极小的影响,然后缓冲区以批处理形式写入S-DB的备份中。④各数据库片被复制到备份后,清除“通信区”以备下一检验点使用,“检验点事务”提交,检验点结束。这样需要两个“通信区”以便“检验点事务”和日志管理器交替使用。