检查点和日志的活动部分

检查点将脏数据页从当前数据库的缓冲区高速缓存刷新到磁盘上。 这最大限度地减少了数据库完整恢复时必须处理的活动日志部分。 在完整恢复时,需执行下列操作:

  • 前滚系统停止之前尚未刷新到磁盘上的日志记录修改信息。

  • 回滚与未完成的事务(如没有 COMMIT 或 ROLLBACK 日志记录的事务)相关联的所有修改。

检查点操作

检查点在数据库中执行下列过程:

  • 将记录写入标记检查点起点的日志文件。

  • 将为检查点记录的信息存储在检查点日志记录链内。

    检查点中记录的一条信息是第一条日志记录的日志序列号 (LSN),该 LSN 必须存在才能进行成功的数据库范围的回滚。 该 LSN 称为“最小恢复 LSN”(“MinLSN”)。 MinLSN 是下列各项中的最小者:

    • 检查点起点的 LSN。

    • 最早的活动事务起点的 LSN。

    • 尚未传递给分发数据库的最早的复制事务起点的 LSN。

    检查点记录还包含所有已修改数据库的活动事务的列表。

  • 如果数据库使用简单恢复模式,则标记在 MinLSN 前重用的空间。

  • 将所有脏日志和数据页写入磁盘。

  • 将标记检查点结束的记录写入日志文件。

  • 将这条链起点的 LSN 写入数据库启动页。

导致检查点的活动

下列情况下将出现检查点:

  • 显式执行 CHECKPOINT 语句。 用于连接的当前数据库中出现检查点。

  • 在数据库中执行了最小日志记录操作,例如,在使用大容量日志恢复模式的数据库中执行大容量复制操作。

  • 已经使用 ALTER DATABASE 添加或删除了数据库文件。

  • 通过 SHUTDOWN 语句或通过停止 SQL Server (MSSQLSERVER) 服务停止了 SQL Server 实例。 任一操作都会在 SQL Server 实例的每个数据库中形成一个检查点。

  • SQL Server 实例在每个数据库内定期生成自动检查点,以减少实例恢复数据库所需的时间。

  • 进行了数据库备份。

  • 执行了需要关闭数据库的活动。 例如,AUTO_CLOSE 设置为 ON 并且关闭了数据库的最后一个用户连接,或者执行了需要重新启动数据库的数据库选项更改。

自动检查点

SQL Server 数据库引擎将生成自动检查点。 自动检查点之间的间隔基于使用的日志空间量以及自上一个检查点以来经历的时间。 如果只在数据库中进行了很少的修改,自动检查点之间的时间间隔可能变化很大并且很长。 如果修改了大量数据,自动检查点也会经常出现。

使用 recovery interval 服务器配置选项为服务器实例上的所有数据库计算自动检查点之间的间隔。 此选项指定数据库引擎在系统重新启动时恢复数据库所用的最长时间。 数据库引擎将估计在执行恢复操作期间自己在 recovery interval 内能够处理多少条日志记录。

自动检查点之间的间隔也取决于恢复模式:

  • 如果数据库使用的是完整恢复模式或大容量日志恢复模式,则每当日志记录数达到数据库引擎估计在 recovery interval 选项中指定的时间内可以处理的数量时,便会生成一个自动检查点。

  • 如果数据库使用的是简单恢复模式,只要日志记录数达到下面两个值中较小的那个值,就会生成自动检查点:

    • 日志已满 70%。

    • 日志记录数达到数据库引擎估计在 recovery interval 选项指定的时间内能够处理的记录数。

有关设置恢复间隔的信息,请参阅如何设置恢复间隔 (SQL Server Management Studio)

如果数据库使用的是简单恢复模式,自动检查点将截断事务日志中没有使用的部分。 但是,如果数据库使用的完整恢复模式或大容量日志恢复模式,自动检查点则不会截断日志。 有关详细信息,请参阅事务日志截断

现在,CHECKPOINT 语句提供了一个可选的 checkpoint_duration 参数,它指定完成检查点所需的秒数。 有关详细信息,请参阅 CHECKPOINT (Transact-SQL)

活动日志

日志文件中从 MinLSN 到最后写入的日志记录这一部分称为日志的活动部分,或者称为“活动日志”。 这是进行数据库完整恢复所需的日志部分。 永远不能截断活动日志的任何部分。 所有的日志记录都必须从 MinLSN 之前的日志部分截断。

下图显示了具有两个活动事务的结束事务日志的简化版本。 检查点记录已压缩成单个记录。

具有活动事务的事务结束日志

LSN 148 是事务日志中的最后一条记录。 在处理 LSN 147 处记录的检查点时,Tran 1 已经提交,而 Tran 2 是唯一的活动事务。 这就使 Tran 2 的第一条日志记录成为执行最后一个检查点时处于活动状态的事务的最旧日志记录。 这使 LSN 142(Tran 2 的开始事务记录)成为 MinLSN。

长时间运行的事务

活动日志必须包括所有未提交事务的每一部分。 如果应用程序开始执行一个事务但未提交或回滚,将会阻止数据库引擎推进 MinLSN。 这可能会导致两种问题:

  • 如果系统在事务执行了许多未提交的修改后关闭,以后重新启动时,恢复阶段所用的时间将比 recovery interval 选项指定的时间长得多。

  • 因为不能截断 MinLSN 之后的日志部分,日志可能变得很大。 即使数据库使用的是简单恢复模式,这种情况也有可能出现,在简单恢复模式下,每次执行自动检查点操作时通常都会截断事务日志。

复制事务

日志读取器代理监视已为事务复制配置的每个数据库的事务日志,并将已设复制标记的事务从事务日志复制到分发数据库中。 活动日志必须包含标记为要复制但尚未传递给分发数据库的所有事务。 如果不及时复制这些事务,它们可能会阻止截断日志。 有关详细信息,请参阅事务复制的工作机制