Ant*_*ony 8 sql-server transaction-log
我正在尝试收集有关 SQL 数据库的一些知识,但我对事务日志文件 (LDF) 有一些疑问。
首先,当您创建数据库时,您必须为数据库和日志文件定义初始文件大小。据我所知,一旦在磁盘上创建文件,无论数据库中是否有实际数据或是否有任何事务(日志),它们都将具有指定的大小。
我的理解是备份数据库:
通过“清空”其中的日志来清除磁盘上的 LDF 文件。
现在看来我没有正确理解这一点,因为日志文件似乎是固定大小的。我的实际问题是这样的:
截断日志实际上对日志文件 (LDF) 有何影响?这个过程应该是为了防止磁盘变满。
如果我没有正确理解某些概念,请纠正我。
谢谢!
Bre*_*zar 21
事务日志文件 (LDF) 由内部的大量虚拟日志文件 (VLF) 组成。把它想象成一个带有几个拉出式抽屉的柜子。你可以选择大柜子,也可以选择小柜子——但它仍然是固定尺寸的,只是抽屉数量不同。
在 SQL Server 工作时,它会将您的事务放入抽屉 (VLF)。它从柜子的一端开始,填满第一个抽屉,然后当该抽屉中的空间用完时,它会移动到下一个抽屉。
当您备份事务日志时,您真正在做的是:
备份不会改变您的文件柜(日志文件)的大小。
备份事务日志与截断事务日志文件不同,截断事务日志文件与收缩事务日志文件不同。哦,是的,备份事务日志文件不必触发截断。根据当前的负载,数据库引擎可能会决定设置一个检查点,但要等待一些截断。
事务日志文件是数据库引擎存储对数据库中数据所做修改的地方,无论数据库是处于 SIMPLE 恢复模式还是处于 FULL 恢复模式。(重要的)
现在,数据库的事务日志文件不仅仅是一个连续的存储容器,而是一组在事务日志 (TLog) 文件中按顺序创建的虚拟日志文件 (VLF)。VLF 的大小取决于您当前使用的 SQL Server 版本以及您在创建 TLog 文件期间选择的初始大小以及您为自动增长设置选择的大小(如果有)日志文件。
参考:
- SQL Server 2014 (SQLSkills.com) 中VLF 创建算法的重要更改
-初始 VLF 序列号和默认日志文件大小(SQLSkills.com)
-存储引擎内部:更多关于日志的循环性质
(SQLSkills.com) com)
...也许以相反的顺序
当数据库中的数据发生修改时,数据库引擎会将这些更改写入对应数据库的 TLog 中,以维护事务一致性。这也称为ACID - 原子性、一致性、隔离性、持久性。这些更改的实际事务存储在 TLog(文件)的 VLF 中。当 VLF 已满时,最新的事务将按顺序存储在下一个可用的 VLF 中。
但是,如果到达 TLog 文件的末尾,则修改将存储在 TLog 文件开头的第一个 VLF 中。(在存储引擎内部解释:更多关于日志的循环性质)
当没有可用的 VLF 可以自由存储新事务并且配置了自动增长设置时,数据库引擎将按照定义的数量增长 TLog 文件,并根据自动增长设置和公式中定义的大小创建额外的 VLF在 SQL Server 2014 中 VLF 创建算法的重要更改中进行了解释。然后可以将更多事务存储在 TLog 文件内的下一个 VLF 中。
当您触发 TLog 文件的备份时,您所做的就是告诉数据库引擎
到目前为止,TLog 文件中还没有释放空间供数据库引擎重用......
...但是如果数据库引擎有一些空闲周期并且压力不是很大,它会偶尔查看 TLog 文件,注意检查点并释放 VLF 以供重用。TLog 文件内的空间仍由 VLF 使用(相同大小、相同位置),但它们可以自由重用。
这记录在事务日志截断中:
除非由于某种原因延迟,日志截断会自动发生如下: - 在简单恢复模式下,在检查点之后。
- 在完整恢复模式或大容量日志恢复模式下,在日志备份后,如果自上次备份以来发生了检查点。有关详细信息,请参阅本主题后面的“完整和大容量日志恢复模式下的日志截断”。
在某些情况下,这不会发生:
虽然是自动的,但日志截断可能会因多种因素而延迟。有关什么可以延迟日志截断的信息,请参阅可以延迟日志截断的因素。
当您使用 SQL 语句或 SSMS UI 中的数据库空间报告查询 TLog 大小时,可以观察到日志截断。您可能会观察到 TLog 文件中的已用空间可能仅为可用 TLog 文件大小的 1%。
一般建议不要缩小 TLog 文件,因为它因某种原因而增长,并且可能会再次增长到以前的大小。但这是另一篇文章的故事。有一些很好的理由,一个是当您在 TLog 文件中重新创建 VLF 的大小时。
内联在您的假设和问题之下
我的理解是备份数据库:
- 截断事务日志,以及
这是一个错误的假设。备份您的数据库(FULL、DIFFERENTIAL)对 TLog 文件没有任何作用。完整备份将创建数据库的一致状态以及从 TLog 文件提交的事务。DIFF 备份将创建自上次数据库完全备份以来所有过去 TLog 备份的一致状态。
但是,TLOG 备份将从 TLog 文件创建已提交事务的备份,设置检查点并可能(当负载不高时)释放 VLF 以供重用。
- 缩小尺寸
不,在考虑 FULL 和 DIFF 备份时。不,在考虑 TLOG 备份时,但如果数据库引擎有一些空闲时间,它将释放 TLog 文件中的 VLF。
截断日志实际上对日志文件 (LDF) 有何影响?这个过程应该是为了防止磁盘变满。
截断日志允许重用 VLF。就这样。
如果设置了自动增长设置,此过程可以防止 TLog 文件增长。
如果没有设置自动增长设置,因为您的需求工程过程确定 TLog 文件将具有固定大小,那么这里最糟糕的情况是 TLog 已满,因为没有发生 TLog 备份,因此没有 VLF 被释放。TLog 无法增长并且 VLF 不会被释放以允许将更多事务写入 TLog 文件(或内部 VLF)。
虽然 Brent Ozar 已经向您解释了事务日志文件的外观,但我将重点讨论您的某些问题
我的理解是备份数据库:
- 截断事务日志,并且
- 缩小尺寸
完整备份对任何恢复模型中的事务日志都没有任何作用。在完全恢复模型中,当您进行事务日志备份时,它会截断日志。请注意,如果长期运行的交易仍然持有 VLF,或者根据布伦特的解释仍然需要抽屉,则其他交易无法重新利用抽屉,或者从技术角度来说,它不会被截断以便可以重新使用。
它也不会缩小事务日志。要缩小日志,您必须使用dbcc shrinkfile
命令
截断日志实际上对日志文件 (LDF) 有何作用?此过程旨在防止磁盘变满。
它使日志文件可重用,以便其他事务可以使用它,或者根据布伦特的类比,其他人可以使用抽屉来保存东西。
看完答案后,我强烈建议您阅读SQLSKILLS.com上的事务日志
归档时间: |
|
查看次数: |
11283 次 |
最近记录: |