原文地址: https://dzone.com/articles/sql-server-fast-recovery-what-is-it-and-when-is-it
原文作者: Priyanka Chauhan
在本文中,请阅读SQLServer快速恢复功能的概述,并了解何时使用、或不用此功能。
- 快速恢复是SQLServer企业版中的一项功能,它允许在Undo(即未提交的事务回滚)阶段完成之前,一旦Redo(即前滚事务)完成即可访问数据库。本文将详细讨论SQLServer快速恢复功能、何时使用以及何时无法使用。此外,本文还讨论了在快速恢复失败时数据库还原的替代方法。
在我们继续之前
让我们快速概览一下SQLServer恢复过程,该过程包括以下三个阶段:
分析
顾名思义,此阶段旨在分析事务日志。它确定最后一个检查点并创建脏页表(DPT)。该表记录了有关SQLServer停止运行时此脏页的信息。它还生成另一张表,其中包含有关SQLServer停止时的乐观事务(未提交)信息。
重做(Redo)阶段
此阶段将数据库还原到SQLServer服务停止、数据库已关闭前的状态。在此期间,将前滚那些修改并记录在日志文件中,可能还未写入到数据库的事务。
撤销(Undo)阶段
在此阶段中,事务将回滚到阶段1(分析阶段)中未提交的时候。
在所有阶段完成后,数据库变为可用状态。但是企业版中,数据库在REDO阶段之后将立即联机。
何时使用SQLServer快速恢复?
SQLServer2005中引入的快速恢复功能,可确保企业环境中的数据库在重做阶段(Redo)之后联机,然后完成撤销阶段(Undo)。
快速恢复功能允许SQL数据库重新联机。当启动SQLServer实例并运行数据库进行恢复的过程中,下列任何一种情况下,都会执行联机操作:
- 服务器崩溃或系统关闭不正常
- 高可用性和灾难恢复解决方案的故障转移(如数据库镜像、集群或可用性故障转移)
- 当需要对状态已更改为“联机”状态的数据库执行崩溃恢复时
什么时候不使用SQLServer快速恢复?
通过备份还原数据库,或尝试从备份还原日志传送的辅助数据库让该数据库联机时,我们不能使用SQL数据库的快速恢复功能。
为什么不能使用快速恢复进行数据库还原
快速恢复由于其底层机制对还原操作的执行是没有帮助的。对数据库进行修改所有执行的操作都需要记录。其中有一个日志记录会包含数据库上持有的锁的详细信息。在SQLServer崩溃恢复期间,执行撤销阶段(Undo)所需的所有锁也由Redo阶段获取。实质上,Redo阶段可以检测到需要在恢复的日志中回滚的事务。因此,当Redo阶段即将完成时,数据库是可访问的。因为快速恢复可以保证Undo阶段不被任何用户锁定,而且Undo阶段的锁定已保留。
想知道为什么这个机制不适用于快速恢复?
Redo操作不会获取Undo锁,因为Undo不太可能是数据库还原过程中的下一阶段。上一次还原结束时的某些未提交的事务,很可能在下次还原之前提交。因此,如果获取了任何Undo锁,则需要释放它们,这需要重新扫描日志记录或跟踪有哪些恢复中的事务已获取锁。
这就是快速恢复不支持数据库还原的原因。
尾注
在企业环境中,SQLServer快速恢复是针对数据库崩溃恢复执行的一项有益的功能。




