数据库原理——第十章:数据库恢复技术

参考书目《数据库系统概论(第5版)》

事务的基本概念

事务是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位
COMMIT操作,即提交,是将事务中所有对数据库的更新写回到磁盘上的物理数据库中
ROLLBACK操作,即回滚,事务运行过程中发生了错误,系统将事务对数据库所有已完成的操作全部撤销,回滚到事务开始时的状态
事务的ACID特性:

  • 原子性Atomicity):事务是数据库的逻辑工作单位,事务中包括的诸操作要么都做,要么都不做
  • 一致性Consistency):事务执行的结果必须是使数据库从一个一致状态变到另一个一致状态;一致性与原子性是密切相关的
  • 隔离性Isolation):一个事务的执行不能被其他事务干扰
  • 持续性Durability):也称为永久性,一个事务一旦提交,他对数据库中的数据改变就应该是永久性的

ACID可能遭到破坏的因素有:

  1. 多个事务并发运行时,不同事务的操作交叉执行
  2. 事务在运行过程中被强行停止

数据库恢复:数据库管理系统把数据库错误状态恢复到某一已知的正确状态(亦称为一致状态)


故障的种类

  1. 事务内部的故障
    事务内部的故障指事务执行到某一位置主动选择回滚。例如银行执行扣款时,若余额小于0,则主动执行回滚,回到未扣款前的状态
  2. 系统故障
    系统故障指造成系统停止运转的任何事件,使得系统要重新启动
    回复子系统在系统重启后,需要撤销所有未完成的事务,重做所有已提交的事务,以将数据库恢复到一致状态
  3. 介质故障
    指外存故障,如磁盘损坏、瞬时强磁场干扰、火灾等,破坏性最大
  4. 计算机病毒

各类故障对数据库的影响有两种结果:

  1. 数据库本身被破坏
  2. 数据库未被破坏,但数据可能不正确,这是由于事务的运行被非正常终止造成的

恢复的实现技术

恢复的基本原理——冗余,常用技术有数据转储登记日志文件

数据转储(backup)

转储:即数据库管理员定期地将整个数据库复制到其他存储介质上保存起来地过程,备用数据称为后备副本
转储操作十分耗费时间和资源,不能频繁进行
转储可分为两种状态:静态转储动态转储

  • 静态转储:在系统中无运行事务时进行的转储操作,转储期间不允许对数据库执行任何存取和修改
    • 得到的是一个一致性副本
    • 降低数据库的可用性
  • 动态转储:转储期间允许对数据库进行存取和修改,即转储和用户事务可以并发执行
    • 必须把转储期间各事务对数据库的修改活动记录下来,建立日志文件

转储还可分为两种方式:海量转储增量转储

  • 海量转储:每次转储全部数据库
  • 增量转储:每次只转储上一次转储后更新过的数据

转储方法:动态海量转储动态增量转储静态海量转储静态增量转储

登记日志文件(logging)

日志文件是用来记录事务对数据库地更新操作的文件
日志文件有两种格式:以记录为单位的日志文件和以数据块为单位的日志文件
对于以记录为单位的日志文件,其需要登记的内容包括:

  • 各个事务的开始标记
  • 各个事务的结束标记
  • 各个事务的所有更新操作

日志文件的作用:

  • 事务故障恢复和系统故障恢复必须用日志文件
  • 在动态转储方式中必须建立日志文件,后备副本和日志文件结合起来才能有效的恢复数据库
  • 在静态转储中也可以建立日志文件,用于加速数据库恢复过程

为保证数据库是可恢复的,登记日志文件的两条原则:

  • 登记的次序严格按并发事务执行的时间次序
  • 必须先写日志文件,后写数据库

恢复策略

事务故障的恢复

事务故障是指在运行至正常终止点前被终止,此时恢复子系统利用日志文件撤销(UNDO)此事务已对数据库进行的修改
事务故障的恢复由系统自动完成,对用户是透明的
恢复步骤为:

  1. 反向扫描日志文件,查找该事务的更新操作
  2. 对该事务的更新操作执行逆操作
  3. 继续反向扫描日志文件,查找该事务的其他更新操作,并做同样处理
  4. 如此处理下去,直到读到此事务的开始标记,事务故障恢复完成

系统故障的恢复

系统故障导致不一致的原因有两个:

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

恢复操作就是撤销故障发生时未完成的事务重做已完成的事务
系统故障的恢复由系统在重新启动时自动完成,不需要用户的干预
恢复步骤为:

  1. 正向扫描日志文件,找出在故障发生前已经提交的事务,将其事务标识记入重做队列(REDO-LIST)。同时找出故障发生时尚未完成的事务,将其事务标识记入撤销队列(UNDO-LIST)
  2. 对撤销队列中的各个事务进行撤销(UNDO)处理
  3. 对重做队列中的各个事务进行重做(REDO)处理

介质故障的恢复

发生介质故障后,磁盘上的物理数据和日志文件被破坏,这是最严重的故障,恢复方法是重装数据库,然后重做已完成的事务
介质故障的恢复需要数据库管理员介入
恢复步骤为:

  1. 装入最新的数据库副本
  2. 装入相应的日志文件副本,重做已完成的事务

具有检查点的恢复技术

检查点记录的内容包括:

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

重新开始文件用来记录各个检查点记录在日志文件中的地址
动态维护日志文件的方法是,周期性地执行建立检查点、保存数据库状态的操作,具体步骤为:

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

简化为:保存日志 -> 生成检查点 -> 保存数据提交到数据库 -> 将检查点写入重新开始文件
使用检查点方法可以改善恢复效率
系统使用检查点方法进行恢复的步骤:

  1. 从重新开始文件中找到最后一个检查点记录在日志文件中的地址,利用该地址找到日志文件中最后一个检查点记录
  2. 由该检查点记录得到检查点建立时刻所有正在执行的事务清单,并将其做为UNDO-LIST。另外新建一个空的REDO-LIST
  3. 从检查点开始正向扫描日志文件
    • 如有新开始的事务T,将T加入UNDO-LIST
    • 如有提交的事务J,将J从UNDO-LIST移入REDO-LIST
  4. 对UNDO-LIST中的每个事务执行撤销操作;对REDO-LIST中的每个事务执行重做操作