資料庫本身僅 600 MB,交易記錄檔實際大小 33 MB,但佔用空間卻高達 2.8 GB。嘗試 SHRINK DATABASE、BACKUP LOG ... WITH TRUNCATE_ONLY 皆無效,疑似遇到舊版本已知問題。
將以下程式碼複製至查詢分析器,修改三個參數即可執行:
@LogicalFileName:邏輯記錄檔名稱(可用 sp_helpfile 查詢)@NewSize:目標大小(MB)@MaxMinutes:允許跑多久(預設 10 分鐘)SET NOCOUNT ON
DECLARE @LogicalFileName sysname,
@MaxMinutes INT,
@NewSize INT
USE YourDatabaseName -- 修改:目標資料庫
SELECT @LogicalFileName = 'YourDatabase_log' -- 修改:邏輯記錄檔名
SELECT @MaxMinutes = 10,
@NewSize = 100 -- 修改:目標大小 (MB)
DECLARE @OriginalSize int
SELECT @OriginalSize = size FROM sysfiles WHERE name = @LogicalFileName
PRINT 'Original log 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 < 500
BEGIN
INSERT DummyTrans VALUES ('Fill log to force wrap')
SELECT @Counter = @Counter + 1
END
EXEC (@TruncLog)
END
DROP TABLE DummyTrans
PRINT 'Shrink completed. Current log size: ' +
CAST((SELECT size FROM sysfiles WHERE name = @LogicalFileName) * 8 / 1024 AS varchar) + ' MB'
DBCC SHRINKFILE。BACKUP LOG ... WITH TRUNCATE_ONLY 截斷非作用段落。BACKUP LOG TO DISK 維護記錄鏈。