資料庫本體 600MB,記錄檔卻佔 2.8GB 是常見痛點。SHRINK DATABASE、TRUNCATE LOG 常無效。本文提供經實測可用的 T-SQL 腳本,三步驟完成記錄檔縮小。
SET NOCOUNT ON
DECLARE @LogicalFileName sysname, @MaxMinutes INT, @NewSize INT
USE YourDatabase -- 修改:目標資料庫名
SELECT @LogicalFileName = 'YourDatabase_log' -- 修改:邏輯記錄檔名
SELECT @MaxMinutes = 10, @NewSize = 100 -- 修改:目標大小 (MB)
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
SELECT 'Final Size: ' + CAST(size * 8 / 1024 AS VARCHAR) + ' MB'
FROM sysfiles WHERE name = @LogicalFileName
DROP TABLE DummyTrans
SET NOCOUNT OFF
DBCC SHRINKFILE 嘗試直接縮小BACKUP LOG ... WITH TRUNCATE_ONLY 截斷非作用中虛擬記錄檔 (VLF)| 參數 | 說明 | 範例 |
|---|---|---|
| USE | 目標資料庫名 | MyDB |
| @LogicalFileName | 邏輯記錄檔名(執行 sp_helpfile 查詢) | MyDB_log |
| @NewSize | 目標縮小大小 (MB) | 100 |