資料檔 600 MB,記錄檔邏輯 33 MB 卻佔用 2.8 GB 磁碟。常見原因:
DBCC SHRINKDATABASE / SHRINKFILE 僅釋放檔案尾端未使用空間BACKUP LOG WITH TRUNCATE_ONLY 已移除(SQL 2008+),簡單模式才自動截斷SET NOCOUNT ON
DECLARE @LogicalFileName SYSNAME = 'YourDB_log', -- 邏輯檔名,非實體路徑
@MaxMinutes INT = 10,
@NewSizeMB INT = 100 -- 目標大小 MB
USE YourDB
DECLARE @OriginalSize INT = (SELECT size FROM sys.database_files WHERE name = @LogicalFileName)
PRINT 'Original Size: ' + CAST(@OriginalSize * 8 / 1024 AS VARCHAR) + ' MB'
CREATE TABLE #DummyTrans (DummyColumn CHAR(8000) NOT NULL)
DECLARE @StartTime DATETIME = GETDATE(),
@TruncLog NVARCHAR(MAX) = N'BACKUP LOG [' + DB_NAME() + N'] WITH NO_LOG' -- 2005/2008 相容
-- 簡單模式直接 CHECKPOINT;完整模式需備份記錄
IF DATABASEPROPERTYEX(DB_NAME(), 'Recovery') = 'SIMPLE'
SET @TruncLog = N'CHECKPOINT'
ELSE
SET @TruncLog = N'BACKUP LOG [' + DB_NAME() + N'] TO DISK = ''NUL:'' WITH NOFORMAT, INIT, NAME = ''TruncateLog''' -- 開發環境可用 NUL 裝置
DBCC SHRINKFILE (@LogicalFileName, @NewSizeMB)
EXEC (@TruncLog)
WHILE @MaxMinutes > DATEDIFF(MI, @StartTime, GETDATE())
AND @OriginalSize = (SELECT size FROM sys.database_files WHERE name = @LogicalFileName)
AND (@OriginalSize * 8 / 1024) > @NewSizeMB
BEGIN
DECLARE @Counter INT = 0
WHILE @Counter < @OriginalSize / 16 AND @Counter < 50000
BEGIN
INSERT #DummyTrans VALUES ('Fill Log')
DELETE #DummyTrans
SET @Counter += 1
END
EXEC (@TruncLog)
END
PRINT 'Final Size: ' + CAST((SELECT size FROM sys.database_files WHERE name = @LogicalFileName) * 8 / 1024 AS VARCHAR) + ' MB'
DROP TABLE #DummyTrans
SET NOCOUNT OFF
CHECKPOINT(簡單模式)或 BACKUP LOG(完整模式)截斷非作用 VLFSHRINKFILE 釋放檔案尾端空間DBCC LOGINFO,避免過多小 VLF 造成效能問題| 設定 | 建議值 | 說明 |
|---|---|---|
| 復原模式 | 視 RPO 決定 | 完整模式必配記錄備份排程 |
| 記錄檔初始大小 | 預估峰值 80% | 避免頻繁自動成長 |
| 自動成長 | 固定 512 MB / 1 GB | 百分比成長不可控 |
| VLF 數量 | < 1000 | 過多啟動慢、備份慢 |
| 監控警示 | 使用率 > 80% | 早期發現異常成長 |
ALTER DATABASE YourDB SET RECOVERY SIMPLE警告:切換復原模式會中斷記錄鏈,必須完整備份才能恢復時間點還原能力。