交易記錄 (LDF) 無限增長會佔滿磁碟、導致資料庫掛起、備份時間暴增。本文提供從「緊急瘦身」到「長期管控」的分級方案。
.ldf 檔.mdf → 確定T-SQL 等效:
EXEC sp_detach_db 'MyDB';
-- 手動刪除 .ldf
EXEC sp_attach_single_file_db @dbname='MyDB', @physname='C:\Data\MyDB.mdf';
-- 1. 簡單模式下截斷
ALTER DATABASE MyDB SET RECOVERY SIMPLE;
DBCC SHRINKFILE (MyDB_Log, 100); -- 目標 100MB
-- 2. 完整模式需先備份記錄再截斷
BACKUP LOG MyDB TO DISK='C:\bak\MyDB_log.trn';
DBCC SHRINKFILE (MyDB_Log, 100);
ALTER DATABASE MyDB SET RECOVERY FULL; -- 還原完整模式
-- 啟用自動收縮(慎用,會產生碎片)
ALTER DATABASE MyDB SET AUTO_SHRINK ON;
-- 限制記錄檔最大增長
ALTER DATABASE MyDB MODIFY FILE (NAME=MyDB_Log, MAXSIZE=2048MB); -- 2GB 上限
-- 固定增長增量(避免頻繁小幅擴展)
ALTER DATABASE MyDB MODIFY FILE (NAME=MyDB_Log, FILEGROWTH=512MB);
建立於 master 資料庫,支援參數化:
USE master;
GO
CREATE PROC p_compdb
@dbname sysname,
@bkdatabase bit = 1,
@bkfname nvarchar(260) = NULL
AS
BEGIN
-- 1. 截斷記錄
EXEC('DUMP TRANSACTION ['+@dbname+'] WITH NO_LOG');
EXEC('BACKUP LOG ['+@dbname+'] WITH NO_LOG');
-- 2. 收縮資料與記錄檔
EXEC('DBCC SHRINKDATABASE(['+@dbname+'])');
-- 3. 設定自動收縮
EXEC('EXEC sp_dboption '+@dbname+', autoshrink, TRUE');
-- 4. 選擇性:完整備份 -> 分離 -> 刪除 .ldf -> 附加 (極致瘦身)
IF @bkdatabase = 1 BEGIN
IF @bkfname IS NULL SET @bkfname = @dbname+'_'+CONVERT(varchar,GETDATE(),112)+REPLACE(CONVERT(varchar,GETDATE(),108),':','');
EXEC('BACKUP DATABASE ['+@dbname+'] TO DISK='''+@bkfname+'''');
-- 分離、刪除 .ldf、附加邏輯略(見原文完整代碼)
END
END
GO
AUTO_SHRINK 僅建議開發/測試環境,生產環境手動排程收縮DBCC SQLPERF(LOGSPACE),設定告警閾值 (如 > 70%)