备份数据库是否会缩小事务日志的大小?


8

我正在尝试收集有关SQL数据库的一些知识,并且对事务日志文件(LDF)有一些疑问。

首先,在创建数据库时,必须为数据库和日志文件定义初始文件大小。从我的看到,一旦在磁盘上创建了文件,它们将具有指定的大小,而不管数据库中是否有实际数据或是否有任何事务(日志)。

我的理解是备份数据库:

  1. 截断事务日志,并
  2. 缩小尺寸

通过“清空”磁盘中的日志来清除磁盘上的LDF文件。

现在,由于日志文件的大小似乎固定,因此我似乎无法正确理解。我的实际问题是这样的:

截断日志实际上对日志文件(LDF)有什么作用?该过程应防止磁盘装满。

如果我对某些概念的理解不正确,请纠正我。

谢谢!

Answers:


20

事务日志文件(LDF)由内部的许多虚拟日志文件(VLF)组成。可以将它想象成一个带有多个可拉式抽屉的橱柜。您可以选择一个大柜子,也可以选择一个小柜子-但是它仍然是固定大小的,只有不同数量的抽屉。

当SQL Server工作时,它将事务放入抽屉(VLF)。它从机柜的一端开始,填满第一个抽屉,然后当该抽屉中的空间用完时,它将移至下一个抽屉。

备份事务日志时,您真正要做的是:

  • 查找其中包含尚未备份的事务的第一个抽屉
  • 将那些交易复制到其他地方
  • 如果该抽屉不再处于活动状态(因为SQL Server已移至下一个抽屉),则将该抽屉标记为可重用(将其丢弃为所有内容)。

备份不会更改机柜的大小(日志文件)。


嗨,布伦特,谢谢您为我解决问题,谢谢!因此,基本上,您无法减小“柜子”的尺寸,只能清空抽屉。现在,我读了很多人在谈论缩小日志大小。这是指缩小VLF的大小(抽屉中的内容),实际上是缩小磁盘上LDF文件的大小吗?根据我现在的理解,您无法使“柜子”显得微不足道。谢谢!
安东尼

@Anthony是的,您可以通过缩小日志文件的大小来减小机柜的大小,但是通常,这是一个非常糟糕的主意(由于您已经读过的原因。)
Brent Ozar

我会否决那种缩小TLog不好的说法。博客访问相当连续。在自然界。缩小日志时不需要重组数据(就像数据文件一样。您只能释放最后一个活动指针之后的空间)。因此,这根本不会导致任何碎片。
Heiko Hatzfeld '18

1
@HeikoHatzfeld重新将其重新生长是一项阻止操作,并且不利用即时文件初始化,因此它的运行速度非常慢。否决权被覆盖。;-)
布伦特·奥扎

您没有定期执行的操作,只是在您发现没有设置正确的备份计划后才执行一次...而且增长因素应该是一个恒定的合理大小。在这些条件下,它是可以忍受的。
Heiko Hatzfeld '18

6

匹配和混合

备份事务日志与截断事务日志文件不同,截断事务日志文件与缩小事务日志文件不同。哦,是的,并且备份事务日志文件不必触发截断。根据当前负载,数据库引擎可能会决定设置一个检查点,但要等待一点时间。

讲解

事务日志文件是数据库引擎在其中存储对数据库中的数据所做的修改的位置,而不管数据库是在SIMPLE恢复模型中还是在FULL恢复模型中。(重要)

现在,数据库的事务日志文件不仅是一个连续的存储容器,而且是虚拟日志文件(VLF)的集合,这些虚拟日志文件是在事务日志(TLog)文件内按顺序创建的。VLF的大小取决于当前使用的SQL Server版本以及在创建TLog文件时选择的初始大小以及为自动增长设置选择的大小(如果有)。 TLog文件。

参考文献:
- 重要变化VLF创建算法在SQL Server 2014(SQLSkills.com)
- 初始VLF序列号和默认日志文件大小(SQLSkills.com)
- 里面的存储引擎:更多关于日志的循环特性 (SQLSkills。 com)
...可能顺序相反

在数据库中修改数据后,数据库引擎会将这些更改写入相应数据库的TLog中,以保持事务一致性。这也称为ACID-原子性,一致性,隔离性,耐久性。这些更改的实际交易存储在TLog(文件)的VLF中。当VLF已满时,最新的交易将按顺序存储在下一个可用的VLF中。

例外情况

