錯誤 9002 / 1105:The transaction log for database 'xxx' is full。資料庫停止接受寫入,業務癱瘓。本文系統梳理 7 大根因、即時緩解步驟、長效容量規劃與監控體系。
| # | 根因 | 典型徵兆 | 驗證查詢 |
|---|---|---|---|
| 1 | 長時間未執行記錄備份 (完整/大量記錄模式) | log_reuse_wait_desc = LOG_BACKUP | SELECT name, log_reuse_wait_desc FROM sys.databases |
| 2 | 長跑交易未提交/回滾 | log_reuse_wait_desc = ACTIVE_TRANSACTION | DBCC OPENTRAN; sys.dm_tran_active_transactions |
| 3 | 大量批次操作 (BULK INSERT/大量 UPDATE/DELETE) | 單次交易產生大量記錄 | 查詢計劃 + sys.dm_exec_requests |
| 4 | 檢查點無法推進 (簡單模式) | log_reuse_wait_desc = CHECKPOINT | 錯誤日誌檢查 checkpoint 失敗 |
| 5 | 異步鏡像/可用性群組同步延遲 | log_reuse_wait_desc = DATABASE_MIRRORING / AVAILABILITY_REPLICA | sys.database_mirroring / sys.availability_replicas |
| 6 | 複寫發佈端記錄讀取器延遲 | log_reuse_wait_desc = REPLICATION | Replication Monitor / sys.dm_repl_tranhash |
| 7 | 自動成長受限或磁碟空間耗盡 | max_size 達上限 / 磁碟剩餘不足 | sys.master_files / 磁碟管理員 |
-- A. 簡單模式:強制檢查點截斷
CHECKPOINT;
-- 或
DBCC FREEPROCCACHE; -- 釋放計劃快取間接協助
-- B. 完整/大量記錄模式:立即執行記錄備份 (無壓縮、無加密最快)
BACKUP LOG [DBName] TO DISK = 'NUL:'; -- 極端情況丟棄記錄,破壞備份鏈,謹慎使用!
-- 正規做法
BACKUP LOG [DBName] TO DISK = 'D:\Backup\DBName_Log_Emergency.trn' WITH COMPRESSION;
-- C. 臨時擴充記錄檔 (若磁碟尚有空間)
ALTER DATABASE [DBName] MODIFY FILE (NAME = 'DBName_Log', SIZE = 10GB, MAXSIZE = 50GB, FILEGROWTH = 1GB);
KILL 並通知應用端重試FILEGROWTH = 1GB (非百分比),減少成長頻率SELECT
DB_NAME(database_id) AS DBName,
(size * 8.0 / 1024) AS LogSizeMB,
(FILEPROPERTY(name, 'SpaceUsed') * 8.0 / 1024) AS UsedMB,
log_reuse_wait_desc
FROM sys.master_files
WHERE type_desc = 'LOG';
sys.dm_db_file_space_usage建立「記錄備份 → 容量監控 → 告警 → 自動擴容」閉環,將交易記錄視為核心資產持續管理,而非事後救火。