После месяцев использования идеально ровного диска мой файл 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-сервер запускает его сам.
Я пытаюсь понять:
Сначала я бы проверил трассировку по умолчанию, если кто-то вручную запускает команду 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;
--
Проверьте свои планы обслуживания. Кто-то мог вручную изменить или добавить его на сервер. Также проверьте, был ли недавно изменен режим восстановления вашей базы данных.