tfsbuild.exe löschen / zerstören behält Waisen in der Datenbank

tfsbuild.exe löschen / zerstören behält Waisen in der Datenbank

Wir verwenden TFS 2012 seit 2013. In der Zwischenzeit ist die Datenbank auf ~60 GB angewachsen. Dies hat mehrere Nachteile, wie z. B. längere Sicherungszeit, Verschwendung von Speicherplatz, ...

Nachdem ich mir den Bericht „Datenträgernutzung nach Top-Tabellen“ angesehen hatte, stellte ich fest, dass die tbl_BuildInformationTabelle aufgebläht war. 46 GB von 60 GB werden zum Speichern/Archivieren von Informationen über vergangene Builds (Build-Protokoll usw.) verwendet. Und wir haben absolut keinen Grund mehr, diese Informationen zu verwenden.

Ich bin daher den Vorschlägen in den MSDN-Foren gefolgt, wie man diese bereinigt. Ich habe die beiden Befehle ( tfsbuild.exe delete ...und tfsbuild.exe destroy ...) auf unseren TFS-Server angewendet. Nach fast 1,5 Stunden war die Bereinigung erfolgreich abgeschlossen. Die betreffende Tabelle hat sich jedoch nicht geändert. Aber fast alle Einträge sind Waisen ohne Verweis auf weitere Informationen mehr.

Bei anderen Quellen ist dieses Verhalten üblich und beabsichtigt. Meiner Meinung nach aber absoluter Blödsinn und nutzlos. Ich habe diese Schritte durchgeführt, um eine saubere und verkleinerte Datenbank zu erhalten.

Irgendwelche Ideen oder Empfehlungen, wie ich das loswerden kann? Eigentlich könnte ich die verwaisten Einträge in der Datenbank mit einer SQL-Abfrage löschen, aber Experten raten aufgrund unerwarteten Verhaltens dringend davon ab. Was sind Ihre Erfahrungen?

Antwort1

Sie müssen warten, bis der „Build Information Cleanup Job“ ausgeführt wird (standardmäßig wird er alle zwei Tage ausgeführt). Dies ist der Job, der tbl_buildInformation bereinigt, nachdem Sie TFSBuild.exe deleteund ausgeführt haben TFSBuild.exe destroy.

Sie können den Zeitplan wie folgt überprüfen (in PowerShell):

$collection = "http://yourservername:8080/tfs/YourCollection" # change this to the URL of your team project collection
$pathToAss2 = "C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\ReferenceAssemblies\v2.0"
$pathToAss4 = "C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\ReferenceAssemblies\v4.5"
Add-Type -Path "$pathToAss2\Microsoft.TeamFoundation.Client.dll"
Add-Type -Path "$pathToAss2\Microsoft.TeamFoundation.Common.dll"
Add-Type -Path "$pathToAss2\Microsoft.TeamFoundation.WorkItemTracking.Client.dll"
Add-Type -Path "$pathToAss2\Microsoft.TeamFoundation.VersionControl.Client.dll"
Add-Type -Path "$pathToAss4\Microsoft.TeamFoundation.ProjectManagement.dll"
$tpc =  [Microsoft.TeamFoundation.Client.TfsTeamProjectCollectionFactory]::GetTeamProjectCollection($collection)
$jobService = $tpc.GetService([Microsoft.TeamFoundation.Framework.Client.ITeamFoundationJobService])
$job = $jobService.QueryJobs() | Where-Object {$_.Name -eq "Build Information Cleanup Job"}
$job
$jobService.QueryLatestJobHistory([Guid[]] @($job.JobId))

Um den Job zur sofortigen Ausführung in die Warteschlange zu stellen, führen Sie die vorherigen Befehle und anschließend den folgenden Befehl aus:

$jobService.QueueJobNow([Guid] $job.JobId, $false)

Um den Zeitplan zu ändern, führen Sie Folgendes aus:

$interval = 172800 # change this to the number of seconds between each run; 172800 = 2 days
$job.Schedule[0].Interval = $interval # there is only one schedule for the build information clean-up job, we set its interval
$jobService.UpdateJob($job)

Um tatsächlich zu sehen, wann der nächste Lauf dieses Jobs geplant ist, müssen Sie zur Datenbank gehen und die folgende Abfrage ausführen (die Abfrage ist nicht ganz korrekt, da sie in den Spalten „ScheduledTime“ und „Interval“ die Informationen von Tfs_YourCollection für alle aufgelisteten Sammlungen anzeigt, die anderen Informationen sind korrekt, insbesondere die QueueTime):

USE Tfs_YourCollection
SELECT S.JobId, D.JobName, S.ScheduledTime, S.Interval, CQ.QueueTime, SH.Name
FROM tbl_JobSchedule S
LEFT OUTER JOIN tbl_JobDefinition D ON D.JobId = S.JobId
LEFT OUTER JOIN [Tfs_Configuration].dbo.tbl_JobQueue CQ ON CQ.JobId = S.JobId
LEFT OUTER JOIN [Tfs_Configuration].dbo.tbl_ServiceHost SH ON SH.HostId = CQ.JobSource
WHERE D.JobName = 'Build Information Cleanup Job'

Sehenhttp://blogs.msdn.com/b/chrisid/archive/2010/02/15/introducing-the-tfs-background-job-agent-and-service.aspxUndhttp://blogs.msdn.com/b/granth/archive/2013/02/13/tfs2012-what-are-all-the-different-jobs-built-in-to-tfs.aspxfür mehr Informationen.

verwandte Informationen