原理:簡單模式下交易提交後記錄空間自動重複使用,收縮操作即可釋放未使用空間至作業系統。
SET NOCOUNT ON
DECLARE @LogicalFileName sysname, @MaxMinutes INT, @NewSize INT
USE YourDatabase -- 目標資料庫
SELECT @LogicalFileName = 'YourDatabase_log', -- 邏輯記錄檔名
@MaxMinutes = 10, -- 最大嘗試分鐘
@NewSize = 1 -- 目標大小 (MB)
DECLARE @OriginalSize INT
SELECT @OriginalSize = size FROM sysfiles WHERE name = @LogicalFileName
PRINT 'Original Size of ' + DB_NAME() + ' LOG is ' + CAST(@OriginalSize AS varchar) + ' 8K pages or ' + 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 of ' + DB_NAME() + ' LOG is ' + CAST(size AS varchar) + ' 8K pages or ' + CAST(size*8/1024 AS varchar) + 'MB'
FROM sysfiles WHERE name = @LogicalFileName
DROP TABLE DummyTrans
SET NOCOUNT OFF
| 面向 | 方法一 (簡單模式) | 方法二 (T-SQL 強制) |
|---|---|---|
| 適用復原模式 | 簡單模式 (臨時切換) | 完整/大量記錄模式 |
| 操作方式 | GUI 點擊 | T-SQL 指令碼 |
| 記錄檔保護 | 切換模式會中斷記錄鏈,需重新完整備份 | 保留記錄鏈 (配合 TRUNCATE_ONLY 截斷非作用部分) |
| 自動化程度 | 手動 | 可納入維護作業排程 |
BACKUP LOG 至磁碟是控制記錄檔大小的根本之道。TRUNCATE_ONLY,請改用簡單模式切換法或調整備份頻率。