.ldf) 异常膨脹 (如 1GB+),佔用磁碟空間BACKUP LOG ... WITH TRUNCATE_ONLY (2000 專用) 截斷非作用中虛擬記錄檔 (VLF)DBCC SHRINKFILE (邏輯檔名, 目標MB) 釋放檔案末端未使用空間SET NOCOUNT ON
DECLARE @LogicalFileName SYSNAME, @MaxMinutes INT, @NewSize INT
USE Cisi -- 目標資料庫
SELECT @LogicalFileName = 'Cisi_log', -- 邏輯檔名 (sp_helpfile 查詢)
@MaxMinutes = 10, -- 最大嘗試分鐘數
@NewSize = 10 -- 目標大小 (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)
-- 循環製造交易迫使 VLF 循環
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
| 參數 | 說明 |
|---|---|
@MaxMinutes | 防止無限循環,建議 10-30 分鐘 |
@NewSize | 目標 MB,不可小於資料庫最小記錄檔需求 |
DummyTrans | 單行 8000 bytes,快速產生記錄檔活動 |
@OriginalSize / 16 | 迴圈上限,對應 8KB 頁面轉換邏輯 |
TRUNCATE_ONLY 在 **SQL 2005+ 已移除**。ALTER DATABASE db SET RECOVERY SIMPLEDBCC SHRINKFILE (N'logfile', 10)ALTER DATABASE db SET RECOVERY FULLsp_helpfile / sys.database_files)log_reuse_wait_desc (2005+) 確認無異常等待收縮記錄檔是**治標**手段,**定期記錄檔備份**才是**治本**。SQL 2000 時代腳本雖經典,但現代版本應採用「簡單模式收縮 → 切回完整模式 → 立即備份」標準流程,並建立完備備份策略徹底解決記錄檔暴增問題。