SQL Server 中的事务日志会自动收缩吗?

jra*_*ara 10 sql-server-2008 sql-server backup shrink transaction

当 SQL Server 数据库处于 SIMPLE 模式时,您不必关心事务日志 bakcups。但是在 SIMPLE 模式下,事务日志似乎会像在 FULL 模式下一样增长。是否会在某个时间点自动截断?还是我必须手动截断/缩小它?

Mar*_*ith 19

它会自动截断,但这与缩小非常不同。截断回收日志空间以供重用,物理收缩会减小文件大小以将空间释放回操作系统。如果您的日志已增长到当前大小,那么如果缩小它,它可能会再次增长。

我建议您了解系统的典型和最大日志使用量。下面的查询(不是我的,由 Glen Berrys DMV 脚本增强)可以手动运行,也可以通过代理作业将输出捕获到表中。如果您将其记录到表中一周左右,您将了解典型使用情况,更重要的是,当某个进程导致日志增长超出您的预期时。

SELECT 
     db.[name] AS [Database Name]
   , db.recovery_model_desc AS [Recovery Model]
   , db.log_reuse_wait_desc AS [Log Reuse Wait Description]
   , ls.cntr_value AS [Log Size (KB)]
   , lu.cntr_value AS [Log Used (KB)]
   , CAST(
        CAST(lu.cntr_value AS FLOAT) / CAST(ls.cntr_value AS FLOAT) 
        AS DECIMAL(18,2)
     ) * 100 AS [Log Used %]
   , db.[compatibility_level] AS [DB Compatibility Level]
   , db.page_verify_option_desc AS [Page Verify Option]
   , db.is_auto_create_stats_on, db.is_auto_update_stats_on
   , db.is_auto_update_stats_async_on, db.is_parameterization_forced
   , db.snapshot_isolation_state_desc, db.is_read_committed_snapshot_on
FROM sys.databases AS db
   INNER JOIN sys.dm_os_performance_counters AS lu 
     ON db.name = lu.instance_name
   INNER JOIN sys.dm_os_performance_counters AS ls 
     ON db.name = ls.instance_name
WHERE lu.counter_name LIKE N'Log File(s) Used Size (KB)%' 
   AND ls.counter_name LIKE N'Log File(s) Size (KB)%'
   AND ls.cntr_value > 0 
OPTION (RECOMPILE);
Run Code Online (Sandbox Code Playgroud)

事务日志截断描述了日志截断发生的时间和原因。

如果日志记录从未从事务日志中删除,它最终会填满物理日志文件可用的所有磁盘空间。日志截断会自动释放逻辑日志中的空间以供事务日志重用。

可以延迟日志截断的因素是一个有用的参考,可以帮助您理解为什么您的日志可能无法截断并因此变得比预期的大。