数据库系统概念:数据库恢复技术

前言

事务处理技术主要包括数据库恢复技术和并发控制技术
这章讲述数据库恢复技术

一、事务的基本概念

1.事务

所谓事务是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。一个事务可以是一条SQL语句、一组SQL语句、整个程序

事务通常以BEGIN TRANSACTION开始,以COMMITROLLBACK结束。

COMMTI表示提交即提交事务的所有操作,具体的说是将事务中所有对数据库的更新写回到磁盘上的物理数据库中,事务正常结束

ROOLBACK表示回滚,即在事务运行过程中发生某种故障,事务不能继续运行。系统将事务中对数据库所有已完成(更新)操作全部撤销,回滚到事务开始状态。

2.事务的ACID特性

事务有4个特性:
原子性(Atomicity)

一致性(Consistency)
事务执行结果必须是使数据库从一个一致性状态变为另一个一致性状态。当数据库只包含成功事务提交结果时,称数据库处于一致性状态

隔离性(Isolation)
一个事务执行不能被其他事务干扰,即一个事务的内部操作及使用数据都其他事务是隔离的,并发执行的各事务之间不能相互干扰

持续性(Durability)
也称永久性,☞一个事物一旦提交,对数据库中数据的改变就应该是永久的

二、数据库恢复概述

计算机系统中硬件故障、软件错误、操作员失误及恶意破坏不可避免,这些故障轻则造成事务非正常中断,重则破坏数据库。因此数据库管理系统必须具有把数据库从错误状态恢复到某一已知的正确状态(一致状态或完整状态)的功能,这就是数据库的恢复。

三、故障的种类

1.事务内部的故障

事务内部故障更多是非预期的、是不能由应用程序处理的。如运算溢出、并发事务死锁、违反完整性限制等

事物故障意味着事务没有达到预期的终点(COMMIT或显式的ROLLBACK)。
恢复程序要在不影响其他事务运行的情况下,强行回滚该事务,即撤销该事务已经做出的任何对数据库的修改。这类恢复操作称为事务撤销

2.系统故障

系统故障指造成系统停止运转的任何事件,使得系统要重新启动。

恢复子系统必须在系统重新启动时让所有非正常终止事务回滚,强行撤销所有未完成事务;另外有些已完成事务可能一部分甚至全部留在缓冲区,尚未写回磁盘上的物理数据库,因此应将这些事务已提交结果重新写入数据库。

3.介质故障

系统故障称为软故障,介质故障称为硬故障,指外存故障。这类故障发生可能性小,但破坏性最大

四、恢复的实现技术

恢复的基本原理:冗余,即数据库的数据可以根据存储在系统别处的冗余数据来重建

恢复机制涉及两个关键问题:

  1. 如何建立冗余数据
  2. 如何利用冗余数据实时数据库恢复

建立冗余数据最常用技术是数据转储和登记日志文件

1.数据转储

所谓转储即数据库管理员定期将整个数据库复制到磁带、磁盘或其他存储介质上保存起来的过程。这些被用数据称为后备副本

转储分为静态转储和动态转储

静态转储:系统在无事务运行是进行转储操作,即转储操作开始的时刻数据库处在一致性状态,转储期间不允许对数据库的任何存取、修改活动。
静态转储简单,但转储必须等待正运行的事务结束才能运行。

动态转储:转储期间允许对数据库进行存取或修改,即转储和用户事务可并发执行。克服了静态转储的缺点,但转储结束时的后备副本上的数据不能保证正确有效

转储还可以分为海量转储和增量转储
海量转储:每次转储全部数据库

增量转储:每次只转储上一次转储后更新过的数据

2.登记日志文件

日志文件:用来记录事务对数据库的更新操作的文件

日志文件中需要登记的内容包括:事物的开始标记、结束标记、所有更新操作

日志文件在数据库恢复中起着重要作用,可用来进行事务故障恢复和系统故障恢复,并协助后备副本进行介质故障恢复。

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

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

五、恢复策略

1.事务故障的恢复

恢复子系统应利用日志文件撤销(UNDO)此事务已对数据库进行的修改,由系统自动完成,对用户是透明的。

事务故障恢复步骤

  1. 反向扫描日志文件(从最后向前扫描),查找该事务的更新操作
  2. 对该事务的更新操作执行逆操作,即将日志记录中的“更新前的值”写入到数据库。
    如果记录中是插入操作,则相当于是做删除动作;
    如果记录中是删除操作,则做插入操作
    如果是修改操作,则相当于用修改前的值代替修改后的值
  3. 继续反向扫描日志文件,查找该事务的其他更新操作,并做同样处理
  4. 如此处理下去,直至读到此事务的开始标记,事务故障恢复就完成了

2.系统故障的恢复

系统故障的恢复是由系统在重新启动时自动完成的,不需要用户干预

系统故障恢复步骤

  1. 正向扫描日志文件(从头扫描),找到故障发生前已经提交的事务(这些事务既有BEGIN TRANSACTION记录,又有COMMIT记录),将其事务标识记入重做队列(REDO-LIST)。同时找到故障发生时尚未完成的事务(有BEGIN TRANSACTION记录,没有COMMIT记录),将其事务标识记入撤销队列(UNDO-LIST)
  2. 对撤销队列中的各个事务进行撤销(UNDO)处理
    撤销的方法:反向扫描日志文件,对每个撤销事务的更新操作执行逆操作。
  3. 对重做队列中的各事务进行重做(REDO)操作
    重做的方法:正向扫描日志文件,对每个重做事务执行日志文件登记操作。

3.介质故障的恢复

这是最严重的一种故障,恢复方法是重装数据库,然后重做已完成的事务。

介质故障恢复步骤

  1. 装入最新的数据库后备副本,是数据库恢复到最近一次转储时的一致性状态。
    对于动态转储的数据库副本,由于最新后备副本的数据不一定是正确的(不一致状态),还要装入转储开始时刻的日志文件副本,利用恢复系统故障的方法(REDO+UNDO),才能恢复数据库到一致性状态。
  2. 装入相应的日志文件副本(转储结束时刻的日志文件副本),重做已完成的事务。

六、具有检查点的恢复技术

这种技术在日志文件中增加了一类新的记录——检查点记录,增加一个重新开始文件,并让恢复子系统在登陆日志文件期间动态维护日志

检查点记录的内容

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

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

在这里插入图片描述
系统使用检查点方法进行恢复的步骤

  1. 从重新开始文件中找到最后一个检查点记录在日志文件中的地址,由该地址在日志文件中找到最后一个检查点记录
  2. 由该检查点记录得到检查点建立时刻所有正在执行的事务清单ACTIVE-LIST。建立两个队列:
    UNDO-LIST:需要执行UNDO操作的事务集合
    REDO-LIST:需要执行REDO操作的事务集合
    把ACTIVE-LIST暂时放入UNDO-LIST队列,REDO队列暂空
  3. 从检查点开始正向扫描日志文件
    如果有新提交的事务Ti,把Ti暂时放入UNDO-LIST队列
    如果有提交的事务Tj,把Tj从UNDO-LIST队列移入REDO-LIST队列;直到日志文件结束
  4. 对UNDO-LIST中每个事务执行UNDO操作,对REDO-LIST队列中每个事务执行REDO操作

七、数据库镜像

根据数据库管理员的要求,自动把整个数据库或其中关键数据复制到另一个磁盘上,由数据库管理系统自动保证镜像数据与主数据库的一致性。在没有出现故障时,数据库镜像还可以用于并发操作

猜你喜欢

转载自blog.csdn.net/weixin_44759105/article/details/111598791