記錄檔過大是常見維運痛點。提供兩種清除方案:
原理: 簡單模式下記錄檔自動截斷,DBCC SHRINKDATABASE 釋放未使用空間。
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: ' + 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: ' + CAST(size * 8 / 1024 AS VARCHAR) + ' MB'
FROM sysfiles WHERE name = @LogicalFileName
DROP TABLE DummyTrans
SET NOCOUNT OFF
SHRINKFILE 嘗試直接縮小BACKUP LOG ... TRUNCATE_ONLY 截斷非作用中 VLF| 參數 | 取得方式 | 範例 |
|---|---|---|
| USE | 目標資料庫名 | MyDB |
| @LogicalFileName | sp_helpfile 查詢 | MyDB_log |
| @NewSize | 期望縮小目標 (MB) | 100 |
BACKUP LOG 至磁碟/帶庫方法一適合非生產環境快速處理;方法二適用生產緊急縮小。長期仍需建立完整備份策略。