【检查点技术】
检查点记录与重新开始文件
含有检查点记录的日志的内容包括:
- 建立检查点时刻所有正在执行的事务清单
- 这些事务最近一个日志记录的地址
重新开始文件用来记录各个检查点记录在日志文件中的地址
如下图,说明了建立检查点 $C_i$ 时刻时对应的日志文件和重新开始文件
动态维护日志文件方法
动态维护日志文件的方法是周期性执行建立检查点、保存数据库状态的操作,具体步骤如下:
- 将当前日志缓冲区中的所有日志记录写入磁盘的日志文件上
- 在日志文件中写入一个检查点记录
- 将当前数据缓冲区的所有数据记录写入磁盘的数据库中
- 把检查点记录在日志文件中的地址写入一个重新开始文件
建立检查点
恢复子系统可以定期或不定期地建立检查点,保存数据库状态
- 定期建立:按照预定的时间间隔建立,如每隔一小时建立一个检查点
- 不定期建立:按照某种规则建立,如日志文件已写满一半建立一个检查点
【利用检查点的恢复策略】
恢复策略
使用检查点方法可以改善恢复效率,当事务 $T$ 在一个检查点之前提交,$T$ 对数据库所做的修改一定都已写入数据库,写入时间是这个检查点建立之前或在这个检查点建立之时
这样,在进行恢复处理时,没有必要对事务 $T$ 执行重做操作
如下图,系统出现故障时,恢复子系统会根据事务的不同状态来采取不同的恢复策略
恢复步骤
系统使用检查点方法进行恢复的步骤如下:
1.从重新开始文件中找到最后一个检查点记录在日志文件中的地址,由该地址在日志文件中找到最后一个检查点记录
2.由该检查点记录得到检查点建立时刻所有正在执行的事务清单 ACTIVE-LIST
,建立撤销队列 UNDO-LIST
与重做队列 REDO-LIST
,并将 ACTIVE-LIST
暂时放入 UNDO-LIST
,REDO-LIST
暂时为空
3.从检查点开始正向扫描日志文件,直到日志文件结束
- 如有新开始的事务 $T_i$,把 $T_i$ 暂时放入
UNDO-LIST
- 如有提交的事务 $T_j$,把 $T_j$ 从
UNDO-LIST
移到REDO-LIST
4.对 UNDO-LIST
中的每个事务执行 UNDO
操作,并对 REDO-LIST
中的每个事务执行 REDO
操作