Недавно я унаследовал ответственность за администрирование экземпляра 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]
@ где
равно 1. Таблица была пуста, поэтому делать там нечего. [CodeSense]. [Tbl_AggregateMap]
, где @partitionId
равно 1. Я запросил БД и обнаружил, что не было строк с другими идентификаторами разделов. Кроме того, выполнение SELECT COUNT (*)
занимало более 5 минут, поэтому я отменил его, и тогда меня осенило: Я мог бы просто усечь таблицу, потому что единственный идентификатор раздела в моем случае - 1 . Это спасло меня от засорения диска кучей бесполезных журналов транзакций и удаления материала партиями. Конечно, я усек его, но из соображений точности я затем повторно запустил TFSConfig CodeIndex / destroyCodeIndex
в моей коллекции и на этот раз это сработало.
Однако, когда я вернулся на уровень базы данных, чтобы восстановить мое теперь, предположительно, пустое пространство: оно еще не было свободным.
Я вернулся к журналу событий и обнаружил ] EXEC CodeSense.prc_DeleteOrphanedFiles @ partitionId = 1, @ createdBefore = 17.03.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, файлы данных начинают иметь намного больше свободного места, так что он работает!
Поскольку файлы журнала базы данных не растут и все выглядит стабильно, я думаю, я просто собираюсь дождаться, пока запрос завершит свою работу, перезапустить его для хорошей оценки, а затем приступить к восстановлению неиспользуемого пространства на уровне базы данных. .
Удачи, если вы оказались в такой же ситуации.