第九章 恢复系统

第九章 恢复系统
第九章 恢复系统9.1 故障分类故障类型描述事务故障逻辑错误事务因内部错误条件无法完成系统错误DBMS 因错误条件如死锁必须终止活跃事务系统崩溃电源故障或其他硬件/软件故障导致系统崩溃。Fail-stop 假设非易失性存储内容不被系统崩溃破坏数据库系统有大量完整性检查来防止磁盘数据损坏磁盘故障磁头碰撞或类似磁盘故障导致全部或部分磁盘存储损坏。损坏是可检测的磁盘驱动器使用校验和检测故障9.2 恢复算法恢复算法包含两个部分部分内容正常运行期间确保有足够信息来从故障中恢复的操作故障发生后将数据库恢复到保证原子性、一致性、持久性的状态的操作核心问题转账事务修改 A 和 B若故障发生在一次修改后、另一次修改前修改了数据库但事务未提交 → 数据库不一致事务已提交但未修改数据库 →更新丢失9.3 存储结构存储类型特点示例易失性存储系统崩溃后不保留数据主存、高速缓存非易失性存储系统崩溃后保留数据但自身可能故障磁盘、磁带、闪存、NVRAM稳定存储理论上的永不故障存储通过在不同非易失介质上维护多个副本近似实现9.3.1 稳定存储的实现策略在独立磁盘上维护每个块的多个副本可在远程站点保护火灾/洪水等灾难。数据传输中的故障防护假设每个块有两个副本将信息写入第一个物理块第一次写入成功后将相同信息写入第二个物理块仅当第二次写入成功完成后输出操作才算完成副本不一致的恢复查找不一致块 → 在非易失性存储上记录进行中的磁盘写入恢复时仅比较这些块而非比较全部块若某副本校验和错误 → 用另一个副本覆盖若两者校验和均正确但内容不同 → 用第一个副本覆盖第二个9.4 数据访问9.4.1 基本操作概念说明物理块磁盘上的块缓冲区块临时驻留在主存中的块块移动操作操作含义input(B)将物理块 B 传输到主存output(B)将缓冲区块 B 写入磁盘替换对应物理块假设每个数据项恰好存储在一个块中。9.4.2 事务的私有工作区每个事务TiT_iTi​有私有工作区保存其访问和更新的所有数据项的本地副本。TiT_iTi​对数据项 X 的本地副本记为xix_ixi​。操作含义read(X)将数据项 X 的值赋给本地变量xix_ixi​write(X)将本地变量xix_ixi​的值赋给缓冲区块中的数据项 X⚠️output(B_X)不必紧跟在write(X)之后——系统可在适当时机执行。访问规则首次访问 X之前必须执行read(X)后续读取可从本地副本write(X)可在事务提交前任意时间执行9.5 恢复与原子性为确保故障下的原子性首先将描述修改的信息输出到稳定存储而不修改数据库本身。核心方法日志恢复机制重点影子副本/影子分页较少使用详见教材9.6 基于日志的恢复9.6.1 日志记录日志是日志记录的序列记录数据库上的更新活动信息。日志保存在稳定存储上。时机日志记录事务TiT_iTi​开始Ti startTiT_iTi​执行write(X)之前Ti, X, V1, V2V1 旧值V2 新值TiT_iTi​完成最后一条语句Ti commit9.6.2 两种日志方法方法规则特点立即修改未提交事务的更新可在事务提交前写入缓冲区或磁盘更新日志记录必须先于数据库项写入磁盘输出可随时发生顺序可与写入顺序不同延迟修改仅在事务提交时才执行缓冲区/磁盘更新简化恢复的某些方面但需存储本地副本的开销9.6.3 事务提交事务在Ti commit日志记录输出到稳定存储时被视为已提交。该事务所有先前的日志记录必须已经输出事务提交时其写入可能仍在缓冲区中稍后再输出到磁盘9.7 并发控制与恢复在并发场景下所有事务共享单个磁盘缓冲区和单个日志一个缓冲区块可能包含一个或多个事务更新的数据项日志记录可交错写入关键假设严格 2PL 保证若事务TiT_iTi​修改了某数据项其他事务不能修改同一数据项直到TiT_iTi​提交或中止。——否则若T1T_1T1​更新 A →T2T_2T2​更新 A 并提交 →T1T_1T1​中止如何进行 undo9.8 Undo 与 Redo 操作9.8.1 Undoundo(Ti)逆向扫描TiT_iTi​的日志记录将所有被TiT_iTi​更新的数据项恢复为其旧值每次恢复时写出特殊日志记录Ti, X, VV 旧值Undo 完成后写出Ti abort9.8.2 Redoredo(Ti)正向扫描TiT_iTi​的日志记录将所有被TiT_iTi​更新的数据项设置为其新值此过程不写日志9.8.3 故障时的恢复决策日志状态操作有Ti start无Ti commit或Ti abortUndoTiT_iTi​有Ti start且有Ti commit或Ti abortRedoTiT_iTi​9.8.4 重复历史若TiT_iTi​此前已 undo 并写出Ti abort记录然后发生故障——恢复时会redoTiT_iTi​。Redo 会重新执行TiT_iTi​的所有原始操作——包括恢复旧值的步骤。这称为重复历史。看似浪费但大大简化恢复逻辑。立即修改恢复示例时间点日志内容恢复动作(a) 仅有 T0 的日志无 commitT0 start,T0, A, 1000, 950,T0, B, 2000, 2050undo(T0)B→2000, A→1000写T0 abort(b) T0 已 commitT1 未 commit含T0 commit T1 的 update 记录redo(T0) undo(T1)A/B→950/2050C→700写T1 abort© 两者均已 commit含T0 commitT1 commitredo(T0) redo(T1)A/B→950/2050C→6009.9 检查点9.9.1 为什么需要检查点对整个日志中所有事务做 redo/undo极慢系统长时间运行后处理整个日志耗时巨大已将其更新输出到磁盘的事务会被不必要地 redo通过周期性创建检查点来简化恢复过程。9.9.2 检查点过程将主存中所有日志记录输出到稳定存储将所有已修改的缓冲区块输出到磁盘将checkpoint L日志记录写入稳定存储L 检查点时所有活跃事务的列表创建检查点时停止所有更新9.9.3 使用检查点的恢复只需考虑在检查点之前开始的最近事务TiT_iTi​以及TiT_iTi​之后开始的事务。恢复流程从日志末尾逆向扫描找到最近的checkpoint L记录仅 L 中的事务 检查点后开始的事务需要 redo/undo检查点前已提交/中止的事务——其更新已全部输出到稳定存储可忽略继续逆向扫描直到找到 L 中每个事务的Ti start记录早于最早Ti start的日志部分——恢复不需要可任意擦除检查点恢复示例事务状态恢复动作T1检查点前已提交可忽略更新因检查点已输出到磁盘T2检查点后开始有 commitRedoT3检查点后开始有 commitRedoT4检查点后开始无 commitUndo本章重点故障三分法事务/系统/磁盘与 fail-stop 假设、三层存储模型易失/非易失/稳定存储及稳定存储的多副本实现、日志作为恢复的基石——Ti start/Ti, X, old, new/Ti commit三类记录的含义与写入时机、立即修改 vs 延迟修改、undo逆向恢复旧值与 redo正向设置新值的算法、恢复判断准则有 start 无 commit → undo有 start 有 commit → redo、重复历史策略、检查点的作用——大幅缩小恢复需扫描的日志范围 L。