Недавно я унаследовал ответственность за администрирование экземпляра TFS, но у меня нет предыдущего опыта. База данных для командного проекта, кажется, ненормально выросла за последние 6 месяцев, и чтение всего, что я могу найти, помогло мне (я думаю) определить виновника, но я не знаю, что делать. Любая помощь будет оценена.
Я выполнил запросы, которые широко доступны, например этот:
SELECT TOP 3 o.name,
SUM(reserved_page_count) * 8.0 / 1024 SizeInMB,
SUM(CASE
WHEN p.index_id <= 1 THEN p.row_count
ELSE 0
END) Row_Count
FROM sys.dm_db_partition_stats p
JOIN sys.objects o
ON p.object_id = o.object_id
GROUP BY o.name
ORDER BY SUM(reserved_page_count) DESC
Чтобы найти это:
name SizeInMB Row_Count
tbl_Content 313489.765625 10090278
tbl_Version 33400.828125 27518951
tbl_AggregateMap 10638.539062 32955145
И этот другой запрос тоже:
SELECT Owner =
CASE
WHEN OwnerId = 0 THEN 'Generic'
WHEN OwnerId = 1 THEN 'VersionControl'
WHEN OwnerId = 2 THEN 'WorkItemTracking'
WHEN OwnerId = 3 THEN 'TeamBuild'
WHEN OwnerId = 4 THEN 'TeamTest'
WHEN OwnerId = 5 THEN 'Servicing'
WHEN OwnerId = 6 THEN 'UnitTest'
WHEN OwnerId = 7 THEN 'WebAccess'
WHEN OwnerId = 8 THEN 'ProcessTemplate'
WHEN OwnerId = 9 THEN 'StrongBox'
WHEN OwnerId = 10 THEN 'FileContainer'
WHEN OwnerId = 11 THEN 'CodeSense'
WHEN OwnerId = 12 THEN 'Profile'
WHEN OwnerId = 13 THEN 'Aad'
WHEN OwnerId = 14 THEN 'Gallery'
WHEN OwnerId = 15 THEN 'BlobStore'
WHEN OwnerId = 255 THEN 'PendingDeletion'
END,
SUM(CompressedLength) / 1024.0 / 1024.0 AS BlobSizeInMB
FROM tbl_FileReference AS r
JOIN tbl_FileMetadata AS m
ON r.ResourceId = m.ResourceId
AND r.PartitionId = m.PartitionId
WHERE r.PartitionId = 1
GROUP BY OwnerId
ORDER BY 2 DESC
Найти
Owner BlobSizeInMB
CodeSense 264426.749071121093
VersionControl 8728.462930678710
TeamTest 477.505887984375
ProcessTemplate 2.953623771484
FileContainer 0.024445533203
И хотя VersionControl = 8GB кажется совершенно нормальным, учитывая наш код, CodeSense безумно большой. Я нигде не нашел информации об этой функции или о том, как ее отключить. Пожалуйста помоги!
PS: Если это связано с функцией CodeLens в VS, мы ее тоже не используем.
Эта функция называется CodeIndex, поэтому я не мог ее найти раньше.
Вот вся информация, необходимая для его настройки: https://docs.microsoft.com/en-us/visualstudio/ide/codeindex-command?view=vs-2015
Я выключил его и сейчас пытаюсь уничтожить индекс, но он выдает ошибку
TF246018: Операция с базой данных превысила лимит тайм-аута и была отменена. Убедитесь, что параметры операции верны.
Но это уже другая проблема ...
РЕДАКТИРОВАТЬ: Вот что случилось. Я проверил средство просмотра событий на уровне приложения и обнаружил, что истекло время ожидания:
EXEC CodeSense.prc_DeleteAggregates @partitionId=1
Я проверил SP, и он сделал 3 вещи
prc_iPrepareExecution
который ничего не делает: RETURN 0
[CodeSense].[tbl_AggregatorInputQueue]
где @partitionId
равно 1. Таблица была пуста, поэтому делать там нечего.[CodeSense].[tbl_AggregateMap]
где @partitionId
равно 1. Я запросил БД и обнаружил, что не было строк с другими идентификаторами разделов. Кроме того, SELECT COUNT(*)
на завершение уходило более 5 минут, поэтому я отменил его, и тут меня осенило: Я мог бы просто усечь таблицу, потому что единственный partitionId в моем случае равен 1. Это спасло меня от засорения диска кучей бесполезных журналов транзакций и удаления данных партиями.Конечно, я обрезал его, но из неумеренности я перезапустил TFSConfig CodeIndex /destroyCodeIndex
в моей коллекции, и на этот раз это сработало.
Однако, когда я вернулся на уровень db, чтобы восстановить свое, предположительно, пустое пространство: оно еще не было бесплатным.
Я вернулся в журнал событий и обнаружил EXEC CodeSense.prc_DeleteOrphanedFiles @partitionId=1,@createdBefore=03/17/2019 21:05:28
на этот раз тайм-аут!
Этот SP создает в памяти таблицу вещей, которые нужно удалить, а затем удаляет их. Я создал копию этого SP с TOP 100000
, чтобы ограничить количество строк, удаляемых за раз, и запускал его несколько раз, пока не избавился от 2M + строк.
Однако в какой-то момент за очистку таблиц должно отвечать что-то еще. tbl_FileReference
, tbl_FileMetadata
и особенно tbl_Content
.
Я нашел Сообщение блога это предложило бежать EXEC prc_CleanupDeletedFileContent 1
один раз, а затем EXEC prc_DeleteUnusedFiles 1, 0, 100000
несколько раз.
Через 25 минут большой двоичный объект CodeSense полностью исчез.
Owner BlobSizeInMB
VersionControl 8728.347916602539
TeamTest 477.505887984375
ProcessTemplate 2.953623771484
FileContainer 0.024445533203
Тем не мение, tbl_Content
все еще огромен, и запрос все еще выполняется
Я собираюсь подождать день или около того, чтобы увидеть, улучшится ли положение или мне придется продолжать копать.
РЕДАКТИРОВАТЬ 2: Прошло более 24 часов, а запрос все еще выполняется. Выполнение диагностического запроса говорит мне, что tbl_Content
действительно сжимается, и когда я использую опцию «Сжать файлы» в SQL Management Studio, файлы данных начинают иметь намного больше свободного места, поэтому он работает!
Поскольку файлы журнала базы данных не растут и все выглядит стабильно, я думаю, я просто подожду, пока запрос завершит свою работу, перезапущу его для хорошей меры, а затем приступлю к восстановлению неиспользуемого пространства на уровне базы данных.
Удачи, если вы оказались в такой же ситуации.