当 Sql Server 发出检查点时,它是否会阻塞所有其他操作,直到检查点完成?
如果我理解正确,当检查点发生时,服务器应该写入所有脏页。
完成后,它将检查点写入事务日志,因此如果发生任何故障,它将仅处理该时间点的事务(或在检查点时已经开始的事务)。
sql server 如何在检查点进行时防止某些非脏页变脏?
它会阻止所有写入直到检查点完成吗?
当 Sql Server 发出检查点时,它是否会阻塞所有其他操作,直到检查点完成?
如果我理解正确,当检查点发生时,服务器应该写入所有脏页。
完成后,它将检查点写入事务日志,因此如果发生任何故障,它将仅处理该时间点的事务(或在检查点时已经开始的事务)。
sql server 如何在检查点进行时防止某些非脏页变脏?
它会阻止所有写入直到检查点完成吗?
检查点不会阻止写入。
检查点有一个开始和一个结束 LSN。它保证磁盘上的所有页面至少在检查点的起始 LSN 处。任何页面是否在稍后的 LSN 上都没有关系(因为它是在检查点开始之后写入的)。
检查点只保证磁盘上所有页面的最小 LSN。它不保证准确的 LSN。
这是有道理的,因为您可以删除所有包含来自 LSN 的信息的事务日志记录,这些 LSN 早于检查点开始 LSN。这就是检查点的目的:允许部分日志变为非活动状态。
数据一致性和正确性不需要检查点。它们只是释放日志空间并缩短恢复时间。
发生检查点时,服务器应写入所有脏页
这就是它的作用。然而,检查点提供的保证是它会在检查点开始时写入所有脏页。在检查点进行过程中变脏的任何页面可能会或可能不会被写入,但不能保证会被写入。该保证提供的是一种优化,即物理恢复可以从最后一个检查点开始 REDO,因为在它之前的日志中的所有内容都已应用于数据页(不必重做)。甚至在ARIES 的维基百科页面上:
简单的检查点方法包括锁定整个数据库以避免在创建检查点期间更改 DPT 和 TT。模糊日志通过写入两条日志记录来规避这一点。One Fuzzy Log Starts Here 记录,并在准备好检查点数据后,记录实际的检查点。可以在两条记录之间创建其他日志记录
usr 的回答解释了这是如何实现的(通过使用检查点开始 LSN 和结束 LSN)。