SQL Server 交易記錄檔(LDF)隨著時間增長,若不定期維護將佔用大量磁碟空間,甚至導致資料庫無法寫入。本文詳細說明兩種清理記錄檔的方法:圖形介面收縮與 T-SQL 腳本自動化,並解析各自適用場景與風險控制。
以下腳本可精確控制目標大小、等待時間,並透過建立虛擬交易強制記錄檔截斷:
SET NOCOUNT ON;
DECLARE @LogicalFileName sysname = 'yourDB_log', -- 邏輯記錄檔名稱
@MaxMinutes INT = 10, -- 最大等待分鐘數
@NewSize INT = 1; -- 目標大小 (MB)
USE yourDB; -- 目標資料庫
DECLARE @OriginalSize INT;
SELECT @OriginalSize = size FROM sysfiles WHERE name = @LogicalFileName;
PRINT 'Original Size: ' + CAST(@OriginalSize * 8 / 1024 AS VARCHAR) + ' MB';
CREATE TABLE DummyTrans (DummyColumn CHAR(8000) NOT NULL);
DECLARE @Counter INT, @StartTime DATETIME, @TruncLog VARCHAR(255);
SELECT @StartTime = GETDATE(),
@TruncLog = 'BACKUP LOG ' + DB_NAME() + ' WITH TRUNCATE_ONLY';
DBCC SHRINKFILE (@LogicalFileName, @NewSize);
EXEC (@TruncLog);
-- 若記錄檔未縮減至目標,寫入虛擬資料強制循環
WHILE @MaxMinutes > DATEDIFF(mi, @StartTime, GETDATE())
AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)
AND (@OriginalSize * 8 / 1024) > @NewSize
BEGIN
SELECT @Counter = 0;
WHILE (@Counter < @OriginalSize / 16) AND (@Counter < 50000)
BEGIN
INSERT DummyTrans VALUES ('Fill Log');
DELETE DummyTrans;
SELECT @Counter = @Counter + 1;
END
EXEC (@TruncLog);
END
PRINT 'Final Size: ' + CAST((SELECT size FROM sysfiles WHERE name = @LogicalFileName) * 8 / 1024 AS VARCHAR) + ' MB';
DROP TABLE DummyTrans;
SET NOCOUNT OFF;
| 參數 | 用途 |
|---|---|
| @LogicalFileName | sysfiles 中的邏輯檔案名稱(非實體路徑) |
| @MaxMinutes | 防止腳本無限執行的保護機制 |
| @NewSize | 期望收縮後的 MB 數 |
| DummyTrans | 臨時表,用於產生大量交易推動 VLF 循環 |
掌握這兩種方法,並配合定期記錄備份策略,即能有效控制 SQL Server 記錄檔體積,確保資料庫穩定運行。