事务故障的恢复
事务故障:事务在运行到正常终点前停止,恢复子系统用日志文件撤销(UNDO)事务已对数据库进行的修改。
事务故障的恢复步骤
- 从后向前扫描日志文件,查找事务的更新操作。
- 对该事务的更新操作做逆操作,即将日志文件中的更新前的值写入数据库。
删除操作:做插入操作
插入操作:做删除操作
修改操作:用修改前值改修改后值 - 继续反向查找更新操作
- 直到事务的开始标识
系统故障的修复
系统故障造成数据库不一致状态的原因有两个。一是未完成的事务部分修改已写入物理数据库。二是已提交事务的更新还留在缓冲区未进入数据库
恢复方法:
- UNDO故障时未完成的事务
- REDO已完成的事务
系统故障的恢复会在系统重启时自己完成,不需要用户干预。
系统故障的修复步骤
- 正向扫描日志文件
找出故障前已经提交的事务,将它加入重做列表,找出未完成的事务,加入撤销列表 - 对撤销列表进行撤销处理
反向扫描日志文件,对每个撤销事务进行逆操作,即将日志文件中“更新前的值”写入数据库 - 对重做列表事务重做处理
正向扫描重做列表对每个重做事务进行登记操作,即将日志记录中“更新后的值”写入数据库。
介质故障的恢复
介质故障后磁盘上的物理数据和日志文件被破坏,这是最严重的故障。恢复方法是重装数据库,然后重做已完成事务。
恢复步骤:
- 装入最新的后备数据库副本(离故障发生时候最近的转储版本),使数据库恢复到最近的一致性状态
对于静态转储的副本,重装后就是一致性状态
对于动态转储的副本,重装后还是需要装入转储时刻的日志文件,利用修复系统故障的方法重做和撤销等才能将数据恢复到一致性状态。 - 装入有关的日志文件的副本(转储结束时刻日志文件的副本),重做已完成事务
首先扫描日志文件,找出故障发生时已经提交的事务,加入重做列表。然后正向扫描,对重做列表中事务进行重做操作。即将“更新后的值”写入数据库
说明:介质故障的修复需要数据库管理员的介入。数据库管理员的工作是重装最近转储的数据库和日志文件副本,执行系统提供的恢复命令。具体的恢复操作仍然由系统完成。
具有检查点的恢复技术
问题的提出:
使用日志技术进行数据库恢复时,恢复子系统必须搜索日志,确认哪些事务要重做,哪些事务要撤销。但存在两个问题:一是搜索日志要大量时间,二是重新执行浪费大量时间。
解决方案:具有检查点的恢复技术,在日志中添加检查点,增加重新开始文件,恢复子系统在登录日志期间动态维护日志
检查点技术
检查点记录的内容
- 建立检查点时刻所有正在执行的事务清单
- 这些事务最近一个日志记录所在地址(方便查找,避免搜索整个日志文件)
- 重新开始文件的内容
- 记录各个检查点记录在日志文件在日志中的地址
重新开始文件记录的是日志文件中检查点的位置
动态维护日志文件的方法
周期性地执行如下操作,建立检查点,保存数据库状态。
将当前日志缓冲区所有日志记录写进磁盘的日志文件
在日志文件写入一个检查点记录
将当前数据缓冲区所有的数据写入磁盘的数据库中
把检查点记录在日志文件中的地址写入一个重新开始文件
说明:恢复子系统可以定期或不定期地建立检查点,保存数据库状态,可以设置没一小时保存一次,或日志文件写满一半时保存一次。
利用检查点的恢复策略
使用检查点方法可以改善恢复效率
当事务T在一个检查点之前已经完成了写入数据库,写入时间是在这个检查点建立之前或之时,这样在恢复时没必要重做改事务。
系统出现故障时,恢复子系统根据不同状态采取不同的恢复策略,具体如下图:
利用检查点的恢复策略
- 从重新开始文件中找到最后一个检查点在日志文件中的地址,由改地址获得日志文件的记录。
- 由该记录点记录的所有检查点记录时刻所有正在执行的事务清单ACTIVE-LIST,建立两个事务队列UNDO-LIST和REDO-LIST,将ACTIVE-LIST全放入UNDO,REDO暂时为空。
- 从检查点开始扫描各个事务,如果有新开始的事务Ti则将Ti放入UNDO,如有提交了的事务Tj,把Tj从UNDO移到REDO
- 对所有UNDO-LIST里面的撤销,REDO-LIST重做
以上内容基于圣才教育数据库系统概论ppt 修改整理