Alex_McAvoy

想要成为渔夫的猎手

数据库日志检查点技术

【检查点技术】

检查点记录与重新开始文件

含有检查点记录的日志的内容包括:

  • 建立检查点时刻所有正在执行的事务清单
  • 这些事务最近一个日志记录的地址

重新开始文件用来记录各个检查点记录在日志文件中的地址

如下图,说明了建立检查点 $C_i$ 时刻时对应的日志文件和重新开始文件

动态维护日志文件方法

动态维护日志文件的方法是周期性执行建立检查点保存数据库状态的操作,具体步骤如下:

  1. 将当前日志缓冲区中的所有日志记录写入磁盘的日志文件上
  2. 在日志文件中写入一个检查点记录
  3. 将当前数据缓冲区的所有数据记录写入磁盘的数据库中
  4. 把检查点记录在日志文件中的地址写入一个重新开始文件

建立检查点

恢复子系统可以定期或不定期地建立检查点,保存数据库状态

  • 定期建立:按照预定的时间间隔建立,如每隔一小时建立一个检查点
  • 不定期建立:按照某种规则建立,如日志文件已写满一半建立一个检查点

【利用检查点的恢复策略】

恢复策略

使用检查点方法可以改善恢复效率,当事务 $T$ 在一个检查点之前提交,$T$ 对数据库所做的修改一定都已写入数据库,写入时间是这个检查点建立之前或在这个检查点建立之时

这样,在进行恢复处理时,没有必要对事务 $T$ 执行重做操作

如下图,系统出现故障时,恢复子系统会根据事务的不同状态来采取不同的恢复策略

恢复步骤

系统使用检查点方法进行恢复的步骤如下:

1.从重新开始文件中找到最后一个检查点记录在日志文件中的地址,由该地址在日志文件中找到最后一个检查点记录

2.由该检查点记录得到检查点建立时刻所有正在执行的事务清单 ACTIVE-LIST,建立撤销队列 UNDO-LIST 与重做队列 REDO-LIST,并将 ACTIVE-LIST 暂时放入 UNDO-LISTREDO-LIST 暂时为空

3.从检查点开始正向扫描日志文件,直到日志文件结束

  • 如有新开始的事务 $T_i$,把 $T_i$ 暂时放入 UNDO-LIST
  • 如有提交的事务 $T_j$,把 $T_j$ 从 UNDO-LIST 移到 REDO-LIST

4.对 UNDO-LIST 中的每个事务执行 UNDO 操作,并对 REDO-LIST 中的每个事务执行 REDO 操作

感谢您对我的支持,让我继续努力分享有用的技术与知识点!