Почему мой tempdb заполнился, и что пыталось уменьшить его?

После нескольких месяцев использования абсолютно плоского диска мой файл 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). В собственной документации Microsoft говорится, что SHRINKDATABASE никогда не следует запускать на базе данных tempdb, пока он находится в сети, поэтому я не могу себе представить, что SQL-сервер сам его запускает.

Я пытаюсь выяснить:

  • Что могло вызвать такой внезапный быстрый рост файла tempdb? Я не знаю ни одного кода, который использует временные таблицы или объявляет переменные таблицы на этом сервере. Что еще использует файл tempdb?
  • Почему DBCC SHRINKDATABASE вообще работает на базе данных tempdb и почему он не работает?

2 ответа

Решение

Сначала я бы проверил трассировку по умолчанию, если кто-то вручную запускает команду DBCC SHRINKDATABASE. Следующий код поможет вам, поскольку stmt DBCC проверяется в трассировке по умолчанию. Вы можете поделиться своим 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; 
--

Проверьте свои планы обслуживания. Кто-то может вручную изменить или добавить один на сервер. Также проверьте, был ли режим восстановления вашей базы данных недавно изменен.

Другие вопросы по тегам