The transaction log for database 'xxx' is fullautogrow 設定不當 (百分比增長、無上限)-- 1. 切換復原模式 (需獨佔或無活動交易)
ALTER DATABASE [MyDB] SET RECOVERY SIMPLE WITH NO_WAIT;
-- 2. 執行 CHECKPOINT 強制截斷非作用中 VLF
CHECKPOINT;
-- 3. 驗證日志空間使用率
DBCC SQLPERF(LOGSPACE); -- 查看 Log Space Used (%) 應大幅下降
原理:SIMPLE 模式下 CHECKPOINT 會標記非作用中虛擬日志檔 (VLF) 可重用,釋放邏輯空間。
-- 查看邏輯檔名
USE MyDB;
SELECT name, size/128.0 AS SizeMB FROM sys.database_files WHERE type_desc = 'LOG';
-- 假設邏輯名為 MyDB_Log
-- 收縮至目標大小 (如 500MB),需足夠可用空間
DBCC SHRINKFILE (N'MyDB_Log', 500); -- 單位 MB
-- 或使用 GUI:SSMS 右鍵資料庫 → 工作 → 收縮 → 檔案 → 記錄檔 → 釋放未使用空間
⚠️ 收縮後立即執行索引維護 (重建/重組),因收縮會產生嚴重碎片。
-- 1. 切回完整模式
ALTER DATABASE [MyDB] SET RECOVERY FULL;
-- 2. 立即完整備份 (建立新備份鏈起點)
BACKUP DATABASE [MyDB] TO DISK = 'N:\Backup\MyDB_FULL_POSTSHRINK.bak'
WITH COMPRESSION, CHECKSUM, STATS = 5;
-- 3. 立即記錄備份 (可選,縮短 RPO)
BACKUP LOG [MyDB] TO DISK = 'N:\Backup\MyDB_LOG_POSTSHRINK.trn'
WITH COMPRESSION, CHECKSUM;
-- 4. 確認排程記錄備份作業已啟用 (每 15-60 分鐘)
-- SQL Agent → 作業 → 檢查/建立 "Backup Log - MyDB" 作業
分離附加重建日志 (高風險,最後手段):
-- 1. 離線資料庫
ALTER DATABASE [MyDB] SET OFFLINE WITH ROLLBACK IMMEDIATE;
-- 或 SSMS 右鍵 → 工作 → 離線
-- 2. 分離
EXEC sp_detach_db 'MyDB';
-- 3. 重命名/刪除 .ldf 檔案 (備份副本以防萬一)
-- 4. 僅附加 .mdf (自動建立新 512KB/1MB 日志)
EXEC sp_attach_single_file_db @dbname = 'MyDB',
@physname = 'D:\Data\MyDB.mdf';
-- 5. 立即完整備份、切回 FULL、排程記錄備份
⚠️ **風險**:未提交交易遺失、資料庫可能標記為 SUSPECT、複寫/鏡像中斷。僅限無備份、無複寫、可接受資料遺失的極端情況。
| 措施 | 設定建議 |
|---|---|
| 復原模式 | 生產庫**必須 FULL**;唯讀/測試庫可 SIMPLE |
| 記錄備份頻率 | 每 15 分鐘 (高寫入) 至 1 小時 (低寫入) |
| 日志檔初始大小 | 預估峰值用量 1.5-2x,避免頻繁自動增長 |
| 自動增長設定 | 固定 MB (如 512MB/1GB),**非百分比**;設定 MAXSIZE 或無限制 |
| VLF 數量控制 | 大日志檔預先配置、避免大量小增長產生海量 VLF (影響啟動/備份/恢復速度) |
| 監控告警 | Log Space Used > 70% 告警;VLF > 1000 警告;自動增長頻率 > 1/天 警告 |
| 長交易偵測 | Extended Events / sp_WhoIsActive 監控 > 30 分鐘交易 |
BACKUP LOG ... WITH TRUNCATE_ONLY / NO_LOG:SQL 2008 已移除,無效SHRINKFILE):治標不治本、產生碎片、效能抖動MAXSIZE 限制日志大小:達上限後寫入失敗、資料庫掛起日志滿報警
│
├─→ 確認復原模式 = FULL 且無記錄備份排程?
│ ├─ 是 → 切 SIMPLE → CHECKPOINT → SHRINKFILE → 切 FULL → 完整備份 → 建立記錄備份排程
│ └─ 否 → 檢查長交易/複寫延遲/磁碟空間 → 針對性處理
│
└─→ 事後複盤:根因分析、修正配置、更新運行手冊
日志管理是 SQL Server DBA 的基本功。**預防永遠優於急救**,請今天就檢查您的記錄備份排程是否正常運行。