交易記錄 (LDF) 暴增佔滿磁碟是 SQL Server DBA 最常見的「半夜驚魂」場景。本文提供從緊急收縮釋放空間、診斷增長根因、配置自動管理到架構級根治的分級解決方案,並嚴格標註高風險操作的禁忌與替代方案。
前提:資料庫處於線上、可接受短暫效能衝擊、有完整備份可恢復
-- 1. 切換至簡單復原模式(截斷非活躍 VLF)
ALTER DATABASE [YourDB] SET RECOVERY SIMPLE WITH NO_WAIT;
GO
-- 2. 收縮記錄檔至目標大小 (單位: MB,建議保留 20-50% 頭部空間)
DBCC SHRINKFILE (N'YourDB_Log', 1024); -- 目標 1GB
GO
-- 3. 立即切回完整復原模式(生產環境必須)
ALTER DATABASE [YourDB] SET RECOVERY FULL WITH NO_WAIT;
GO
-- 4. 立即執行完整備份 + 記錄備份,重新啟動備份鏈
BACKUP DATABASE [YourDB] TO DISK = 'D:\Backup\YourDB_Full.bak' WITH COMPRESSION, INIT;
BACKUP LOG [YourDB] TO DISK = 'D:\Backup\YourDB_Log.trn' WITH COMPRESSION;
GO
-- 1. 立即執行記錄備份(截斷非活躍 VLF)
BACKUP LOG [YourDB] TO DISK = 'D:\Backup\YourDB_Emergency_Log.trn' WITH COMPRESSION, INIT;
GO
-- 2. 收縮記錄檔
DBCC SHRINKFILE (N'YourDB_Log', 1024);
GO
-- 3. 驗證 VLF 狀態
DBCC LOGINFO([YourDB]); -- 觀察 Status=0 (非活躍) 的 VLF 數量
GO
| 禁忌操作 | 風險後果 | 正確替代方案 |
|---|---|---|
| 直接刪除 .ldf 檔案後附加資料庫 | 資料庫進入 SUSPECT/RECOVERY_PENDING,可能導致資料遺失、無法啟動 | 方法 A/B 正規收縮流程 |
| DETACH 資料庫 → 刪除 LDF → ATTACH 單一 MDF | 同上,且破壞交易一致性,違背 ACID | 方法 A/B 正規收縮流程 |
| 設定 MAXSIZE 限制記錄檔增長 | 記錄寫滿後所有寫入操作失敗,應用程式大面積報錯 | 設定合理 FILEGROWTH (固定 MB,非百分比) + 監控告警 |
| 啟用 AUTO_SHRINK (自動收縮) | 碎片化嚴重、效能抖動、鎖衝突、計畫快取清空 | 定時維護計畫手動收縮 + 固定增長增量 |
SELECT
name AS DatabaseName,
recovery_model_desc AS RecoveryModel,
log_reuse_wait_desc AS LogReuseWaitReason, -- 關鍵欄位!
CASE
WHEN log_reuse_wait_desc = 'LOG_BACKUP' THEN '需執行記錄備份'
WHEN log_reuse_wait_desc = 'ACTIVE_TRANSACTION' THEN '長時間執行的交易未提交/回滾'
WHEN log_reuse_wait_desc = 'DATABASE_MIRRORING' THEN '鏡像同步延遲'
WHEN log_reuse_wait_desc = 'REPLICATION' THEN '複寫發佈者/訂閱者延遲'
WHEN log_reuse_wait_desc = 'AVAILABILITY_REPLICA' THEN 'AG 次要副本同步延遲'
ELSE log_reuse_wait_desc
END AS ActionRequired
FROM sys.databases
WHERE database_id > 4; -- 排除系統資料庫
| log_reuse_wait_desc | 根因 | 解決方案 |
|---|---|---|
| LOG_BACKUP | 完整復原模式下從未做記錄備份,或備份頻率過低 | 建立記錄備份作業,每 15-60 分鐘一次 |
| ACTIVE_TRANSACTION | 長跑交易 (大批次 UPDATE/DELETE/INDEX REBUILD) 未結束 | 拆分大批次操作、優化長跑查詢、避開業務高峰 |
| REPLICATION | 交易複寫發佈者記錄讀取器代理程式停止/延遲 | 監控複寫代理程式狀態、重新啟動失敗代理 |
| AVAILABILITY_REPLICA | AlwaysOn AG 同步提交模式下次要副本同步緩慢 | 檢查網路/磁碟瓶頸、考慮非同步提交 (數據遺失風險) |
| CHECKPOINT | 簡單模式下檢查點未觸發 (極少見) | 手動執行 CHECKPOINT 或檢查磁碟 I/O |
-- 錯誤示範: 10% 增長 (增長量越來越大,導致長時間 I/O 凍結)
-- 正確示範: 固定 512MB/1GB 增長,預先分配足夠空間
ALTER DATABASE [YourDB] MODIFY FILE (
NAME = N'YourDB_Log',
SIZE = 8192MB, -- 初始 8GB,預估峰值 1.5 倍
MAXSIZE = UNLIMITED, -- 不設上限,靠監控告警控制
FILEGROWTH = 512MB -- 固定增長,避免百分比陷阱
);
-- 記錄檔使用率監控 (納入 SQL Agent 作業,每 5 分鐘執行)
SELECT
DB_NAME(database_id) AS DBName,
CAST(FILEPROPERTY(name, 'SpaceUsed') * 8.0 / 1024 AS DECIMAL(10,2)) AS UsedMB,
CAST(size * 8.0 / 1024 AS DECIMAL(10,2)) AS TotalMB,
CAST(FILEPROPERTY(name, 'SpaceUsed') * 100.0 / size AS DECIMAL(5,2)) AS UsedPct
FROM sys.master_files
WHERE type_desc = 'LOG' AND database_id > 4
AND CAST(FILEPROPERTY(name, 'SpaceUsed') * 100.0 / size AS DECIMAL(5,2)) > 75; -- 閾值 75%
-- 結果寫入監控表 + 發送郵件/企業微信告警
DBCC LOGINFO),過多 (>1000) 時規劃收縮重建SELECT log_reuse_wait_desc FROM sys.databases WHERE name='YourDB' 判斷根因DBCC OPENTRAN 找出長跑交易 → 評估 KILL 風險後終止DBA 金玉良言:記錄檔暴增從來不是「突發」,而是「長期疏忽」的必然結果。建立「預先分配空間 + 固定增長增量 + 高頻記錄備份 + 自動化監控」四位一體的管理體系,才能徹底告別半夜被叫醒的噩夢。