Alex_McAvoy

想要成为渔夫的猎手

数据库故障恢复策略

【事务故障的恢复】

事务故障是指事务在运行至正常终止点前被终止,此时恢复子系统应利用日志文件撤销次事务已对数据库进行的新修改

事务故障的恢复由系统自动完成,对用户是透明的,不需要用户干预,其步骤如下:

1.反向扫描文件日志,查找该事务的更新操作

2.对该事务的更新操作执行逆操作,即将日志记录中更新前的值写入数据库

  • 若是插入操作:更新前的值为空,则相当于做删除操作
  • 若是删除操作:更新后的值为空,则相当于做插入操作
  • 若是修改操作:相当于用修改前值代替修改后值

3.继续反向扫描日志文件,查找该事务的其他更新操作,并做同样处理

4.如此处理下去,直至读到此事务的开始标记,事务故障恢复完成

【系统故障的恢复】

数据库系统的故障种类 中,介绍过系统故障发生的原因:

  • 未完成事务对数据库的更新可能以写入数据库
  • 已提交事务对数据库的更新可能停留在缓冲区,未来得及写入数据库

因此,对于系统故障的恢复,就是撤销故障发生时未完成的事务,重做已完成的事务

系统故障的恢复是由系统在重启时自动完成的,不需要用户的干预,其步骤如下:

1.正向扫描日志文件,寻找以下两类事务:

  • 故障发生前已提交的事务(即有 BEGIN TRANSACTION 记录,也有 COMMIT 记录),将事务标识记入重做队列 REDO-LIST
  • 故障发生时尚未完成的事务(只有 BEGIN TRANSACTION 记录),将其事务标识记入撤销队列 UNDO-LIST

2.对撤销队列 UNDO-LIST 中的各事务进行撤销处理,即反向扫描日志文件,对每个 UNDO 事务的更新执行逆操作(将日志记录中更新前的值写入数据库)

3.对重做队列 REDO-LIST 中的各事务进行重做处理,即正向扫描日志文件,对每个 REDO 事务重新执行登记操作(将日志记录中更新后的值写入数据库)

【介质故障的恢复】

发生截止故障后,磁盘上的物理数据和日志文件被损坏,恢复的方法是重装数据库,然后重做已完成的事务,具体步骤如下:

1.装入离故障发生时最近的转储副本,使数据库恢复到最近一次转储时的一致性状态

  • 对于静态转储的数据库副本:装入后数据库即处于一致性状态
  • 对于动态转储的数据库副本:还需同时装入转储时的日志文件副本,利用恢复系统故障的方法(REDOUNDO 操作),使数据库恢复到一致性状态

2.装入转储结束时刻的日志文件副本,重做已完成的事务

  • 扫描日志文件,找出故障发生时已提交的事务标识,将其记入重做队列 REDO-LIST
  • 对重做队列 REDO-LIST 中的各事务进行重做处理,即正向扫描日志文件,对每个 REDO 事务重新执行登记操作(将日志记录中更新后的值写入数据库)

需要说明的是,介质故障的恢复需要数据库管理员的介入,但数据库管理员仅需重装最近转储的数据库副本和日志文件副本,然后执行系统提供的恢复命令即可,具体的恢复操作仍由 DBMS 完成

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