1
数据库原理与应用技术
1.12.3.1 11.3.1 检查点
11.3.1 检查点

利用日志技术进行数据库还原时,还原子系统需要搜索日志并检查所有日志记录,以确定哪些事务需要撤销,哪些事务需要重做。但实际上,许多需要REDO处理的事务已经将它们的更新操作写到数据库中了,然而,还原子系统又会重新执行这些操作,导致浪费大量时间。因此,针对这一问题,又开发了具有检查点的还原技术:在日志文件中增加“检查点(Check Point)记录”和一个重新开始文件,还原子系统在登录日志文件期间动态维护日志。

检查点记录的内容:检查点建立时所有正在执行的事务清单,事务最近一个日志记录的地址。

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

建立检查点Ci时对应的日志文件和重新开始文件,如图11-11所示。

图11-11 具有检查点的日志文件和重新开始文件

1. 动态维护日志的方法

动态维护日志的方法是周期性地执行如下操作:

(1) 将当前日志缓冲区中的所有日志记录写入日志文件;

(2) 在日志文件中写入一个检查点记录;

(3) 将当前数据缓冲区的所有数据记录写入磁盘的数据库中;

(4) 把检查点记录在日志文件中的地址写入重新开始文件。

由上可知,如果事务T在一个检查点前提交,则T对数据库所做的修改一定都已写入数据库,写入时间是这个检查点建立之前或建立之时,因此,使用检查点方法可以改善还原效率。系统出现故障时,还原子系统会根据事务的不同状态采取不同的还原策略,如图11-12所示。

图11-12 还原子系统采取的不同策略

T1:在检查点之前提交。

T2:在检查点之前开始执行,在检查点之后故障点之前提交。

T3:在检查点之前开始执行,在故障点时还未完成。

T4:在检查点之后开始执行,在检查点之后故障点之前提交。

T5:在检查点之后开始执行,在检查点时还未完成。

其中,T1在检查点之前已经提交,所以不必执行REDO操作;T3和T5在故障发生时还未完成,但可能有部分数据已写入数据库,所以予以撤销;T2和T4在检查点后才提交,其对数据库所做的修改在故障发生时可能还在缓冲区中,尚未全部写入数据库,所以要执行REDO。

2. 系统使用检查点方法进行还原的步骤

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

(2) 由该检查点记录得到建立检查点时所有正在执行的事务清单ACTIVE-LIST。这里要建立两个事务队列:执行 UNDO 操作的事务集合 UNDO-LIST;执行 REDO 操作的事务集合REDO-LIST。把ACTIVE-LIST暂时放入UNDO-LIST队列,REDO队列暂时为空。

(3) 从检查点开始正向扫描日志文件。如果有新开始的事务 Ti,则把 Ti 暂时放入UNDO-LIST队列;如果有提交的事务Tj,则把Tj从UNDO-LIST队列移到REDO-LIST队列;直至日志文件结束。

(4) 对UNDO-LIST中的每个事务执行UNDO操作,对REDO-LIST中的每个事务执行REDO操作。