執行長時間查詢/大量操作導致 tempdb 交易日誌填滿,報錯 9002。本文記錄實測有效的解決路徑:擴充日誌檔案初始大小與成長上限、清空日誌命令、收縮操作,並說明為何單純清空日誌無法根治。
伺服器: 訊息 9002,層級 17,狀態 2,行 1
資料庫 'tempdb' 的記錄已滿。請備份該資料庫的交易記錄以釋放一些記錄空間。
-- 1. 設定日誌檔無上限成長 (確認)
ALTER DATABASE [tempdb] MODIFY FILE (NAME = N'templog', MAXSIZE = UNLIMITED);
ALTER DATABASE [tempdb] MODIFY FILE (NAME = N'templog', FILEGROWTH = 10%);
-- 2. 關鍵:預先配置大尺寸初始空間 (如 1000MB = 1GB)
ALTER DATABASE [tempdb] MODIFY FILE (NAME = N'templog', SIZE = 1000);
ALTER DATABASE [tempdb] MODIFY FILE (NAME = N'tempdev', SIZE = 1000);
實測: 將初始大小從預設 8MB 直接調至 1000MB,問題即時解決,後續操作無日誌成長延遲。
-- 清空日誌 (舊版語法,2005+ 建議用 BACKUP LOG ... WITH NO_LOG 替代)
DUMP TRANSACTION tempdb WITH NO_LOG;
-- 截斷交易日誌 (同義)
BACKUP LOG tempdb WITH NO_LOG;
-- 收縮日誌檔案 (SSMS 圖形介面:右鍵資料庫 → 所有工作 → 收縮 → 檔案 → 選擇 templog)
DBCC SHRINKFILE (N'templog', 0, TRUNCATEONLY);
警告: 單純清空/收縮日誌無法根治,若負載持續,日誌會迅速再次填滿。必須配合「預先配置大尺寸初始空間」才能穩定。
FILEGROWTH = 512MB 或 1024MB,不使用百分比。DBCC SQLPERF(LOGSPACE) 關注 tempdb 日誌使用率 > 70% 即預警。tempdb 日誌滿是「空間預留不足」與「長交易阻礙截斷」的雙重結果,預先配置大尺寸初始空間是最高 ROI 的解決方案。