恢复和隔离利用语义的算法 (ARIES) 基于预写日志 (WAL) 协议。每个更新操作都会写入一个日志记录,它是以下之一:
- 仅撤销日志记录:
仅记录之前的图像。因此,可以执行撤消操作来检索旧数据。 - 仅重做日志记录:
仅记录后图像。因此,可以尝试重做操作。 - 撤消重做日志记录:
记录前图像和后图像。
在其中,每条日志记录都被分配了一个唯一且单调递增的日志序列号 (LSN)。每个数据页都有一个页 LSN 字段,该字段设置为与该页上的最后一次更新相对应的日志记录的 LSN。 WAL 要求与更新对应的日志记录在与该更新对应的数据页写入磁盘之前使其稳定存储。出于性能原因,不会立即将每次日志写入强制写入磁盘。日志尾部保留在主内存中以缓冲日志写入。当日志尾部变满时,它会刷新到磁盘。在提交日志记录将其写入磁盘之前,无法声明事务已提交。
有时,恢复子系统会将检查点记录写入日志。检查点记录包含事务表和脏页表。主日志记录在稳定存储中单独维护,以存储将其写入磁盘的最新检查点记录的 LSN。重新启动时,恢复子系统读取主日志记录以查找检查点的 LSN,读取检查点记录,然后从那里开始恢复。
恢复过程实际上包括 3 个阶段:
- 分析:
恢复子系统确定下一次传递必须从其中开始的最早日志记录。它还从检查点记录向前扫描日志,以构建系统崩溃瞬间的快照。 - 重做:
从最早的 LSN 开始,向前读取日志并重做每次更新。 - 撤消:
向后扫描日志并撤消与失败者交易相对应的更新。