收缩事务日志

减小事务日志的物理大小需要收缩日志文件。通过删除一个或多个不活动的虚拟日志文件来收缩事务日志,从而减小其物理大小。包含任何活动日志记录的虚拟日志文件(即“活动的虚拟日志文件**”)是逻辑日志的一部分,不能将其删除。有关虚拟日志文件的详细信息,请参阅事务日志物理体系结构

ms178037.note(zh-cn,SQL.90).gif注意:
如果事务日志最近未被截断,则在截断日志之前无法收缩日志。有关详细信息,请参阅导致日志截断延迟的因素

如何收缩日志文件?

减小操作是以虚拟日志文件为单位进行的。例如,如果有一个 600 MB 的日志文件分为六个 100 MB 的虚拟日志,则该日志文件的大小只能按 100 MB 递减。文件可以减小为 500 MB 或 400 MB,但不能减小为 433 MB 或 525 MB。

ms178037.note(zh-cn,SQL.90).gif注意:
创建或扩展日志文件时,数据库引擎动态选择虚拟日志文件的大小。有关详细信息,请参阅事务日志物理体系结构

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

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

在收缩任何文件时,必须从文件的末端开始释放空间。在收缩事务日志文件时,将从日志文件的末端释放足够的虚拟日志文件,以便将日志减小到用户所要求的大小。用户指定的 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 语句以释放剩余的空间。

例如,当运行 target_size 为 275 MB 的 DBCC SHRINKFILE 语句时,假设有一个包含六个虚拟日志文件的 600 MB 日志文件,其中有一个逻辑日志从第 3 个虚拟日志开始,到第 4 个虚拟日志结束,则:

在收缩前具有 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 个虚拟日志文件将被释放,物理日志文件的大小将减小到所要求的大小。

ms178037.note(zh-cn,SQL.90).gif注意:
某些因素(例如,长时间运行的事务)可以在更长时间内保持虚拟日志文件为活动状态。这可以限制日志收缩,甚至阻止日志进行收缩。有关详细信息,请参阅导致日志截断延迟的因素

何时收缩日志?

可以在数据库在线时执行收缩日志操作。在下列情况下,日志文件的物理大小将减小:

  • 发生自动收缩操作。
  • 执行引用日志文件的 DBCC SHRINKFILE 语句。
  • 执行 DBCC SHRINKDATABASE 语句。

收缩日志文件

监视日志文件收缩事件

监视日志空间使用情况

请参阅

概念

解决事务日志已满的问题(错误 9002)
设置数据库选项
使用事务日志备份
事务日志截断

其他资源

BACKUP (Transact-SQL)
DBCC SHRINKDATABASE (Transact-SQL)
DBCC SHRINKFILE (Transact-SQL)
空间分配和重新使用

帮助和信息

获取 SQL Server 2005 帮助