检查点操作是否将日志缓冲区中的所有内容刷新为日志文件?或者仅仅是与即将被刷新的脏页相关的日志记录?我在Server行业中发现了关于这方面的一些不一致的描述。
来自Kalen Delaney的"Microsoft SQL Server 2012内部组件“:
检查点操作还将正在进行的事务中的日志记录写入磁盘,因为缓存的日志记录也被认为是脏的。
“从正在进行的事务”,是的,这是合理的,因为提交的事务的日志记录已经写入磁盘。所以这基本上意味着所有未刷新的日志记录都将被刷新。
来自Itzik在https://sqlperformance.com/2018/11/sql-performance/understanding-log-buffer-flushes上的“理解日志缓冲区刷新”:
Server需要硬化脏数据页,例如在检查点过程中,表示对这些页的更改的日志记录还没有硬化(写在前面的日志记录,简称WAL )。
日志缓冲区中的日志记录是否对应于日志缓冲区中所有未刷新的日志记录?我没有把握。伊齐克的描述基本上和卡伦的描述是一样的吗?
发布于 2021-04-20 11:39:38
我们可以实现DBMS,以便每个需要写入日志记录的线程立即将其写入磁盘并等待确认。这将是低效的,因为会有许多小IOs和许多线程在等待。对于每个线程来说,将其写入内存中的缓冲区,并将该缓冲区作为单个大IO写入磁盘,效率更高。所有写入日志记录的线程都会添加到这个缓冲区中,当它被写入磁盘(即“刷新”或“硬化”)时,所有来自所有线程的日志记录都会被写入。
那么缓冲器什么时候才能冲洗呢?有三项强制性的情况
系统可以在它选择的任何时候额外写入缓冲区。
在向客户端发送提交确认之前,必须刷新日志记录,以满足ACID的持久性保证。
检查点将脏页从缓冲池刷新到磁盘,无论污染这些页的事务是否已提交。在失败后重新启动时,DBMS需要一种方法来确定哪些更改应该保留,哪些应该删除。Server遵循ARIES恢复协议进行恢复,白羊座要求在刷新脏页之前先刷新写前日志。
当然,缓冲区的大小必须是有限的,因此系统必须能够在任何时候将其清空。日志包含许多类型的记录,而不是用户数据更改。ARIES协议负责刷新日志、刷新或未刷新缓冲池页面以及提交、未提交和回滚事务的各种组合。
你引用的作者说的是同样的话--日志记录必须在相应的脏页被刷新之前被刷新。这是以前链接的文档的呼应。
Server具有防止在写入关联日志记录之前刷新脏页的逻辑。
发布于 2021-04-19 16:49:32
是的,他们好像说了同样的话。设想一个页面包含一些未提交的修改,并被一个检查点写入磁盘。如果sql在检查点之后立即停止,我们需要能够在启动时回滚。我们怎么回过头来?我们需要相应的日志记录也写入磁盘。
https://dba.stackexchange.com/questions/290069
复制相似问题