Note11- 恢复系统
数据库恢复机制用来进行事务终止后的善后处理和系统故障恢复处理,确保系统发生故障后,数据库能够恢复到正确的水平。
日志
日志记录的格式:
- <T, start>,表示事务 T 已经开始
- <T, commit>,表示事务 T 成功完成
- <T, abort>,事务 T 未成功,被中止
- <T, X, v1, v2>,事务 T 该拜年了数据库元素 X,旧值,新值
推迟更新技术
在事务提交时才执行所有的更新操作。
恢复过程:
- 从后向前扫描日志记录,建立两个事务表:一个表称为提交事务表,包含全部具有日志记录 <T, commit> 的事务 T,即已提交的事务;另一个表称为未提交事务表,包括全部具有日志记录 <T, start>,但不具有日志记录 <T, commit> 的事务 T,即尚未提交的事务
- 对于提交事务表中的每个事务 T,执行 REDO(T)
- 对于未提交事务表中的每个事务 T,删除所有 T 的日志记录,放弃 T,待以后重新启动执行
即时更新协议
允许事务直接更新数据库。
恢复过程:
- 从后向前扫描日志记录,建立两个事务表:一个表称为提交事务表,包含全部具有日志记录 <T, commit> 的事务 T,即已提交的事务;另一个表称为未提交事务表,包括全部具有日志记录 <T, start>,但不具有日志记录 <T, commit> 的事务 T,即尚未提交的事务
- 对于未提交事务表中的每个事务 T,执行 UNDO(T),写一个 <T, abort> 日志记录,表明撤销完成
- 对于提交事务表中的每个事务 T,执行 REDO(T)
检查点
检查点的执行过程如下:
- 将当前主存的所有日志输出到稳定存储器
- 将所有修改的缓冲块输出到磁盘
- 将一个日志记录<checkpoint, L>输出到稳定的存储器,其中 L 是执行检查点时正活跃的事务列表
恢复过程:
- 系统检查日志以找到最后一条<checkpoint, L>记录
- 对 L 中的事务,以及<checkpoint, L>记录写到日志中之后才开始执行的事务,做如下操作:
- 对于满足上述要求的 Tk,若日志中没有 <Tk, commit> 或 <Tk, abort> 记录,则执行 undo(Tk)
- 否则执行 redo(Tk)
恢复算法
正常回滚
正常操作时,事务 Ti 的回滚执行如下操作:
- 从后往前扫描日志,对于所发现的 Ti 的每个形如 <Ti, Xj, V1, V2> 的日志记录
- 值 V1 被写到数据项 Xj 中,并且往日志中写一个特殊的只读日志记录 <Ti, Xi, V1>,称为补偿日志记录,这样的记录不需要 undo
- 一旦发现 <Ti, start> 日志记录,就停止从后往前的扫描,并在日志中写一个 <Ti, abort>
崩溃恢复
- 重做阶段
- 系统通过从最后一个检查点开始正向扫描日志
- 将 undo-list 初始设为日志记录中<checkpoint, L>列表
- 一旦遇到<Ti, Xj, V1, V2>的正常日志记录或形为<Ti, Xj, V2>的 redo-only 日志记录,重做这个操作 ,将 V2 的值写给数据项 Xj
- 一旦发现形为 <Ti, start> 的日志记录,将 Ti 加到 undo-list
- 一旦发现形为<Ti, commit>或<Ti, abort>的日志记录,将 Ti 从 undo-list 删除
- 撤销阶段
- 从尾端开始反向扫描日志
- 一旦发现属于 undo-list 中的事务的日志记录,就执行 undo 操作,如事务回滚算法
- 当系统发现 undo-list 中事务 Ti 的<Ti,start>的日志记录,就往日志中写一个<Ti, abort>,并且将 Ti 从 undo-list 中去
- 一旦 undo-list 为空表,即系统找到了开始时位于 undo-list 中的所有事务<Ti,start>,则撤销阶段结束