将事务日志刷新到日志文件中的条件

时间:2017-01-30 13:13:12

标签: sql-server

在哪些情况下,T-logs会从日志缓存刷新到日志文件或磁盘?

每次提交后或每3秒后或仅在检查点之后会发生吗?

当内存不足以将数据保存在缓冲池中时(在临时数据库或相应的数据库中),脏页存储在SQL服务器中的位置?以及SQL Server中保留未提交数据的时间和位置?

2 个答案:

答案 0 :(得分:0)

你问两个随机问题

1.交易日志缓冲区
2.缓冲池

  

在哪些情况下,T日志会从日志缓存刷新到日志文件或磁盘?是在每次提交后或每3秒后或仅在检查点之后发生?

考虑以下更新声明

Update table set id=1
where id=2

首先,将此修改写入事务日志缓冲区。然后,在我们成功提交之前,SQLServer将此修改写入磁盘。这称为写入提前日志记录,此类提交不会是定期或任何事情。 。这发生在每个声明

  

当内存不足以将数据保存在缓冲池中时(在临时数据库或相应的数据库中),脏页存储在SQL服务器中的位置?以及SQL Server中保留未提交数据的时间和位置?

考虑相同的更新事务,此更新需要触摸三个页面...并且一个页面不在缓冲池中。在这种情况下,SQL从磁盘读取页面并将其放在缓冲池中并修改它..现在此页面称为脏页...

这些类型的页面将刷新到磁盘,当检查点发生时。由于下面链接中提到的各种条件而发生检查点

https://msdn.microsoft.com/en-us/library/ms189573.aspx

答案 1 :(得分:0)

Checkpoint 是一个内部进程,它将所有脏页(已修改的页)从Buffer Cache写入物理磁盘,除此之外,它还将日志记录从日志缓冲区写入物理文件。

检查点始终会写出自上一个检查点以来或从磁盘读入页面以来已更改的所有页面(称为脏标记)。更改页面的事务是否已提交无关紧要 - 无论页面是否写入磁盘。唯一的例外是tempdb,其中数据页不作为检查点的一部分写入磁盘。

当tempdb日志文件达到70%时,只对tempdb执行检查点 - 这是为了防止tempdb日志增长(如果可能的话)(请注意,长时间运行的事务仍然可以基本上保留日志人质并防止它来自清理,就像在用户数据库中一样。)

  

将事务日志刷新到日志文件中的条件:

LOGWRITER是负责将日志从日志缓存写入日志文件的过程。

将日志缓冲区刷新到磁盘的条件包括:

  1. 会话发出提交或回滚命令。
  2. 日志缓冲区变为1/3满。
  3. 每个检查站之后。
  4. 每当日志文件变为70%已满时。
  5. 它还取决于Target Recovery Time
  6.   

    每次提交后或每3秒后或仅发生一次   检查站之后?

    它发生在每次提交之后和每个检查点之后。

    用户数据库发生检查点,该数据库的所有脏页都刷新到磁盘(以及其他操作)。 tempdb不会发生这种情况。在发生崩溃时不会恢复Tempdb,因此不需要将脏的tempdb页面强制到磁盘,除非惰性写入器进程(缓冲池的一部分)必须为其他数据库中的页面腾出空间。当您发出手动 CHECKPOINT时,会刷新所有脏页,但对于自动检查点,则不会。

    Checkpoints

      

    SQL Server中保留未提交的数据多长时间?

    除非事务完成/回滚,否则SQL Server会将未提交的数据保留在数据和日志文件中。