但是,如果到达TLog文件的结尾,则修改将存储在TLog文件开头的第一个VLF中。(在内部存储引擎中进行了解释:有关日志循环性质的更多信息

如果没有可用的VLF空闲来存储新事务,并且配置了自动增长设置,则数据库引擎将按定义的数量增长TLog文件,并根据自动增长设置和公式中定义的大小创建其他VLF。在SQL Server 2014中的VLF创建算法的重要更改中解释了该问题。然后,可以将其他事务存储在TLog文件内的下一个VLF中。

备份TLog文件

触发TLog文件的备份时,您要做的就是告诉数据库引擎执行以下操作:

  • 看一下TLog文件
  • 确定何时最后一次事务日志备份发生(LSN:日志序列号;有待进一步研究)
  • 在TLog文件中设置检查点(数据库检查点(SQL Server)
  • 将TLog文件的备份副本存储在磁盘/磁带上,同时在备份完成之前跟踪先前的LSN和最后提交的LSN
  • 将所有修改转移到“数据库”
  • 将VLF标记为可重用

到目前为止,TLog文件内部尚未释放任何空间以供数据库引擎重用...

自动截断TLog文件

...但是,如果数据库引擎有一些空闲周期,并且承受的压力不是很大,它有时会查看TLog文件,注意检查点并释放VLF以供重用。TLF文件中的空间仍由VLF使用(相同大小,相同位置),但可以自由地重用它们。

记录在事务日志截断中

除非由于某些原因而延迟,否则日志截断将自动发生,如下所示:-在简单恢复模式下,在检查点之后。

  • 在完全恢复模式或大容量日志记录的恢复模式下,在日志备份之后,如果自上次备份以来已发生检查点。有关更多信息,请参阅本主题后面的“完整和批量记录的恢复模型下的日志截断”。

在某些情况下,这种情况不会发生:

尽管是自动的,但日志截断可能会由于多种因素而延迟。有关可以延迟日志截断的内容的信息,请参阅可以延迟日志截断的因素

可视化日志截断

使用SQL语句或SSMS UI中的数据库空间报告查询TLog大小时,可以观察到日志截断。您可能会观察到,TLog文件内部的已用空间可能仅为可用TLog文件大小的1%。

缩小或不缩小

一般建议不要缩小TLog文件,因为它由于某种原因而增长,并且可能会再次增长到以前的大小。但这是另一个帖子的故事。有一些很好的理由,其中之一是当您在TLog文件中重新创建VLF的大小时。

回答你的问题

根据您的假设和问题进行内联

我的理解是备份数据库:

  • 截断事务日志,并

这是一个错误的假设。备份数据库(FULL,DIFFERENTIAL)对TLog文件没有任何作用。完整备份将与TLog文件中的已提交事务一起创建数据库的一致状态。DIFF备份将创建自数据库的上一次FULL备份以来所有过去的TLog备份的一致状态。

但是,TLOG备份会从TLog文件创建已提交事务的备份,设置检查点,并可能(当负载不重时)释放VLF以供重用。

  • 缩小尺寸

不,在考虑完整备份和不同备份时。不可以,在考虑TLOG备份时,但是如果数据库引擎有空闲时间,它将释放TLog文件中的VLF。

截断日志实际上对日志文件(LDF)有什么作用?该过程应防止磁盘装满。

截断日志允许重复使用VLF。就这样。

如果已设置自动增长设置,则此过程的好处是可以防止TLog文件增长。

如果未设置自动增长设置,因为您的需求工程流程确定TLog文件的大小固定,那么最糟糕的情况是TLog已填满,因为没有TLog备份发生,因此没有VLF被释放。TLog无法增长,VLF也无法释放,以允许将其他事务写入TLog文件(或内部的VLF)。


4

布伦特·奥扎尔(Brent Ozar)已经为您提供了有关事务日志文件的解释,我将重点关注您的某些问题

我的理解是备份数据库:

  • 截断事务日志,并
  • 缩小尺寸

完全备份对任何恢复模型中的事务日志均不起作用。在完全恢复模式下,当您进行事务日志备份时,它将截断日志。请注意,如果仍然存在持有VLF的长期交易,或者按照Brent的解释仍然需要出票人,则其他交易不能重新使用出票人,或者从技术角度讲,它不会被截断以便可以重新使用。

它还不会缩小事务日志。要缩小日志,您必须使用dbcc shrinkfile命令

截断日志实际上对日志文件(LDF)有什么作用?该过程应防止磁盘装满。

它使日志文件可重复使用,以便其他事务可以使用它,或者按照布伦特的类比,其他人可以使用抽屉将文件保留在其中。

经过回答之后,我强烈建议您阅读SQLSKILLS.com上的事务日志。


感谢Shanky,非常感谢您的解释!因此,当备份截断日志时,它们实际上并没有减小LDF文件的大小,它们只是为在该日志文件中处理其他事务“腾出空间”。我猜对了吗?谢谢!
安东尼

你是绝对正确的。
Shanky
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.