数据库恢复技术
[TOC]
事务
事务(Transaction)是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是 一个不可分割的工作单位。事务是恢复和并发控制的基本单位。一个事务可以是一条SQL语句, 一组SQL语句或整个程序。
事务结束语句:
COMMIT:事务正常结束。
ROLLBACK:事务运行的过程中发生了故障,不能继续执行,回滚事务的所有更新操作,回到开始时的状态。
事务的ACID特性:
原子性(Atomicity):事务中包括的操作要么都做,要么都不做。由数据恢复子系统负责。
一致性(Consistency):数据库中包含失败事务的结果为不一致状态。
隔离性(Isolation):并发执行的各个事务之间不能互相干扰。
持续性(Durability):一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。
破坏事务ACID特性的因素:
多个事务并行运行时,不同事务的操作交叉执行(没有隔离)
事务在运行过程中被强行停止(不原子,不一致)
故障
事务故障:某个事务在运行过程中由于种种原因未运行至正常终止点就夭折了。可以撤消事务(UNDO)或者强行回滚(ROLLBACK)该事务。
系统故障:整个系统的正常运行突然被破坏。系统重新启动时,恢复程序要强行撤消(UNDO) 所有未完成事务,重做(REDO)所有已提交的事务。
介质故障:外存中的数据部分丢失或全部丢失。装入数据库发生介质故障前某个时刻的数据副本,重做自此时始的所有成功事务,将这些事务已提交的结果重新记入数据库。
恢复
转储
转储是指DBA(数据库管理员,Database Administrator)将整个数据库复制到磁带或另一 个磁盘上保存起来的过程。这些备用的数据文 本称为后备副本或后援副本。
静态转储:在系统中无运行事务时进行转储,转储开始时数据库处于一致性状态,转储期间 不允许对数据库的任何存取、修改活动。
动态转储:转储操作与用户事务并发进行,转储期间允许对数据库进行存取或修改。
海量转储: 每次转储全部数据库。
增量转储: 只转储上次转储后更新过的数据。
对于动态转储的数据库副本,要恢复时还须同时装入转储时刻的日志文件副本,利用与恢复系统故障相同的方法(即 REDO+UNDO,下面讲),才能将数据库恢复到一致性状态。
日志文件
日志文件(log)是用来记录事务对数据库的更新操作的文件
每条日志记录的内容:
事务标识
操作类型(插入、删除或修改)
操作对象(记录ID、Block NO.)
更新前数据的旧值(对插入操作而言,此项为空值)
更新后数据的新值(对删除操作而言, 此项为空值)
登记日志文件的原则:
登记的次序严格按并行事务执行的时间次序。
必须先写日志文件,后写数据库。
如果先写日志,但没有修改数据库时故障发生,按日志文件恢复时只不过是多执行一次不必要的UNDO操作,并不会影响数据库的正确性。
事务故障的恢复:
利用日志文件撤消(UNDO) 此事务已对数据库进行的修改
从最后向前扫描日志文件,查找该事务的更新操作。
对该事务的更新操作执行逆操作。
继续反向扫描日志文件,查找该事务的其他更新操作,并做同样处理。
直至读到此事务的开始标记,完成。
系统故障的恢复:
一些未完成事务对数据库的更新已写入数据库,Undo 故障发生时未完成的事务
一些已提交事务对数据库的更新还留在缓冲区没来 得及写入数据库,Redo 已完成的事务
从头扫描日志文件,记录Redo队列(在故障发生前已经提交的事务 T1, T3, T6…..)和Undo队列(故障发生时尚未完成的事务 T2, T4, T5…...)
对每个UNDO事务的更新操作执行逆操作(T2, T4, T5……)
对每个REDO事务重新执行登记的操作( T1, T3, T6…..)
介质故障的恢复:
装入最新的后备数据库副本,使数据库恢复到最近一次转储时的一致性状态。
装入有关的日志文件副本,重做已完成的事务。
检查点
之前技术的两个问题:
搜索整个日志将耗费大量的时间
REDO处理:重新执行,浪费了大量时间
检查点记录的内容:
建立检查点时刻所有正在执行的事务清单
这些事务最近一个日志记录的地址
重新开始文件的内容:
记录各个检查点记录在日志文件中的地址
创建检查点方法:
将当前日志缓冲区中的所有日志记录写入磁盘的日志文件上。
在日志文件中写入一个检查点记录。
将当前数据缓冲区的所有数据记录写入磁盘的数据库中。
把检查点记录在日志文件中的地址写入一个 重新开始文件。
如果在第四步前系统崩溃,那么这个检查点失效,但仍可以从上一个检测点恢复。
利用检查点的恢复步骤:
从重新开始文件中找到最后一个检查点记录在日志文件中的地址
由该地址在日志文件中找到最后一个检查点记录
由该检查点记录得到检查点建立时所有正在执行的事务清单 ACTIVE-LIST,再建立两个事务队列UNDO-LIST和REDO-LIST,把ACTIVE-LIST暂时放入UNDO-LIST队列,REDO队列暂为空。
从检查点开始正向扫描日志文件,直到日志文件结束。如有新开始的事务Ti,把Ti暂时放入UNDO-LIST队列。如有提交的事务Tj,把Tj从UNDO-LIST队列移到REDO-LIST队列。
对UNDO-LIST中的每个事务执行UNDO操作, 对REDO-LIST中的每个事务执行REDO操作。
例子1:
这个例子中,最后UNDO-LIST是T2,T3。REDO-LIST为T1,T4。
例子2:
数据库镜像
最后更新于