数据库的故障及其恢复策略
在数据库运⾏过程中,可能会出现各种各样的故障,这些故障可分为以下三类:事务故障、系统故障和介质故障。应该根据故障类型的不同,采取不同的恢复策略。
  1,事务故障及其恢复:
  事务故障表⽰由⾮预期的、不正常的程序结束所造成的故障。
  造成程序⾮正常结束的原因包括输⼈数据错误、运算溢出、违反存储保护、并⾏事务发⽣死锁等。
  发⽣事务故障时,被迫中断的事务可能已对数据库进⾏丁修改,为了消除该事务对数据库的影响,要利⽤⽇志⽂件中所记载的信息,强⾏回滚(RoLLBAcK)该事务,将数据库恢复到修改前的初始状态。
  为此,要检查⽇志⽂件中由这些事务所引起的发⽣变化的记录,取消这些没有完成的事务所做的⼀切改变。
  这类恢复操作称为事务撤销(uNDo),具体做法如下。
  (1)反向扫描⽇志⽂件,查该事务的更新操作。
  (2)对该事务的更新操作执⾏反操作,即对已经插⼊的新记录进⾏删除操作,对⼰删除的记录进⾏插⼊操作,对修改的数据恢复旧值,⽤旧值代替新值。这样由后向前逐个扫描该事务已做的所有更新操作,并做同样处理,直到扫描到此事务的开始标记,事务故障恢复完毕为⽌。
  因此,⼀个事务是⼀个⼯作单位,也是⼀个恢复单位。⼀个事务越短,越便于对它进⾏UNDO操作。如果⼀个应⽤程序运⾏时间较长,则应该把该应⽤程序分成多个事务,⽤明确的coMMIT语句来结束各个事务。
2,系统故障及其恢复:
系统故障是指系统在运⾏过程中,由于某种原因,造成系统停⽌运转,致使所有正在运⾏的事务都以⾮正常⽅式终⽌,要求系统重新启动。引起系统故障的原因可能有硬件错误(如CPu故障、操作系统)或DBMS代码错误、突然断电等。
  这时,内存中数据库缓冲区的内容全部丢失,虽然存储在外部存储设备上的数据库并未破坏,但其内容不可靠了。系统故障发⽣后,对数据库的影响有以下两种情况。
  ⼀种情况是⼀些未完成事务对数据库的更新已写⼊数据库,这样在系统重新启动后,要强⾏撤销(uNDo)所有未完成的事务,清除这些事务对数据库所做的修改。这些末完成事务在⽇志⽂件中只有BEGIN TRANsLATl0N标记,⽽⽆COMMIT标记。
  另⼀种情况是有些已提交的事务对数据库的更新结果还保留在缓冲区中,尚未写到磁盘上的物理数据库中,这也使数据库处于不⼀致状态,因此应将这些事务已提交的结果重新写⼊数据库。这类恢复操作称为事务的重做(REDo)。这种巳提交事务在⽇志⽂件中既有BGIN TRANSCATION标记,也有COMMIT标记。
  因此,系统故障的恢复要完成两⽅⾯的⼯作,既要撤销所有末完成的事务,还要重做所有已提交的事务,这样才能将数据库真正恢复到⼀致的状态。具体做法如下。
  (1)正向扫描⽇志⽂件,查尚未提交的事务,将其事务标识记⼈撤销队列。同时查已经提交的事务,将其事务标识记⼊重做队列。
  (2)对撤销队列中的各个事务进⾏撤销处理。⽅法同事务故障中所介绍的撤销⽅法。
  (3)对重做队列中的各个事务进⾏重做处理。进⾏重做处理的⽅法是正向扫描⽇志⽂件,按照⽇志⽂件中所登记的操作内容,重新执⾏操作,使数据库恢复到最近某个可⽤状态。
  系统发⽣故障后,由于⽆法确定哪些末完成的事务已更新过数据库,哪些事务的提交结果尚未写⼊数据库,因此系统重新启动后,就要撤销所有的末完成的事务,重做所有的已经提交的事务。
  但是,在故障发⽣前已经运⾏完毕的事务有些是正常结束的,有些是异常结束的。所以⽆须把它们全
部撤销或重做。
  通常采⽤设⽴检查点(checkPoint)的⽅法来判断事务是否正常结束。每隔⼀段时间,⽐如说5分钟,系统就产⽣⼀个检查点,做下⾯⼀些事情:a,把仍保留在⽇志缓冲区中的内容写到⽇志⽂件中;b,在⽇志⽂件中写⼀个“检查点记录”;c,把数据库缓冲区中的内容写到数据库中,即把更新的内容写到物理数据库中;d,把⽇志⽂件中检查点记录的地址写到“重新启动⽂件”中。
  每个检查点记录包含的信息有在检查点时间的所有活动事务⼀览表、每个事务最近⽇志记录的地址。
  在重新启动时,恢复管理程序先从“重新启动⽂件”中获得检查点记录的地址,从⽇志⽂件中到该检查点记录的内容,通过⽇志往回,就能决定哪些事务需要撤销,恢复到初始的状态,哪些事务需要重做。为此利⽤检查点信息能做到及时、有效、正确地完成恢复⼯作。  3,介质故障及其恢复
介质故障是指系统在运⾏过程中,由于辅助存储器介质受到破坏,使存储在外存中的数据部分或全部丢失。
  这类故障⽐事务故障和系统故障发⽣的可能性要⼩,但这是最严重的⼀种故障,破坏性很⼤,磁盘上的物理数据和⽇志⽂件可能被破坏,这需要装⼊发⽣介质故障前最新的后备数据库副本,然后利⽤⽇志⽂件重做该副本后所运⾏的所有事务。
  具体⽅法如下。
  (1)装⼊最新的数据库副本,使数据库恢复到最近⼀次转储时的可⽤状态。
数据库故障恢复  (2)装⼊最新的⽇志⽂件副本,根据⽇志⽂件中的内容重做已完成的事务。⾸先扫描⽇志⽂件,出故障发⽣时⼰提交的事务,将其记⼊重做队列。然后正向扫描⽇志⽂件,对重做队列中的各个事务进⾏重做处理,⽅法是正向扫描⽇志⽂件,对每个重做事务重新执⾏登记的操作,即将⽇志记录中“更新后的值”写⼊数据库。
  这样就可以将数据库恢复⾄故障前某⼀时刻的⼀致状态了。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。