Sql-Server-2005

為什麼我的 tempdb 填滿了,是什麼試圖縮小它?

  • April 12, 2011

經過幾個月完全平坦的磁碟使用後,我的 tempdb 文件在周末突然增長了幾場演出。公司裡沒有人知道任何可能發生的變化。

當我檢查 tempdb 數據庫時,它只有幾個非常小的表,其名稱是十六進制數字字元串。

在尋找原因的過程中,我發現在事件日誌中每隔幾分鐘就會重複出現以下消息,持續了幾天:

DBCC SHRINKDATABASE for database ID 2 is waiting for the snapshot transaction 
with timestamp 51743762409 and other snapshot transactions linked to timestamp 
51743762409 or with timestamps older than 51801253540 to finish.

我找不到任何可能的方式 DBCC SHRINKDATABASE 可以由 tempdb(即 DB ID 2)上的任何人執行。微軟自己的文件說 SHRINKDATABASE 永遠不應該在 tempdb 線上時執行,所以我無法想像 SQL 伺服器自己執行它。

我試圖弄清楚:

  • 是什麼導致 tempdb 文件突然快速增長?我不知道任何使用臨時表或在此伺服器上聲明表變數的程式碼。還有什麼使用 tempdb 文件?
  • 為什麼 DBCC SHRINKDATABASE 完全在 tempdb 上執行,為什麼會失敗?

首先,如果有人手動執行 DBCC SHRINKDATABASE 命令,我會檢查預設跟踪。以下程式碼將對您有所幫助,因為 DBCC stmt 在預設跟踪中被審計。你能分享你的 SELECT @@VERSION 嗎?

DECLARE @filename VARCHAR(255) 
SELECT @FileName = SUBSTRING(path, 0, LEN(path)-CHARINDEX('\', REVERSE(path))+1) + '\Log.trc'  
FROM sys.traces   
WHERE is_default = 1;  

SELECT gt.HostName, 
      gt.ApplicationName, 
      gt.NTUserName, 
      gt.NTDomainName, 
      gt.LoginName, 
      gt.SPID, 
      gt.EventClass, 
      te.Name AS EventName,
      gt.EventSubClass,      
      gt.TEXTData, 
      gt.StartTime, 
      gt.EndTime, 
      gt.ObjectName, 
      gt.DatabaseName, 
      gt.FileName, 
      gt.IsSystem
FROM [fn_trace_gettable](@filename, DEFAULT) gt 
JOIN sys.trace_events te ON gt.EventClass = te.trace_event_id 
WHERE EventClass in (116) --AND gt.EventSubClass = 2
ORDER BY StartTime DESC; 

下面將告訴您數據和日誌文件是否最近增長,並且可以幫助確定原因?

DECLARE @filename VARCHAR(255) 
SELECT @FileName = SUBSTRING(path, 0, LEN(path)-CHARINDEX('\', REVERSE(path))+1) + '\Log.trc'  
FROM sys.traces   
WHERE is_default = 1;  

--Check if the data and log files auto-growed. Look for tempdb, log files etc.
SELECT 
   gt.ServerName
   , gt.DatabaseName
   , gt.TextData
   , gt.StartTime
   , gt.Success
   , gt.HostName
   , gt.NTUserName
   , gt.NTDomainName
   , gt.ApplicationName
   , gt.LoginName
FROM [fn_trace_gettable](@filename, DEFAULT) gt 
JOIN sys.trace_events te ON gt.EventClass = te.trace_event_id 
WHERE EventClass in ( 92, 93 ) --'Data File Auto Grow', 'Log File Auto Grow'
ORDER BY StartTime; 
--

引用自:https://serverfault.com/questions/258841