数据库复习(故障恢复)

发布时间 2023-12-19 21:38:08作者: lmj625

前言

本文针对考纲上的故障恢复所涉及到的知识进行归纳总结。



事务故障

是什么

事务运行结果没有达到预期终点(commit 或者显式rollback)比如:

  • 程序员写在程序里的预判,比如取钱事务,检测到余额不足就在else里rollback。
  • 算数溢出,并发死锁要进行撤销事务之类的。

解决方案

事务撤销。


系统故障

是什么

(CPU故障,操作系统故障,DBMS代码错误,系统断电等软件故障)造成系统停止运作,使系统要重新启动。

解决方案

对已经提交的重做。
对其他的撤销。


介质故障

是什么

(磁盘损坏 磁头碰撞 瞬时强磁场干扰等硬件故障)

解决方案

装所有备份,然后根据日志对已经提交的事务一直重做。



详细解决方法

事务故障

  • 反向扫描事务,查找有更新操作的事务
  • 对该事务逆向处理,即把更新前的值写入数据库。
  • 继续反向扫描,遇到有更新操作的事务就逆向写数据库
  • 直到读到此事务的开始标记,就停下

系统故障

无检查点

  • 正向扫描日志,建立redo队列和undo队列,已提交的放入redo序列,其他的放在undo序列。
  • 对redo队列里的各个事务进行撤销处理,即反向扫描日志文件,把更新前的值写入数据库。
  • 对undo队列里的各个事务进行重做处理,即正向扫描日志文件,把更新后的值写入数据库。

有检查点

image

  • 在重新开始文件,找到最新的检查点在日志文件的地址
  • 根据地址去日志文件找到最新检查点记录,得到检查点时刻所有正在执行的事务清单active-list
  • 建立redo和undo队列
  • 把active-list暂时放到undo队列
  • 从检查点开始正向扫描日志,新开始的事务还在undo队列,已提交的事务移到redo队列。
  • 完成之后,undo队列执行undo操作,redo队列执行redo操作。

介质故障

image

  • 装入最新的海量数据库备份
  • 依次装入上一步海量数据备份时间后的所有增量数据库备份
  • 装入备份结束时刻的日志,利用日志重做所有故障点前已提交的事务,其他不用管