前言
本文针对考纲上的故障恢复所涉及到的知识进行归纳总结。
事务故障
是什么
事务运行结果没有达到预期终点(commit 或者显式rollback)比如:
- 程序员写在程序里的预判,比如取钱事务,检测到余额不足就在else里rollback。
- 算数溢出,并发死锁要进行撤销事务之类的。
解决方案
事务撤销。
系统故障
是什么
(CPU故障,操作系统故障,DBMS代码错误,系统断电等软件故障)造成系统停止运作,使系统要重新启动。
解决方案
对已经提交的重做。
对其他的撤销。
介质故障
是什么
(磁盘损坏 磁头碰撞 瞬时强磁场干扰等硬件故障)
解决方案
装所有备份,然后根据日志对已经提交的事务一直重做。
详细解决方法
事务故障
- 反向扫描事务,查找有更新操作的事务
- 对该事务逆向处理,即把更新前的值写入数据库。
- 继续反向扫描,遇到有更新操作的事务就逆向写数据库
- 直到读到此事务的开始标记,就停下
系统故障
无检查点
- 正向扫描日志,建立redo队列和undo队列,已提交的放入redo序列,其他的放在undo序列。
- 对redo队列里的各个事务进行撤销处理,即反向扫描日志文件,把更新前的值写入数据库。
- 对undo队列里的各个事务进行重做处理,即正向扫描日志文件,把更新后的值写入数据库。
有检查点
- 在重新开始文件,找到最新的检查点在日志文件的地址
- 根据地址去日志文件找到最新检查点记录,得到检查点时刻所有正在执行的事务清单active-list
- 建立redo和undo队列
- 把active-list暂时放到undo队列
- 从检查点开始正向扫描日志,新开始的事务还在undo队列,已提交的事务移到redo队列。
- 完成之后,undo队列执行undo操作,redo队列执行redo操作。
介质故障
- 装入最新的海量数据库备份
- 依次装入上一步海量数据备份时间后的所有增量数据库备份
- 装入备份结束时刻的日志,利用日志重做所有故障点前已提交的事务,其他不用管