分析阶段
SQL Server 从上一个成功的检查点(或最早的脏页 LSN)的开头起到末尾,执行事务日志的前向
扫描,以确定 SQL Server 停止时每个事务的状态。
重做阶段
SQL Server 从最早的未提交事务起到末尾,执行事务日志的前向扫描,通过重做所有已提交的操
作使数据库恢复到崩溃时的状态。
撤消阶段
对于在崩溃时处于活动状态的每个事务,SQL Server 向后遍历日志,从而撤消该事务执行的操
作。
基于此设计,数据库引擎从意外重启中恢复所花费的时间(大约值)与崩溃时系统中最长活动事务的大
小成正比。 恢复需要回滚所有未完成的事务。 所需的时间长度与事务已执行的工作及其处于活动状态
的时间成正比。 因此,存在长时间运行的事务(例如大型表的大批量插入操作或索引生成操作)时,
SQL Server 恢复过程可能需要很长时间。
此外,基于此设计的取消或回滚大型事务也可能需要较长时间,因为其使用的是与前面所述相同的撤消
恢复阶段。
另外,当存在长期运行的事务时,数据库引擎无法截断事务日志,因为恢复和回滚过程需要其相应的日
志记录。 因此,某些事务日志会变得很大,并且会占用大量驱动器空间。
加速数据库恢复过程
ADR 通过完全重新设计数据库引擎恢复过程来解决上述问题:
通过避免以最早的活动事务为起始点/结束点扫描日志,使其保持恒定时间/即时状态。 使用
ADR,仅从上一个成功的检查点 [或最早的脏页日志序列号 (LSN)] 处理事务日志。 因此,恢复时
间不受长期运行的事务影响。
由于不再需要为整个事务处理日志,因此可最大程度地减少所需的事务日志空间。 当检查点和备份
出现时,可以主动截断事务日志。
从较高层次来看,ADR 可通过对所有物理数据库修改进行版本控制并仅撤消逻辑操作(逻辑操作比较有
限,且几乎可以立即撤消)来实现快速数据库恢复。 崩溃时处于活动状态的任何事务都会被标记为已中
止,因此,并发用户查询可忽略这些事务生成的任何版本。
评论