![为什么我的 tempdb 会被填满,什么原因导致它缩小?](https://linux22.com/image/546086/%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E7%9A%84%20tempdb%20%E4%BC%9A%E8%A2%AB%E5%A1%AB%E6%BB%A1%EF%BC%8C%E4%BB%80%E4%B9%88%E5%8E%9F%E5%9B%A0%E5%AF%BC%E8%87%B4%E5%AE%83%E7%BC%A9%E5%B0%8F%EF%BC%9F.png)
经过几个月的磁盘使用率平稳之后,我的 tempdb 文件在周末突然增长了几 GB。公司里没有人知道发生了什么变化。
当我检查 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.
我找不到任何可能的方法,让任何人在 tempdb(即 DB ID 2)上运行 DBCC SHRINKDATABASE。Microsoft 自己的文档说,SHRINKDATABASE 永远不应在 tempdb 联机时在其上运行,因此我无法想象 SQL Server 自己正在运行它。
我想弄清楚:
- 是什么原因导致 tempdb 文件突然快速增长?我不知道此服务器上有任何使用临时表或声明表变量的代码。还有什么使用 tempdb 文件?
- DBCC SHRINKDATABASE 为什么要在 tempdb 上运行,并且为什么它会失败?
答案1
首先,如果有人手动运行 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;
--
答案2
检查您的维护计划。有人可能手动更改或向服务器添加了维护计划。还要检查数据库的恢复模式是否最近更改。