web-dev-qa-db-ja.com

tempdbがいっぱいになったのはなぜですか?また、何がそれを縮小しようとしていたのですか?

何ヶ月にもわたって完全にフラットなディスクを使用した後、私のtempdbファイルは週末に数ギガずつ突然大きくなりました。会社の誰も、変更された可能性のあることを認識していません。

Tempdbデータベースを確認したところ、非常に小さなテーブルがいくつかあり、その名前は16進数の文字列でした。

原因を検索したところ、イベントログに次のメッセージが数分おきに数日間繰り返されていることがわかりました。

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)の誰かによって実行された可能性のある方法を見つけることができません。 Microsoftの独自のドキュメントによると、SHRINKDATABASEはオンライン中にtempdbで実行してはならないため、SQLサーバー自体が実行しているとは想像できません。

私は理解しようとしています:

  • Tempdbファイルのこのような突然の急激な増加を引き起こした可能性があるのは何ですか?このサーバーで一時テーブルを使用したり、テーブル変数を宣言したりするコードを認識していません。他に何がtempdbファイルを使用しますか?
  • DBCC SHRINKDATABASEがtempdbで実行されているのはなぜですか?また、失敗しているのはなぜですか?
2
Josh

まず、誰かがDBCC SHRINKDATABASEコマンドを手動で実行している場合は、デフォルトのトレースを確認します。次のコードは、DBCCstmtがデフォルトのトレースで監査されるときに役立ちます。 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; 
--
1
Sankar Reddy

メンテナンス計画を確認してください。誰かが手動でサーバーを変更または追加した可能性があります。また、データベースのリカバリモードが最近変更されたかどうかも確認してください。

0
Joel Coel