七、数据库恢复技术
1.什么是事务,事务的特性有哪些(ACID)?
用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位
- 原子性(Atomicity):事务中包括的操作要么都做,要么都不做
- 一致性(Consistency):事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态
- 隔离性(Isolation):并发执行的各个事务之间不能相互干扰
- 持续性(Duribility):一个事务一旦提交,它对数据库中数据的改变就应该是永久的
事务是恢复和并发控制的基本单位,一个程序中一般包含多个事务
2.什么是数据库的恢复?
DBMS具有的把数据库从错误状态恢复到某一已知的正确状态的功能
3.故障的种类?
(1)事务内部的故障
指事务没有达到预期的终点,数据库可能处于不正确的状态(运算溢出,并发事务发生死锁被选中撤销该事务,违反了某些完整性限制而被终止)
(2)系统故障(软故障)
指造成系统停止运转的任何事件,使得系统要重新启动(CPU故障,操作系统故障,DBMS代码错误,掉电)
(3)介质故障(硬故障)
指外存故障(磁盘损坏,磁头碰撞,瞬时强磁场干扰)
(4)计算机病毒
4.恢复的实现技术
如何建立冗余数据
(1)数据转储
后备副本:数据库管理员定期的将整个数据库复制到存储介质上保存起来,这些备用的数据称为后备副本
静态转储:在系统中无运行事务时进行的转储操作,转储期间不允许对数据库的存取、修改活动
优点:静态转储得到的一定是一个数据一致性的副本
缺点:转储必须等待正在运行的事务结束才能运行,新的事务也必须等待转储完才能运行,降低了数据库的可用性
动态转储:在转储期间允许对数据库存取或修改
优点:不用等待正在运行事务的结束,也不用等待转储结束
缺点:后备副本上的数据并不能保证正确有效,需要日志文件
海量转储:每次转储全部数据库
增量转储:每次只转储上一次转储后更新的数据
(2)登记日志文件
日志文件:用来记录事务对数据库的更新操作的文件
5.日志文件的定义和作用
日志文件:用来记录事务对数据库的更新操作的文件
日子文件的作用
(1)事务故障恢复和系统故障恢复必须用日志文件
(2)在动态转储方式中必须建立日志文件,后备副本和日志文件结合起来才能有效恢复数据库
(3)在静态转储方式中也可建立日志文件,当数据库毁坏后可重新装入后援副本把数据库恢复到转储结束时刻的正确状态,然后利用日志文件把已完成的事务进行重做,对故障发生时未完成的事务撤销,不必运行那些已完成的事务,就可恢复到故障发生前某一时刻的正确状态。
6.登记日志文件的原则
登记的次序严格按并发事务执行的时间顺序
7.为什么必须先写日志文件再写数据库
写日志文件和写数据库是两个不同的操作,有可能在这两个操作之间发生故障,即一个操作没有完成,如果先写数据库,则日志文件中没有记录此次修改,以后没有办法恢复;如果先写日志,没有修改数据库,则按日志文件恢复时仅多执行一次非必要的undo操作,并不会影响数据库的正确性
8.恢复策略
事务故障的恢复(由系统自动完成,对用户透明)
(1)反向扫描日志文件,查找该事务的更新操作
(2)对该事务的更新操作执行逆操作,即将日志文件记录中“更新前的值”写入数据库
(3)继续反向扫描日志文件,查找该事务的其他更新操作,并做同样处理
(4)直到读到此事务的开始标记,事务故障恢复完成
系统故障的恢复(在系统重启时自动完成)
(1)正向扫描日志文件,找出故障发生前已经提交的事务,将其事务标识记入重做队列,同时找出故障发生时尚未完成的事务,将其事务标识记入撤销队列
(2)对撤销队列的各个事务进行撤销处理,反向扫描日志文件,对每个撤销事务的更新操作执行逆操作
(3)对重做队列的各个事务进行重做处理,正向扫描日志文件,对每个重做事务重新执行日志文件登记的操作
介质故障的恢复(重装数据库,然后重做已完成事务)
(1)装入最新的数据库副本,使数据库恢复到最近一次转储时的一致性状态
(2)对于动态转储的数据库副本,还需同时装入转储开始时刻的日志文件副本,利用恢复系统故障的方法(redo+undo)才能将数据库恢复到一致性状态
(3)装入相应的日志文件副本,重做已完成的事务,即首先扫描日志文件,将故障发生时已提交的事务标识记入重做队列:然后正向扫描日志文件,对重做队列中的所有事务进行重做处理
9.具有检查点的恢复技术
检查点的记录包括:建立检查点的时刻所有正在执行的事务清单,这些事务最近一个日志记录的地址
系统利用检查点方法进行恢复的步骤
(1)从重新开始文件中找到最后一个检查点记录在日志文件中的地址,由该地址在日志文件中找到最后一个检查点记录
(2)由该检查点记录得到检查点建立时刻所有正在运行的事务列表ACTIVE-LIST,建立两个事务队列
undo-list:需要执行undo操作的事务集合
redo-list:需要执行redo操作的事务集合
把ACTIVE-LIST暂时放入undo-list队列,redo-list为空
(3)从检查点开始正向扫描日志文件
- 若有新开始的事务T,把T放入undo-list
- 若有完成的事务T,把T从undo-list移到redo-list,直到日志文件结束
(4)对undo-list里的事务执行undo操作,对redo-list里的事务执行redo操作