當交易記錄檔 (LDF) 佔滿磁碟、導致資料庫掛起、備份失敗時,正確的截斷與收縮操作能化險為夷。**錯誤操作可能導致資料遺失、備份鏈斷裂、資料庫損毀。** 本文依據 Microsoft 官方最佳實務,提供分級操作指南與風險管控。
| 操作 | 作用 | 檔案大小 | 備份鏈影響 |
|---|---|---|---|
| 截斷 | 標記非作用中 VLF (Virtual Log Files) 可重複使用,釋放邏輯空間 | **不變** (物理檔案大小不變) | 正常備份後自動發生,不影響 |
| 收縮 | 釋放檔案末端未使用頁面給作業系統,減小物理檔案 | **減小** | 不影響,但頻繁收縮導致碎片、效能劣化 |
-- 完整復原模式:必須定期記錄備份
BACKUP LOG [DatabaseName] TO DISK = 'D:\Backup\DB_Log.trn'
WITH COMPRESSION, CHECKSUM;
-- 簡單復原模式:檢查點自動截斷,無需手動干預
-- 檢查記錄空間使用率
DBCC SQLPERF(LOGSPACE);
原則: 完整復原模式下,**定期記錄備份是唯一正確的截斷方式**。若記錄檔持續增長,檢查:備份作業是否失敗、是否有長時間執行交易、複寫/鏡像/CDC/可用性群組是否阻礙截斷 (`log_reuse_wait_desc`)。
-- 簡單復原模式下強制截斷 (等同 CHECKPOINT)
DBCC SHRINKFILE (N'DatabaseName_Log', 1); -- 目標大小 1MB,實際以可縮最小為準
-- 或舊版語法 (已棄用)
-- DUMP TRANSACTION DatabaseName WITH NO_LOG;
-- BACKUP LOG DatabaseName WITH NO_LOG;
⚠️ 警告: `WITH NO_LOG` / `WITH TRUNCATE_ONLY` **已在 SQL Server 2008 移除**,使用會破壞完整復原模式下的備份鏈,**嚴禁用於生產環境完整復原模式資料庫**。
-- 1. 確認可收縮空間
DBCC SQLPERF(LOGSPACE); -- 查看 Log Space Used %
-- 2. 收縮記錄檔至目標大小 (單位 MB)
DBCC SHRINKFILE (N'DatabaseName_Log', 500); -- 目標 500 MB
-- 3. 驗證結果
DBCC SQLPERF(LOGSPACE);
最佳實務:
SELECT name, log_reuse_wait_desc, recovery_model_desc
FROM sys.databases
WHERE name = 'DatabaseName';
| log_reuse_wait_desc | 含義 | 解決方向 |
|---|---|---|
| LOG_BACKUP | 需記錄備份 | 執行 BACKUP LOG、檢查備份作業 |
| ACTIVE_TRANSACTION | 長時間執行交易 | 優化/終止長交易、避免隱式交易 |
| REPLICATION | 複寫尚未複寫 | 檢查 Log Reader Agent、發行集狀態 |
| DATABASE_MIRRORING | 鏡像同步延遲 | 檢查鏡像夥伴連線、網路頻寬 |
| AVAILABILITY_REPLICA | 可用性群組次要複本同步 | 檢查同步模式、網路、負載 |
| CHECKPOINT | 簡單模式下無檢查點 | 執行 CHECKPOINT、檢查資料庫狀態 |
-- 查看檔案 ID 與可用空間
SELECT file_id, name, size/128.0 AS Size_MB, size/128.0 - FILEPROPERTY(name,'SpaceUsed')/128.0 AS Free_MB
FROM sys.database_files;
-- 收縮資料檔 (指定檔案 ID)
DBCC SHRINKFILE (1, 2000); -- 目標 2000 MB
-- 或收縮整個資料庫 (不建議,無法精確控制)
-- DBCC SHRINKDATABASE (DatabaseName, 20); -- 目標 20% 剩餘空間
資料檔收縮副作用: 大量頁面移動導致**嚴重索引碎片**,收縮後**必須重建/重組索引** (`ALTER INDEX ... REBUILD/REORGANIZE`),否則查詢效能大幅下降。