文档介绍:数据库系统概论第七章
数据库恢复概述
数据库恢复子系统的目的包括:
保证事务的原子性,即确保一个事务被交付运行后,要么该事务中的所有数据库操作都被成功地完成,而且这些操作的结果被永久地存储到数据库中,要么这个事务对数据库没有任何影响描日志文件),查找该事务的更新操作。
对该事务的更新操作执行逆操作,即将日志记录中的“更新前的值”写入数据库。这时,如果记录中是插入操作,则相当于做删除操作;如果记录中是删除操作,则相当于做插入操作;如果记录中是修改操作,则用修改前的值代替修改后的值。
继续反向扫描日志文件,查找该事务的更新操作,并做同样处理
如此处理下去,直到读到该事务的开始标志。
恢复策略
系统故障的恢复
系统故障造成数据库不一致状态的原因有两个,一是未完成的事务对数据库的更新可能已经写入数据库;二是已提交事务对数据库的更新可能还留在缓冲区还没来得及写入数据库。因此恢复操作就是要撤销故障发生时未完成的事务,重做已完成的事务。
恢复策略
其步骤是:
正向扫描日志文件,找出故障发生前已经提交的事务,将其事务标识记入重做(REDO)队列。同时找出故障发生时尚未完成的事务,将其事务标识记入撤销(UNDO)队列。
对撤销队列中的各个事务进行UNDO处理。即反向扫描日志文件,对每个UNDO事务的更新操作执行逆操作,即将日志文件中的“更新前的值”写入数据库。
对重做队列中的各个事务进行REDO处理。即正向扫描日志文件,对每个REDO事务重新执行日志文件登记的操作,即将日志文件中的“更新后的值”写入数据库。
恢复策略
介质故障的恢复
介质故障将全部或部分地破坏数据库甚至是日志文件,其恢复的方法是:
装入最新的数据库后备副本(离故障发生时刻最近的转储副本),使数据库恢复到最近一次转储时的一致状态。对于动态转储的副本,还需要装入转储开始时刻的日志文件副本,将数据库恢复到一致状态。
装入转储以后的日志文件副本,重做已经完成的事务。
推迟更新技术
推迟更新技术在日志中记录对事务T的所有更新操作,并把所有对数据库的更新操作推迟到该事务提交时执行。它遵循以下推迟更新协议:
每个事务在到达提交点之前不能更新数据库。
一个事务的所有更新操作所对应的日志记录写入永恒存储器之前,该事务不能到达提交点。
当一个事务到达提交点时,我们称该事务进入部分提交状态。推迟更新协议保证当一个事务部分提交时,该事务的所有更新操作的信息已经记录在日志中。
推迟更新技术
当T开始执行时,推迟更新技术在日志中写入<T, start>。如果T执行Write(X)的操作,推迟更新技术在日志中写入<T, X, V1, V2> ,其中V1为X的原始值,V2为Write(X)要写入的X值。当T进入部分提交状态时,推迟更新技术在日志中写入<T, commit>。接着,所有日志记录都写入永恒存储器。然后,对于日志中的每个形如<T, X, V1, V2>的记录,将数据库中X数据项的值更新为V2 。
推迟更新技术
试考虑如下数据库事务T0和T1,其中A、B和C的初值分别为1000,2000和700,T0和T1按照串行调度<T0, T1>执行:
T0: read(A)
A=A-50
write(A)
read(B)
B=B+50
write(B)
T1: read(C)
C=C-100
write(C)
推迟更新技术
日志文件
数据库
T0, starts
T0, A, 950
T0, B, 2050
T0, commit
A=950
B=2050
T1, starts
T1, C, 600
T1, commit
C=600
推迟更新技术
T0, starts
T0, starts
T0, starts
T0, A, 950
T0, A, 950
T0, A, 950
T0, B, 2050
T0, B, 2050
T0, B, 2050
T0, commit
T0, commit
T1, starts
T1, starts
T1, C, 600
T1, C, 600
T1, commit
即时更新技术
即时更新技术允许事务直接更新数据库。处于活动状态的事务直接在数据库实施的更新称为非提交更新。任何即时更新技术都必须遵循如下的即时更新协议:
所有<T, X, V1, V2>型日志记录安全的存储到永恒存储器之前,不允许事务T更新数据库。
所有<T, X, V1, V2>型日志记录安全的存储到永恒存储器之前,不允许事务T提交。