Sql-Server

TempDB 日誌文件中使用了無法解釋的持續空間

  • December 18, 2020

幾天前,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選項才能看到這些。這是內置文件的摘錄:

show_sleeping_spids 選項說明截圖

如果使用的tempdb日誌空間實際上是可回收的,但 SQL Server 中的故障阻止它清除,是否可以執行 T-SQL 命令來嘗試釋放日誌中的可用空間?

不是我能想到的。您可以嘗試發出CHECKPOINT, 來強制清除 VLF:

USE [tempdb];
GO
CHECKPOINT;

引用自:https://dba.stackexchange.com/questions/281543