收缩事务日志

如果您知道事务日志文件包含将不需要的未使用空间,则通过减少事务日志的大小,可以回收过多空间。此过程称为“收缩”日志文件。

仅当数据库处于联机状态,而且至少一个虚拟日志文件可用时,收缩才会发生。在某些情况下,直到下一个日志截断后,才能收缩日志。

注意注意

通常,在简单恢复模式下,截断会在备份数据库时自动发生;在完整恢复模式下,则在备份事务日志时自动发生。但是,截断可以由于很多因素延迟。有关详细信息,请参阅可能延迟日志截断的因素

收缩日志文件(而不收缩数据库文件)

监视日志文件收缩事件

To monitor log space

注意注意

收缩数据库和日志文件可以设置为自动发生。但是,我们建议不使用自动收缩,且 autoshrink 数据库属性默认情况下设置为 FALSE。如果 autoshrink 设置为 TRUE,则仅当其空间的 25% 以上未使用时,自动收缩才会减少文件的大小。文件将收缩至未使用空间占文件 25% 的大小,或者收缩至文件的原始大小,以两者中较大者为准。有关更改 autoshrink 属性的设置的信息,请参阅如何查看或更改数据库的属性 (SQL Server Management Studio) - 使用“选项”页上的“自动收缩”属性 - 或 ALTER DATABASE SET 选项 (Transact-SQL) - 使用 AUTO_SHRINK 选项。

如何收缩日志文件?

通过删除一个或多个不活动的虚拟日志文件来收缩事务日志,从而减小其物理大小。减小大小操作始终以虚拟日志文件为单位进行。例如,如果有一个 600 MB 的日志文件分为六个 100 MB 的虚拟日志,则该日志文件的大小只能按 100 MB 递减。文件可以减小为 500 MB 或 400 MB,但不能减小为 433 MB 或 525 MB。包含任何活动日志记录的虚拟日志文件(即“活动的虚拟日志文件”)是逻辑日志的一部分,不能将其删除。有关详细信息,请参阅事务日志物理体系结构

注意注意

创建或扩展日志文件时,数据库引擎动态选择虚拟日志文件的大小。有关详细信息,请参阅事务日志物理体系结构

对于日志文件,当前大小与虚拟日志文件使用的页的总大小相同。但请注意,日志文件不使用这些页。不能释放包含任何逻辑日志部分的虚拟日志文件。如果日志文件中的所有虚拟日志文件都包含逻辑日志部分,则此日志文件不能收缩。日志截断将一个或多个虚拟日志文件标记为非活动之后,才能进行收缩。

收缩文件操作只能删除不活动的虚拟日志文件。如果未指定目标大小,收缩文件操作仅删除文件中最后一个活动虚拟日志文件后面的不活动虚拟日志文件。如果指定目标大小,则给定收缩文件操作仅删除足够多的不活动虚拟日志文件,以接近但不超过目标大小。收缩之后,日志文件通常稍大于目标大小,但永远不会小于目标大小。由于虚拟日志文件的存在,因此很难预测日志文件的实际收缩程度。

在收缩任何文件时,必须从文件的末端开始释放空间。在收缩事务日志文件时,将从日志文件的末端释放足够的虚拟日志文件,以便将日志减小到用户所要求的大小。用户指定的 target_size 将圆整为下一个最大的虚拟日志文件边界。例如,如果用户为包含六个 100 MB 虚拟日志文件的 600 MB 的示例文件指定 325 MB 的 target_size,则最后两个虚拟日志文件将删除,新的文件大小为 400 MB。

DBCC SHRINKDATABASE 或 DBCC SHRINKFILE 操作会立即尝试将物理日志文件收缩为所要求的大小:

  • 如果虚拟日志文件中的逻辑日志未超出 target_size 标记,则释放 target_size 标记之后的虚拟日志文件,并成功完成 DBCC 语句,不显示任何信息。

如果虚拟日志中的逻辑日志超出了 target_size 标记,SQL Server 数据库引擎将释放尽可能多的空间并显示一个信息性消息。该消息告诉您必须执行什么操作来从文件尾部的虚拟日志中删除逻辑日志。执行完该操作后,可以重新发出 DBCC 语句以释放剩余的空间。

例如,假设有一个包含六个虚拟日志文件的 600 MB 日志文件,其中有一个逻辑日志从第 3 个虚拟日志开始,到第 4 个虚拟日志结束,并且在运行 DBCC SHRINKFILE 语句时将 target_size 指定为 275 MB(位于第 3 个虚拟日志的四分之三处),则:

在收缩前具有 6 个虚拟日志文件的日志文件

第 5 个和第 6 个虚拟日志文件将立即释放,因为它们不包含逻辑日志。但是,若要符合指定的 target_size,还应释放第 4 个虚拟日志文件,但由于它包含了逻辑日志的尾部,所以不能释放。在释放了第 5 个和第 6 个虚拟日志文件之后,数据库引擎将用虚记录填充第 4 个虚拟日志文件的剩余部分。这会强制地使日志文件的尾部成为第 1 个虚拟日志文件的尾部。在大多数系统中,第 4 个虚拟日志文件中的所有事务都将在数秒内提交。这意味着日志的整个活动部分将移动到第 1 个虚拟日志文件。现在该日志文件类似于:

日志文件减少为 4 个虚拟文件

DBCC SHRINKFILE 语句还显示一个信息性消息,指出它不能释放所要求的全部空间,并告诉您可以执行 BACKUP LOG 语句来释放剩余的空间。日志的活动部分移动到第 1 个虚拟日志文件之后,BACKUP LOG 语句将截断第 4 个虚拟日志文件中的整个逻辑日志:

截断日志后的日志文件结果

由于第 4 个虚拟日志文件不再包含任何逻辑日志,此时便可以运行 target_size 为 275 MB 的相同的 DBCC SHRINKFILE 语句了。第 4 个虚拟日志文件将被释放,物理日志文件的大小将减小到所要求的大小。

注意注意

某些因素(例如,长时间运行的事务)可以在更长时间内保持虚拟日志文件为活动状态。这可以限制日志收缩,甚至阻止日志进行收缩。有关详细信息,请参阅可能延迟日志截断的因素