TempDB 日誌文件中使用了無法解釋的持續空間
幾天前,
tempdb
數據和日誌文件中的已用空間量開始迅速增長。30 分鐘後,tempdb
日誌保持大約 99% 的空間使用了大約 7 小時。在 7 小時周期快結束時,在 3 秒內I:\Databases\templog.ldf: Operating system error 112(There is not enough space on the disk.) encountered.
記錄了大約 30 個實例The transaction log for database 'tempdb' is full due to 'ACTIVE_TRANSACTION'
,然後tempdb
日誌文件突然恢復到 1% 的已用空間。此使用情況數據通過 SQL 代理作業每 3 分鐘記錄在日誌中。我還有一個
sp_WhoIsActive
每 1 分鐘執行一次並擷取輸出的 SQL 代理作業。我在此數據中沒有看到任何突出的內容來解釋tempdb
. 有一些維護作業一次執行幾分鐘,通常每個執行時間不超過 5 或 10 分鐘。 即使其中一個作業或另一個會話用完tempdb
日誌空間,我也希望在任何事務完成後或至少在會話結束後可以回收空間。
- 它是專用於
tempdb
數據和日誌文件的 200 GB 驅動器。- 在此期間數據和日誌文件都在增長,直到磁碟上沒有更多空間。
- 有一個
tempdb_2.ndf
我不記得以前看過的文件(也許它一直都在那裡……)。tempdb.mdf
並且tempdb_2.ndf
大小相同,每個大約 29 GB。templog.ldf
正在使用 137 GB。- 執行 Microsoft SQL Server 2017 (RTM-CU15-GDR) (KB4505225) - 14.0.3192.2 (X64)
我試圖了解發生了什麼以及如何再次防止它。
tempdb
即使沒有會話在任何地方執行這麼長時間,日誌空間是否有可能在數小時內無法回收?- 是什麼原因導致
tempdb
在出現上述錯誤消息後 3 秒後使用的日誌空間突然釋放(磁碟空間不足且tempdb
事務日誌已滿)?sp_WhoIsActive
日誌記錄不足以擷取哪些程序佔用了tempdb
日誌空間,我還能做哪些其他額外的日誌記錄?- 如果使用的
tempdb
日誌空間實際上是可回收的,但 SQL Server 中的故障阻止它清除,是否可以執行 T-SQL 命令來嘗試釋放日誌中的可用空間?任何想法或建議都非常感謝。
tempdb
即使沒有會話在任何地方執行這麼長時間,日誌空間是否有可能在數小時內無法回收?雖然這可能是可能的,但我會說在正常情況下答案是否定的。在沒有長時間執行的事務或長期會話的情況下,
tempdb
日誌應該很快清除。是什麼原因導致
tempdb
在出現上述錯誤消息後 3 秒後使用的日誌空間突然釋放(磁碟空間不足且tempdb
事務日誌已滿)?最可能的解釋是有一個長期執行的事務。最終遇到這個錯誤,被殺掉,讓日誌空間得以釋放。
sp_WhoIsActive
日誌記錄不足以擷取哪些程序佔用了tempdb
日誌空間,我還能做哪些其他額外的日誌記錄?我希望能夠捕捉到它。可能導致您錯過的一件事是,如果程序在事務中執行了語句,然後就停止做任何事情(沒有送出、回滾或斷開連接)。
如果有人在 SSMS 中使用大量
tempdb
. 預設情況下,這些查詢(持有資源,但不主動做任何事情)不會出現sp_WhoIsActive
。您需要添加@show_sleeping_spids = 2
選項才能看到這些。這是內置文件的摘錄:如果使用的
tempdb
日誌空間實際上是可回收的,但 SQL Server 中的故障阻止它清除,是否可以執行 T-SQL 命令來嘗試釋放日誌中的可用空間?不是我能想到的。您可以嘗試發出
CHECKPOINT
, 來強制清除 VLF:USE [tempdb]; GO CHECKPOINT;