執行大量資料操作時,常遇到錯誤:訊息 9002,層級 17,狀態 2:資料庫 'tempdb' 的記錄檔已滿。請備份該資料庫的交易記錄檔以釋放一些記錄檔空間。 本文記錄真實排查過程,從症狀分析到根因修復,提供可落地的解決方案。
DUMP TRANSACTION tempdb WITH NO_LOG、BACKUP LOG tempdb WITH NO_LOG、收縮日誌 —— 均無效。-- 將 tempdb 資料檔與日誌檔一次擴大至預估峰值 (例:3000 MB)
USE master;
GO
ALTER DATABASE [tempdb] MODIFY FILE (NAME = N'tempdev', SIZE = 3000MB);
ALTER DATABASE [tempdb] MODIFY FILE (NAME = N'templog', SIZE = 3000MB);
GO
一次配置足夠空間,避免運行期自動增長抖動。
ALTER DATABASE [tempdb] MODIFY FILE (NAME = N'templog', FILEGROWTH = 512MB); -- 固定增長,避免 10% 指數膨脹
ALTER DATABASE [tempdb] MODIFY FILE (NAME = N'templog', MAXSIZE = UNLIMITED); -- 確保無上限
-- 依 CPU 核心數建立多個資料檔,均勻分布
ALTER DATABASE [tempdb] ADD FILE (NAME = N'tempdev2', FILENAME = 'F:\MSSQL\Data\tempdev2.ndf', SIZE = 1000MB, FILEGROWTH = 512MB);
ALTER DATABASE [tempdb] ADD FILE (NAME = N'tempdev3', FILENAME = 'G:\MSSQL\Data\tempdev3.ndf', SIZE = 1000MB, FILEGROWTH = 512MB);
-- ... 以此類推
-- 截斷日誌(Simple 模式下等同 CHECKPOINT + 收縮)
DBCC SHRINKFILE (N'templog', 0, TRUNCATEONLY);
-- 注意:頻繁收縮會產生碎片,平時禁止,僅限緊急
sys.dm_db_log_space_usage 追蹤 tempdb 日誌使用率。Database Log File Auto Growth 事件頻發時通知 DBA。sys.dm_tran_active_transactions 找出長跑交易。tempdb 日誌滿本質是產生速度 > 增長/截斷速度。一次性擴大初始檔案、固定增長增量、多檔案佈局、分批提交業務交易,四管齊下可徹底根治。切記:收縮日誌只能救急,不能當常規手段。