第七章 恢复系统
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
事务执行写操作前,生成该次写操作的日志。 为了使用日志恢复数据库,日志必须放在稳定存储器上。
1.延迟的数据库修改 延迟修改技术通过在日志中记录所有的数据 库修改,将一个事务的所有write操作拖延到事 务部分提交时才执行,从而保证事务的原子性。 当事务部分提交时,日志上有关该事务的信 息被用来执行延迟写。在事务完成其执行前系统 崩溃,或事务中止,则忽略日志上的信息。 事务Ti的执行过程:Ti开始执行前,向日志 中写入记录<Ti,start>,Ti的一次write(X)操作, 导致向日志中写入一条新记录。当Ti部分提交时, 向日志中写入记录<Ti,commit>。
还用银行的例子。日志: <T0,strat> <T0,A,1000,950> <T0,B,2000,2050> <T0,commit> <T1,strat> <T1,C,700,600> <T1,commit>
利用日志,可以恢复易失性存储器上的信息丢失 恢复过程:
undo(Ti):将事务Ti更新的所有数据项恢复 为 旧值 。 • redo(Ti):将事务Ti更新的所有数据项的值置 为新值。 故障发生后,恢复子系统检查日志,以 确定哪个事务需要redo,哪个需要undo。
Байду номын сангаас
当Ti部分提交时,日志中相关的记录用来执 行延迟写。执行更新时可能发生故障,更 新前将日志记录写到稳定存储器上。然后 进行更新,事务提交。
仍然用银行的例子说明: T0:read(A) T1: read(C) A:=A-50 C:=C-100 write(A) write(C) read(B) B:=B+50 write(B) 设执行顺序<T0,T1>,执行前,A,B,C的值分 别为1000,2000,700。
提交一个事务时,必须: 提交一个事务时,必须:
1)保证主存中所有被该事务修改过的缓冲页都被 写到磁盘上; 2)将当前页表写到磁盘上,注意不能覆盖影子页 表; 3)将当前页表的磁盘地址写到记录影子页表的地 址的稳定存储器的固定区域,覆盖旧的影子页 表的地址。于是当前页表就成了影子页表。 如果故障发生在第3)步之结束前,系统重启 后,系统状态恢复到该事务执行前的时刻,故障 发生在第3)步结束后,该事务的执行结果被保存。
2.事务回滚 利用日志记录回滚失败的事务Ti。日志的扫描 由后至前进行。对日志中形如<Ti, Xj,V1,V2>的日志 记录,数据项Xj的值被恢复成旧值V1。当发现日志 记录<Ti,start>时,停止日志扫描。
3.检查点
在前面我们利用检查点减少系统从崩溃中恢复 时必须扫描的日志记录数目。由于不考虑并发,恢 复时只考虑如下事务: •最近一次检查点后开始的那些事务。 •若有的话,最近一次检查点时活跃的那个事务。
2.恢复方法 将影子页表存入非易失存储器,保存 了事务执行前的数据库状态 。当系统崩溃 或事务中止,可以恢复数据库到事务执行 前状态。事务提交后,当前页写到非易失 存储器,可以成为新的影子页,下一个事 务开始执行。成功的恢复要求在系统崩溃 后能在磁盘上找到影子页表。简单的方法 是在稳定存储器上设置固定的区域记录影 子页表的磁盘地址。当系统崩溃后重新启 动时,拷贝影子页表至主存,并且用它进 行后续事务处理。中止事务的恢复是自动 的,不需要调用undo操作。
Ti的私有工作区,在事务初始化时创 建,事务提交或中止时删除。Ti的工作 区中保存的每一个数据项X记为Xi,Ti通 过在其工作区和系统缓冲区之间传送数 据与数据库交互,所用的两个操作: (1)Read(x)将数据项X的值赋予局部变量xi。
a.若X所在的块Bx,不在内存,则发指 令input(Bx)。 b.将缓冲块Bx中X的值赋予xi
<T0,strat> <T0,A,1000,950> <T0,B,2000,2050> <T0,commit> <T1,strat> <T1,C,700,600> 此时发生崩溃,系统重新启动,做undo(T1) 和redo(T0)。
<T0,strat> <T0,A,1000,950> <T0,B,2000,2050> <T0,commit> <T1,strat> <T1,C,700,600> <T1,commit> 此时发生崩溃,系统重新启动,做redo(T0) 和redo(T1)
7.1 故障分类
1 .事务故障: a. 逻辑错误。事务由于某些内部条件而无法 继续正常执行。如:非法输入、找不到数据、 溢出等 b.系统错误。系统进入一种不良状态(如死 锁),结果事务无法正常执行。 2 .系统崩溃:硬件故障,或数据库软件、操作 系统漏洞,导致易失性存储器内容的丢失,并 使得事务处理终止。而非易失存储器完好。 3 .磁盘故障:在数据传送操作过程中由于磁头 损坏或故障造成磁盘上数据的丢失。
<T0,strat> <T0,A,950> <T0,B,2050> 此时发生崩溃,系统重新启动,不必做redo A,B的值仍为1000和2000。
<T0,strat> <T0,A,950> <T0,B,2050> <T0,commit> <T1,strat> <T1,C,600> 此时发生崩溃,系统重新启动,做redo(T0) A的值950, B的值2050 ,C的值700
日志: <T0,strat> <T0,A,950> <T0,B,2050> <T0,commit> <T1,strat> <T1,C,600> <T1,commit>
利用日志,可以恢复易失性存储器上的信息丢失 恢复过程:
redo(Ti):将事务Ti更新的所有数据项的值置 为新值。 故障发生后,恢复子系统检查日志,以确 定需要重新执行的事务。 • 事务Ti需要重新执行,当且仅当日志中有 <Ti,start>和<Ti,commit>。 如果系统在事务完成后崩溃,用日志信息 可以将系统恢复到系统完成后的一致状态。
7.6 并发事务的恢复
到目前为止,我们只考虑了只有一个事务 在执行情况的恢复,下面讨论如何修改和扩 展基于日志的恢复机制以处理多个事物并发 的情况。不论有几个并发事务,系统只有一 个磁盘缓冲区和一个日志,缓冲块由所有事 务共享。
1.与并发控制的关系
恢复机制很大程度上依赖于所用的并发控制 机制。为回滚一个失败事务,必须撤消该事务所 做的更新。假设事务T0必须被回滚,并且被T0更 新的数据项Q必须恢复成旧值。当使用基于日志 的机制进行恢复时,利用日志记录中的撤消信息 进行恢复。现在假设T1在T0回滚前对Q也做了一 次更新。如果T0被回滚,T1所做的更新就会丢失 因此,事务T更新了数据项Q,在T提交或回滚 前不允许其他事务修改Q。使用严格两阶段封锁 协议就可以保证这一点。
3.检查点
从前面的例子可以看出,如果日志很 大,搜索过程耗时,而且有些可能是处 理过的日志记录,虽然重新处理不会有 不良后果,但是会使恢复过程加长。 为降低恢复过程的开销,引入检查点。 在日志文件中周期的加入检查点。
7.5 影子分页
1.影子分页方法 影子分页方法
影子分页技术是影子拷贝技术的改进。某些情 况下,影子分页技术比基于日志的方法需要更少的 磁盘访问,但是影子分页技术有它的缺点。 影子分页技术的主要思想是在一个事务的生存 周期维护两张页表:当前页表和影子页表。事务开 始时两张页表相同,影子页表在事务执行过程中不 发生改变。当前页表在事务执行write操作时可能改 变。所有input和output操作使用当前页表定位磁盘 上的数据库页。
第七章 恢复系统
因为有故障,才需要恢复。计算机 可能发生的故障:电源、软件、机房失 火、人为破坏等。恢复机制是数据库系 统必不可少的组成部分,一旦故障发生, 数据库必须保持事务的原子性和持久性。
7.1 故障分类 . 7.2 存贮器结构 . 7.3 恢复与原子性 . 7.4 基于日志的恢复 . 7.5 影子分页 . 7.6 并发事务的恢复 . 7.7 缓冲区管理 . 7.8 非易失性存储器数据的恢复 . 7.9 高级恢复技术 .
3.数据访问 给一些概念和记号 数据库常驻在磁盘上,以块为单位存 贮。一块可以包含多个数据项。假设没有 数据块是跨块的。 输入/出操作以块为单位,磁盘上的块 为物理块,临时位于主存的块为缓冲块。 内存中用以存放块的区域称为缓冲区。
磁盘和主存间的块移动由下面两个 操作完成。 (1)input(B) 传送物理块B至主存。 (2)output(B) 传送缓冲块B至磁盘,并 替换磁盘上相应的物理块。
• 重新执行Ti,A的值变为900而不是950,系统 产生不一致。 • 不重新执行Ti,A的值变为950而B的值为 2000 ,系统仍然不一致。
7.4 基于日志的恢复
日志:记录数据库中的所有更新活动。包括以下段 : *事务标识是执行Write操作的事务的唯一标识 *数据项标识是所写数据项的唯一标识,通常是数据 项在磁盘上的位置。 *旧值是数据项的写前值。 *新值是数据项的写后值。 日志记录: <Ti,start>:事务Ti开始 <Ti,Xj,V1,V2>:事务Ti对Xj执行写操作,Xj的写前 值是V1,写后值是V2。 <Ti,commit>:事务Ti提交 <Ti,abort>:事务Ti中止
<T0,strat> <T0,A,950> <T0,B,2050> <T0,commit> <T1,strat> <T1,C,600> <T1,commit> 此时发生崩溃,系统重新启动,做redo(T0) 和redo(T1)。A的值950, B的值2050 ,C的值 600
2.立即的数据库修改
(2)Write(x)将局部变量xi的值赋予缓冲块 中的数据项X。
a.若X所在的块Bx不在内存,则发指令input(Bx)。 b.将xi的值赋予缓冲块Bx中的X
7.3 恢复与原子性
发生故障和简单的故障恢复过程,可 能导致数据库的不一致。为了保持原子性 的目标,需记录对数据修改的描述信息。 例:考虑事务Ti,将¥50从帐户A转到帐户B, A和B的初值分别为1000和2000,假设Ti执 行过程中系统发生崩溃,且发生在 output(BA)之后, output(BB) 之前,由于内 存的内容丢失,无法知道事务的结局。可 以调用恢复过程。
•
• 事务Ti需要redo,当且仅当日志中有 <Ti,start>和<Ti,commit>。 • 事务Ti需要undo,当且仅当日志中有 <Ti,start>而没有<Ti,commit>。
<T0,strat> <T0,A,1000,950> <T0,B,2000,2050> 此时发生崩溃,系统重新启动,发现有 <T0,strat>而没有<T0,commit>,T0的操作必 须取消。执行undo(T0)。
立即更新技术允许数据库修改在事务仍 处于活跃状态时就进行数据库修改。活跃事 务所做的数据库修改称为未提交修改。发生 故障时,利用日志记录将数据库恢复成旧值。 用undo操作完成。 事务Ti的执行过程:Ti开始执行前,向 日志中写入记录<Ti,start>,Ti的一次write(X) 操作,导致向日志中写入一条新记录。当Ti 部分提交时,向日志中写入记录 <Ti,commit>。
与基于日志的恢复相比,消除了日志记录输出 的开销,恢复速度明显加快。缺点有: • 提交开销。使用影子分页技术,事务提交时要输 出多个块(实际数据块、当前页表和当前页表的 磁盘地址)。基于日志的机制只要写日志记录。 • 数据分片。在第二章中,为了加快数据传输速度, 将相关的数据库页存储在临近的磁盘块。影子分 页技术在数据更新时使得数据库页改变了存储位 置。 • 垃圾回收。当一个事务提交时,包含该事务所修 改数据旧值的数据库页不能再被访问,变成垃圾 页。它们的信息已经是无用的信息,但是又不是 空闲空间。需要周期性的找出所有垃圾页将它们 加入空闲页列表。
恢复算法: ①在正常事务处理时采取的措施,保证有 足够的信息可用于故障恢复。 ②故障发生后采取的措施,将数据库内容 恢复到某个保证数据一致性,事务原子 性及持久性的状态。
7.2 存贮器结构
1.存贮器类型 易失存储器:主存、高速缓存 非易失存储器:磁盘、磁带 稳定性存储器:通过一些技术手段实现 2.稳定存贮器的实现 RAID