每筆交易的**啟動、資料修改、提交/回滾**皆順序寫入記錄檔(LDF)。記錄包含:交易 ID、LSN (Log Sequence Number)、操作類型、前映像/後映像、頁面 ID、槽位等。SQL Server 採用 **WAL (Write-Ahead Logging)**:記錄先寫入記錄檔(硬化到磁碟),再由 Checkpoint 背景執行緒將髒頁寫入資料檔 (MDF/NDF)。
實體記錄檔內部分割為多個 VLF。截斷 只標記 VLF 為「非作用中」,**不釋放磁碟空間**。截斷觸發條件:
壓縮 才真正釋放作業系統空間(移除檔案尾端未使用的 VLF)。
-- 壓縮整個資料庫(含資料檔) DBCC SHRINKDATABASE (DBName, TRUNCATEONLY); -- 僅釋放尾端空間,不移動頁面 -- 壓縮特定記錄檔 DBCC SHRINKFILE (DBName_Log, 1024); -- 目標大小 1GB,單位 MB
最佳實踐:先 `BACKUP LOG` 觸發截斷,再 `SHRINKFILE` 至合理大小(如預估高峰期記錄量的 1.5-2 倍)。**避免排程自動壓縮**(`AUTO_SHRINK ON`),會造成索引碎片、CPU 飆升、效能抖動。
| 模式 | 記錄備份 | 時間點還原 | 適用場景 |
|---|---|---|---|
| 簡單 | 不支援 | 不支援 | 開發/測試、資料可重建、RPO ≥ 1 天 |
| 完整 | 必要 | 支援 | 生產環境、RPO 分鐘級、需時間點還原 |
| 大量記錄 | 必要 | 支援(大量作業除外) | 大量匯入/索引重建期間臨時切換,降低記錄量 |
| 症狀 | 可能原因 | 對策 |
|---|---|---|
| 記錄檔暴增佔滿磁碟 | 長交易、未備份記錄、複寫/鏡像延遲、CDC 滯後 | 查 `log_reuse_wait_desc`,針對性處理(提交/回滾長交易、補記錄備份、修復複寫) |
| 還原 `WITH NORECOVERY` 卡住 | 記錄鏈斷裂、LSN 不連續 | 補齊遺漏的記錄備份,或從完整備份重新開始 |
| `SHRINKFILE` 不縮小 | 尾端 VLF 仍作用中、最小檔案尺寸限制 | 先 `BACKUP LOG`,確認 `DBCC LOGINFO` 尾端 Status=0,再壓縮 |
設定主/備伺服器 + 監視伺服器,自動備份/複製/還原記錄檔。備份資料庫處於 `STANDBY/NORECOVERY` 狀態,可供唯讀報表查詢。若主庫失效,手動/自動切換至備庫(需人工介入除非搭配叢集)。
交易記錄檔是 SQL Server 復原的核心。理解「寫入 → 截斷 → 壓縮」生命週期、選對復原模式、固定檔案大小與成長、專屬儲存裝置、監控 `log_reuse_wait_desc`,即可避開 90% 的記錄檔惡夢。