Sql-Server

TempDB 版本儲存清理

  • December 8, 2021

據我所知,版本儲存只會清理比最舊的活動事務更舊的版本。**問題:**如果有一個較舊的事務仍然處於活動狀態,那麼 SQL Server 是否會保留所有版本,不管數據庫是什麼,是最舊的事務數據庫嗎?

背景故事 - SQL Server 2005 SP4 Enterprise 託管大約 40 個數據庫。TempDB 目前為 102 GB,版本儲存約為 98 GB。託管在數據庫實例上的應用程序之一有一個基於 sys.dm…database_transactions 的 40 天前的未處理事務。兩個獨立的大型數據庫在上個月的使用量非常大,我們看到與這些操作一致的 TempDB 增長。我們預計會有一些增長。我們沒想到它會繼續增長。 **問題:**這兩個獨立數據庫中儲存在 TempDB 版本儲存中的版本是否仍然存在,因為第三個獨立數據庫具有 40 天前的連接並顯示打開的 transaction_state?

Perfmon 計數器:在我今天早上跟踪的幾個小時內,版本儲存不斷增長。版本生成速率 AVG 約為 30 kb/s,版本清理速率為 0 kb/s。

為 TempDB 留下了充足的空間,所有使用者數據庫的總數據文件大約為 300 GB,自上次重啟以來,TempDB 的 8 個數據文件中的每一個平均每天增長 350 MB。此行為異常,調查發現大版本儲存

評論問題的答案,以免評論部分長時間執行:

問:為什麼在 tempdb 上自動增長?答: TempDB 設置為以我們發現在大多數情況下都合適的大小進行初始化。我們允許自動增長以處理異常的數據庫活動。我們也監控汽車增長。

問:你怎麼知道事務是活動的,而不僅僅是活動的連接?A:transaction_state 表示在 sys.dm_tran_active_snapshot_database_transactions 和其他內容中處於活動狀態。活動監視器說每個連接都有 1 個打開的事務。

問:為什麼您的應用程序如此愚蠢?A:它的第三方。此實例中的眾多實例之一。我不知道行為是否異常,或者很容易修復。

解決

阻止任何版本儲存清理的開放事務*,*所以 Jon 是對的,版本儲存清理是獨立於數據庫完成的。關閉有問題的事務允許版本儲存清理開始。背後的目前理論來自 Jon Seigel

版本儲存只能根據整個實例中最舊的活動事務清除版本,以支持同時跨多個數據庫使用事務級快照隔離。

如果有人確定或可以證明這一點,請做

參考問題:find-transactions-that-are-filling-up-the-version-store

參考文件:

TempDB 2005 WP

Teratrax 調整 tempDB

Idera Demystify Tempdb

(注意:這不是 100% 確定的答案,而且我沒有參考資料,所以如果您能證明其他情況,請告訴我。)

版本儲存只能根據整個實例中最舊的活動事務清除版本,以支持同時跨多個數據庫使用事務級快照隔離。如果一個數據庫中的“舊”版本在另一個數據庫的快照事務中間被清除,那根本就行不通。

因此,如果有一個非常舊的打開事務,則版本儲存將無法清除,直到該事務送出或回滾。

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