Sql-Server

MSSQL TempDb 已滿

  • July 23, 2020

我的 MSSQL 集群有問題。切換到 SQL Server 2016(從 2014 年開始)時,tempdb 出現錯誤,該 tempdb 在一段時間後已滿,沒有明顯原因。

是否有一種行之有效的方法來監控或避免這種行為?因為每次tempdb滿了,整個伺服器都不工作,拒絕每一個查詢。

發生錯誤時唯一有效的解決方案是增加 tempdb 日誌和 temdb dev 文件。目前,700 GB 數據庫的 tempdb 大小約為 90 GB。

感謝所有可以提供幫助的人!

是否有一種行之有效的方法來監控或避免這種行為?

TempDB 在許多方面都像任何其他數據庫一樣,因此可以監視諸如分配和使用的空間等指標並根據這些指標發出警報的監視工具也可用於監視 TempDB。作為該執行的快速證明

USE tempdb
EXEC sp_spaceused

在 SSMS 中。

目前,700 GB 數據庫的 tempdb 大小約為 90 GB。

如果 TempDB 像這樣不斷增長並且空間仍然使用(不僅僅是已分配),這聽起來像是暫時的,因為您需要增加分配才能繼續前進,那麼聽起來您已經長時間執行,可能被阻塞,在 TempDB 中保存大量數據的會話。您可以在這種時候使用諸如sp_whoisactive之類的診斷工具(在應用程序數據庫中執行,而不是在 tempdb 中執行)來列出您遇到問題時的活動會話。來自 sp_whoisactive 的文件:

$$ tempdb_allocations $$列直接從與 tempdb 相關的 DMV 收集,並指示由於臨時表、LOB 類型、假離線或其他使用者而在 tempdb 中分配了多少頁。這$$ tempdb_current $$列是通過從分配數中減去 tempdb DMV 報告的已釋放頁面資訊來計算的。看到少量目前頁面的大量分配意味著您的查詢可能會猛烈抨擊 tempdb,但不會導致它增長。查看大量目前頁面意味著您的查詢可能對您一直注意到的所有這些自動增長負責。

如果您發現一個問題會話(或多個問題會話),則它的sql_text輸出sql_command使用預設選項執行,並且@get_full_inner_text=1, @get_outer_command=1可能有助於辨識在循環中執行或在您需要解決或停止的鎖定等待中陷入困境的程序並且沒有關閉(由於應用程序問題,或者人在 SSMS 等工具中打開連接)。

有很多事情可能導致會話以這種方式膨脹 TempDB(可能是一個錯誤,您有一個意外CROSS JOIN的假離線到 TempDB,隨著數據的增長,每次轉儲的大小都會變大,舉一個例子 - 我已經之前看到有人通過添加DISTINCT而不是實際解決錯誤/缺失的連接謂詞來“修復”它)。也可能是您有大量使用 TempDB 的並發會話,而不是一些錯誤的會話,而不是被鎖阻塞,由於 IO 爭用它們很簡單,需要花費大量時間才能完成 - 如果是這樣的話然後在由於 TempDB 變滿而導致事情停滯的準備階段,您會看到您的驅動器或網路受到攻擊。

釋放 TempDB 中的空間後,這些診斷資訊將不再有用,因此您需要查看其他內容,但根據您的描述,聽起來空間仍在分配,因此它正在嘗試根據需要增加空間。

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