Sql-Server

SQL Server 中的事務日誌會自動收縮嗎?

  • September 10, 2015

當 SQL Server 數據庫處於 SIMPLE 模式時,您不必關心事務日誌 bakcups。但在 SIMPLE 模式下,事務日誌似乎會像在 FULL 模式下一樣增長。是否在某個時間點自動截斷?還是我必須手動截斷/縮小它?

它會自動截斷,但這與收縮有很大不同。截斷回收日誌空間以供重用,物理上縮小文件大小以將空間釋放回作業系統。如果您的日誌已經增長到目前大小,那麼如果您縮小它,它很可能會再次增長。

我建議您了解一下您的系統的典型和最大日誌使用量。下面的查詢(不是我的,來自 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);

事務日誌截斷描述了日誌截斷發生的時間和原因。

如果日誌記錄從未從事務日誌中刪除,它最終會填滿所有可用於物理日誌文件的磁碟空間。日誌截斷自動釋放邏輯日誌中的空間以供事務日誌重用。

可以延遲日誌截斷的因素是一個有用的參考,可以幫助您了解為什麼您的日誌可能無法截斷並因此變得比預期大。

引用自:https://dba.stackexchange.com/questions/4154