LAB 2 日志管理实验文档

实验概述

本次实验主要关注于数据库系统的日志记录及故障恢复功能,希望同学们通过本次实验能够更好地理解数据库日志的记录方式以及日志对于故障恢复过程的作用。重点关注于简化的ARIES算法的实现,以及日志记录和管理的方式。

实验任务

本次实验主要有3个任务:

  1. 阅读新增的代码,理解日志记录的过程。
  2. 补全未完成的日志设计:Update日志镜像的部分函数以及Checkpoint日志的部分函数。
  3. 完成简化的ARIES算法:本次实验下仅要求支持单线程场景。

实验开始前,请按照文档中更新说明中的步骤合并新增代码。

相关模块

  1. tx 模块:事务管理模块,负责事务ID的管理,维护线程ID与事务的XID的对应关系,本次实验中不需要重点关注
  2. log 模块:日志管理模块,负责处理日志记录以及故障恢复功能。是本次实验需要重点关注的部分,尤其是LogManager模块中包含了本次实验的绝大部分内容。
  3. table 模块:在LAB 1代码基础上添加记录WAL日志的过程。

基础功能实现顺序

  1. table/table.cpp: 在LAB 1代码基础上添加记录WAL日志的过程。
  2. log/log_manager.cpp: 首先完成三种基本操作(INSERT/DELETE/UPDATE)的日志记录过程。
  3. log/log_image.cpp: Update日志镜像的设计,实现物理逻辑日志的序列化和反序列化。
  4. log/update_log.cpp: 基于日志镜像完成Redo和Undo的具体操作。
  5. log/checkpoint_log.cpp: Checkpoint日志的设计,与其他日志不同之处在于,Checkpoint日志在Load过程中需要将数据更新到LogManager的成员变量,完成加载过程。
  6. log/log_manager.cpp: 完成故障恢复算法,实现 Redo 和 Undo 函数。

测试说明

本次实验新增了 begin, abort, commit, checkpoint, crash, flush 相关语法:

  • begin, abort, commit 分别对应事务的开始、回滚和提交。

  • checkpoint 使系统写入一个检查点。

  • crash 模拟系统故障崩溃,调用 BufferManager 的 Clear 函数清空缓冲区所有内容。

  • flush 调用 BufferManager 的 FlushAll 函数将缓冲区内容同步到磁盘。

不要修改 visitor 中 flush 和 crash 相关函数的代码

本次实验中,基本测试为简单的测试样例,没有包含复杂的故障恢复场景,仅考虑完成基本功能的同学不需要考虑如下场景的故障恢复:

  1. 修改 TableMeta 后出现故障的场景。
  2. 修改 PageHeader.next_free 后出现故障的场景。
  3. 插入记录导致新的页面分配后,系统出现故障,导致 redo 过程中页面缺失的场景。

本次实验的基本测试具有一定局限性,但是希望同学们能发掘更多的场景,探索在这些场景下恢复算法的应对策略。这也是本次实验高级功能的一个选择。

可选高级功能

不要求将高级功能集成到主分支中,建议单开分支完成实验。但是建议同学们设计验证自己实验结果的测例并给出测试的可视化结果展示。

  1. 复杂的日志恢复场景(1分):实现能够适应复杂场景的日志恢复算法,解决基本测试的三点局限性,需要自行添加额外测例(需要添加对于Meta信息的日志,报告中需要写出相关设计)。
  2. 非阻塞的Checkpoint日志记录(1分):需要将Checkpoint日志拆分为 begin_checkpoint 和 end_checkpoint,单开线程进行 checkpoint 写入操作,写入checkpoint 时不阻塞 SQL 的正常运行,需要自行添加额外测例(日志写回进程可以人工添加一定延时,报告中需要展示出检查点begin到end存在增删改查日志)。
  3. Undo过程中系统出现异常的恢复(1分):添加CLR日志,让系统支持在undo过程中的异常恢复,需要自行添加额外测例(为了模拟undo过程中的中断,可以添加undo过程中的abort指令)。
  4. 日志缓存(1分):添加日志缓存机制,同时修改现有的数据缓存替换算法,利用FlushedLSN限制可写回的数据页面,需要自行添加额外测例(建议设置合理的日志缓存容量和足量的SQL测例,保证日志缓存能限制部分页面的写回)。

同时也鼓励同学们结合相关课程内容提出自己的创新设计。实验框架对于本次实验的几个高级功能有相对良好的支持,各个高级功能都比较容易完整实现,所以同学们可以选择同时支持多个高级功能来实现更为完整的基于日志的故障恢复算法。

高级功能满分3分。

截止时间

2023 年 4 月 9 日(第七周周日)晚 23:59 分。

results matching ""

    No results matching ""

    results matching ""

      No results matching ""