1、第十章 数据库恢复技术,数据库恢复技术的必要性,计算机系统容易发生故障 丢失信息 软件、硬盘、电源、机房、人为,数据库恢复技术的必要性,恢复机制 将数据库系统恢复到故障发生前数据库的某个一致的状态 保证事务的原子性、持久性 提供高可用性 将崩溃后的数据库的不可用的时间减少到最低,课程安排,数据库系统故障种类 日志记录 正常操作时的事务回滚 系统崩溃后的恢复 缓冲区管理 介质故障的恢复,数据库系统的故障种类,事务故障(transaction failure) 系统崩溃(system crash) 介质/磁盘故障(disk failure),事务故障 (transaction failure),事
2、务执行失败,没有达到事务预期的终点 逻辑错误 (logical error) 事务内部条件导致事务无法正常执行 例如:非法输入、找不到数据、运算溢出、违反了某些完整性限制等 系统错误 (system error) 事务外部条件导致事务无法正常执行 例如:并发事务由于死锁而强制撤销事务,系统崩溃 (system crash),指造成系统停止运行的任何事件 例如:CPU异常, O.S.异常, DBMS异常, 停电 影响正在运行的所有事务 数据库本身并没遭到破坏, 只是数据不正确,系统崩溃 (system crash),事务 x:=READ(X) 数据项X的值给变量x 若X所在块B1不在主存,执行i
3、nput(B1) x缓冲块B1中X的值,B2,B1,缓冲块,磁盘缓冲区,B1:X,B2:Y,磁盘,物理块,input(B1),主存储器,事务私有空间,x,以块(block)为单位的定长存储,是磁盘数据传输的单位,可能包含多个数据项,系统崩溃 (system crash),事务 WRITE(X) 变量x给数据项X 若X所在块B1不在主存,执行input(B1) x缓冲块B1中X的值,B2,B1,缓冲块,磁盘缓冲区,B1:X,B2:Y,磁盘,物理块,input(B1),主存储器,事务私有空间,x,系统崩溃 (system crash),output(B1)的两种情况 缓冲管理器需要内存空间、DBS
4、强制写磁盘 output(B1)不需要在WRITE(X)执行后立即执行 B1里可能还包含其他数据项Z,B2,B1,缓冲块,磁盘缓冲区,B1:X,Z,B2:Y,磁盘,物理块,主存储器,事务私有空间,x,output(B1),系统崩溃 (system crash),在WRITE(X)执行后,output(B1)执行前崩溃 X的新值未写入磁盘系统需恢复到事务运行后的状态 事务对X和Y更新,在output(B1)后,output(B2)前崩溃 无法知道事务的结局系统需恢复到事务运行前的状态,B2,B1,缓冲块,磁盘缓冲区,B1:X,Z,B2:Y,磁盘,物理块,主存储器,事务私有空间,x,output(
5、B1),output(B2),介质/磁盘故障 (disk failure),外存故障:数据库(或部分数据库)遭到破坏 影响正在存取这部分数据的所有事务,数据库系统的故障,故障产生的影响 破坏数据库状态,使数据库中的数据不一致 恢复方法 系统正常运行时:保证有足够信息用于恢复 故障发生后:恢复处理,课程安排,数据库系统故障种类 日志记录 正常操作时的事务回滚 系统崩溃后的恢复 缓冲区管理 介质故障的恢复,日志记录,以记录为单位的日志文件(log) 记录事务的开始、结束和对DB所有的更新操作 , , , ,日志记录,利用日志保证事务的原子性 反做:Undo(Ti) 将事务Ti更新过的所有数据项的值
6、都恢复成更新前的值 恢复到事务开始时数据库的状态 日志文件中只有start,而没有commit或abort的事务需要被undo,日志记录,利用日志保证事务的原子性 重做:Redo(Ti) 将事务Ti更新过的所有数据项的值都设置成更新后的值 恢复到事务结束时数据库的状态 日志文件中既有start,又有commit或abort的事务需要被redo,课程安排,数据库系统故障种类 日志记录 正常操作时的事务回滚 系统崩溃后的恢复 缓冲区管理 介质故障的恢复,正常操作时的事务回滚,反向扫描日志,对于每一条日志记录,循环做: Xi Vo 写补偿日志记录 直到发现记录 写日志记录,日志,正常操作中 T0开始
7、回滚,正常操作时的事务回滚,反向扫描日志,对于每一条日志记录,循环做: Xi Vo 写补偿日志记录 直到发现记录 写日志记录,日志,B20;,正常操作时的事务回滚,反向扫描日志,对于每一条日志记录,循环做: Xi Vo 写补偿日志记录 直到发现记录 写日志记录,日志,写补偿记录,B20;,正常操作时的事务回滚,反向扫描日志,对于每一条日志记录,循环做: Xi Vo 写补偿日志记录 直到发现记录 写日志记录,日志,写补偿记录,T0回滚完成,B20;,课程安排,数据库系统故障种类 日志记录 正常操作时的事务回滚 系统崩溃后的恢复 缓冲区管理 介质故障的恢复,系统崩溃后的恢复,重启DBS,分两阶段恢
8、复 重做阶段正向扫描日志文件,查找系统崩溃前回滚的事务、没提交的事务,对于每一条日志记录,循环做: Xi Vn 如果遇到,加Ti到undo-list 如果遇到或 ,将Ti从undo-list中移出,系统崩溃后的恢复,重启DBS,分两阶段恢复 反做阶段 反向扫描日志文件,对于每一条日志记录,循环做: 如果发现Ti在undo-list中,执行undo 如果遇到,写日志记录 直到undo-list为空,检查点,扫描整个日志文件的困难 搜索过程耗时 大多数redo的事务已把更新写入DB,没必要再做redo 检查点:降低开销 简单的检查点做法,执行检查点操作时: 不允许任何更新操作 在日志文件中增加检测
9、点记录, 增加一个重新开始文件, 动态维护日志文件,检查点,将当前日志缓冲中的日志记录写入日志文件 在日志文件中写入一个检查点记录 将当前数据缓冲区中的所有数据写入数据库 将检测点记录的地址写入重新开始文件(记录每个检测点记录在日志中的地址),检查点恢复,使用检查点进行恢复 在重新开始文件中找到最后一个检查点记录 找到正在执行的事务清单, 将其放入undo队列 从检查点开始进行恢复,检查点恢复示例,日志,检查点 时刻的 活动事务,系统崩溃时日志的结束点,重做阶段,redo,C60;,检查点恢复示例,日志,检查点 时刻的 活动事务,系统崩溃时日志的结束点,重做阶段,redo,C60;,检查点恢复
10、示例,日志,检查点 时刻的 活动事务,系统崩溃时日志的结束点,重做阶段,redo,A400;,检查点恢复示例,日志,检查点 时刻的 活动事务,系统崩溃时日志的结束点,重做阶段,redo,检查点恢复示例,日志,检查点 时刻的 活动事务,系统崩溃时日志的结束点,undo,反做阶段,检查点恢复示例,日志,检查点 时刻的 活动事务,系统崩溃时日志的结束点,反做阶段,undo,A500;,检查点恢复示例,日志,检查点 时刻的 活动事务,系统崩溃时日志的结束点,反做阶段,将A恢复成更新前的值,undo,A500;,检查点恢复示例,日志,检查点 时刻的 活动事务,系统崩溃时日志的结束点,反做阶段,undo,
11、检查点恢复示例,日志,检查点 时刻的 活动事务,系统崩溃时日志的结束点,反做阶段,undo,检查点恢复示意图,使用检测点进行恢复的步骤: 在重新开始文件中找到最后一个记录, 从而找到最后一个检测点记录 找到正在执行的事务清单, 将其放入undo队列 从检测点开始正向扫描日志文件, 如有新事务Ti开始, 将其放入undo队列, 如有事务Tj提交, 将其移入redo队列, 直到日志文件结束 对undo队列中的事务执行undo操作, 对redo队列中的事务执行redo操作,检查点恢复示意图,故障点时的活动事务:T3,T5 Redo事务: T2,T4 Undo事务: T3,T5,检查点时的活动事务:
12、T2,T3,课程安排,数据库系统故障种类 日志记录 正常操作时的事务回滚 系统崩溃后的恢复 缓冲区管理 介质故障的恢复,缓冲区管理 日志记录缓冲,日志记录缓冲 日志记录比输出块小得多 为节省开销,一次输出多个记录,日志,稳定存储器,缓冲区管理 日志记录缓冲,日志记录缓冲 日志记录比输出块小得多 为节省开销,一次输出多个记录 日志记录顺序在缓冲区和稳定存储器中必须一致,日志,稳定存储器,缓冲区管理 日志记录缓冲,输出到稳定存储器后,Ti进入提交状态 输出到稳定存储器前,与Ti有关的所有日志记录必须已经输出到稳定存储器 主存中的数据块输出到DB前,所有相关日志记录必须输出到稳定存储器 - 先写日志
13、(Write-Ahead Logging, WAL),日志,稳定存储器,缓冲区管理 日志记录缓冲,日志,稳定存储器,当系统发现需要将一个日志记录输出到稳定存储器 当有足够日志记录被填满,就输出 没有足够日志记录,收集到一个部分填充块,输出,缓冲区管理 数据库缓冲,主存比数据库小很多 强制输出策略:事务提交时,强制将修改后的所有块输出 非强制输出策略:一个事务修改了某些没有写回磁盘的块,也允许提交 多个更新收集在一起,减少输出次数 事务快速提交,稳定存储器,B1,B2,缓冲区管理 数据库缓冲,非窃取策略:活动事务修改的块先不写磁盘 缓冲区被占满不适合执行大量更新事务,稳定存储器,B2,B1,B4
14、,B3,缓冲区管理 数据库缓冲,窃取策略:允许活动事务修改的块写磁盘 大多数系统采用的标准方法 只要遵守先写日志,就能保证正确恢复,稳定存储器,B1,B4,B3,B5,B2,缓冲区管理 数据库缓冲,先写日志的必要性 银行转账例子:,稳定存储器,B1,B4,B3,B=2000,B2,A=1000,C=700,T0:READ(A)A:=A-50;WRITE(A);READ(B)B:=B+50;WRITE(B);,T1:READ(C)C:=C-100;WRITE(C);,缓冲区管理 数据库缓冲,先写日志的必要性 银行转账例子:,稳定存储器,B1,B4,B3,B=2000,A=950,C=700,T0
15、:READ(A)A:=A-50;WRITE(A);READ(B)B:=B+50;WRITE(B);,T1:READ(C)C:=C-100;WRITE(C);,缓冲区管理 数据库缓冲,先写日志的必要性 银行转账例子:,稳定存储器,B1,B4,B3,B=2000,A=950,C=700,T0:READ(A)A:=A-50;WRITE(A);READ(B)B:=B+50;WRITE(B);,T1:READ(C)C:=C-100;WRITE(C);,先写日志保证 在稳定存储器中,缓冲区管理 数据库缓冲,先写日志的必要性 银行转账例子:,稳定存储器,B1,B4,B3,B=2000,A=1000,C=70
16、0,T0:READ(A)A:=A-50;WRITE(A);READ(B)B:=B+50;WRITE(B);,T1:READ(C)C:=C-100;WRITE(C);,先写日志保证 在稳定存储器中,缓冲区管理 数据库缓冲,先写日志文件, 后写数据库,T1: READ(A);A := A-5;WRITE(A);,T2: C := 80;WRITE(C);,T2提交,缓冲区管理 数据库缓冲,先写日志文件, 后写数据库,T1: READ(A);A := A-5;WRITE(A);,T2: C := 80;WRITE(C);,T2提交,系统崩溃,undo,缓冲区管理 数据库缓冲,先写日志文件, 后写数据
17、库,T1: READ(A);A := A-5;WRITE(A);,T2: C := 80;WRITE(C);,T2提交,系统崩溃,redo,缓冲区管理 数据库缓冲,输出B2时,要防止对B2的写操作 封锁方法 在缓冲块上加锁(闩锁),与并发控制的锁无关,稳定存储器,B2,排它锁,课程安排,数据库系统故障种类 日志记录 正常操作时的事务回滚 系统崩溃后的恢复 缓冲区管理 介质故障的恢复,介质故障的恢复,恢复基本原理: 数据冗余 数据转储 DBA定期的将整个数据库复制到磁带或另一个磁盘上保存起来的过程 备用的数据 后备副本或后援副本,介质故障的恢复 数据转储,数据的转储方法,系统没有运行事务时进行的
18、转储操作, 操作过程中禁止操作数据库,后援副本和数据库中的数据是一致的 静态转储降低数据库的可用性,DB2,介质故障的恢复 数据转储,数据的转储方法,系统没有运行事务时进行的转储操作, 操作过程中禁止操作数据库,后援副本和数据库中的数据是一致的 静态转储降低数据库的可用性,按日志恢复,登记日志文件,DB2,DB2,继续运行,登记日志文件,介质故障的恢复 数据转储,数据的转储方法,转储期间允许对数据库进行存取和修改,介质故障的恢复 数据转储,数据的转储方法,每次转储 全部数据库,每次转储 数据库增量部分,介质故障的恢复 数据转储,数据的转储方法,转储十分耗费时间和资源 DBA应根据数据库的使用情况确定一个适当的转储周期,介质故障的恢复,需要DBA介入, 实际恢复由系统完成, 具体步骤 装入后援副本 装入相应的日志文件副本 启动恢复程序按日志恢复 注意 日志文件也要转储 日志和数据库不在同一磁盘空间,本章小结,数据库系统故障种类 事务故障、系统崩溃、介质故障 日志记录 正常操作时的事务回滚 系统崩溃后的恢复 缓冲区管理:先写日志 介质故障的恢复:数据转储,