当Sql Server发出检查点时,是否会阻止所有其他操作,直到检查点完成为止?
如果我理解正确,当发生检查点时,服务器应该写出所有脏页。
当它完成时,它会将检查点写入事务日志,因此如果发生任何故障,它将只处理该时间点的事务(或者在检查点时已经开始的事务)。
在检查点正在进行时,sql server如何防止某些非脏页变脏?
在检查点完成之前,它是否阻止所有写入?
答案 0 :(得分:2)
检查点不会阻止写入。
检查点有一个开始和结束LSN。它保证磁盘上的所有页面至少位于检查点的起始LSN。如果任何页面位于稍后的LSN(因为它已在检查点启动后写入),则无关紧要。
检查点仅保证磁盘上所有页面的最小LSN。它不能保证精确的LSN。
这是有道理的,因为您可以删除包含早于检查点启动LSN的LSN的信息的所有事务日志记录。这是检查点的目的:允许部分日志变为非活动状态。
数据一致性和正确性不需要检查点。它们只是释放日志空间并缩短恢复时间。
答案 1 :(得分:1)
发生检查点时,服务器应写入所有脏页
这就是它的作用。但是,checkpoint提供的保证是它会在检查点启动的那一刻写下所有脏的页面。在检查点取得进展时变脏的任何页面可能会也可能不会被写入,但肯定不会保证被写入。此保证提供的优化是物理恢复可以从上一个检查点开始重做,因为它之前的日志中的所有内容都已应用于数据页(不必重做)。甚至在Wikipedia page for ARIES上:
检查点的天真方式涉及锁定整个数据库 避免在创建期间更改DPT和TT 检查点。模糊记录通过写入两个日志记录来绕过它。 一个模糊日志在此处开始记录,并在准备好检查点之后 数据,实际检查点。两个记录之间的其他logrecords 可以创建
usr的答案解释了如何实现这一目标(通过使用检查点启动LSN和结束LSN)。