我们从 2013 年开始使用 TFS 2012。与此同时,数据库已增加到约 60GB。这有几个缺点,例如增加了备份时间、浪费了驱动器空间……
在查看“顶级表的磁盘使用情况”报告后,我发现该tbl_BuildInformation
表已超载。60GB 中的 46GB 用于存储/存档过去的构建信息(构建日志等)。我们绝对不再需要使用这些信息。
因此,我按照 MSDN 论坛中的建议清理这些内容。我将这两个命令(tfsbuild.exe delete ...
和tfsbuild.exe destroy ...
)应用于我们的 TFS 服务器。经过近 1.5 小时,清理工作已成功完成。不过,相关表没有改变。但几乎所有条目都是孤立的,不再有任何进一步的信息。
对于其他来源,这种行为很常见且是故意的。但在我看来,这绝对是无稽之谈,毫无用处。我执行了这些步骤来获得一个干净且缩小的数据库。
有什么想法或建议可以解决此问题吗?实际上,我可以使用 SQL 查询删除数据库中的孤立条目,但专家建议严格不要这样做,以免出现意外行为。你有什么经验?
答案1
您必须等到“构建信息清理作业”运行(默认情况下每两天运行一次)。这是在您运行TFSBuild.exe delete
和之后清理 tbl_buildInformation 的作业TFSBuild.exe destroy
。
您可以使用(在 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))
要将作业排队以立即运行,请运行前面的命令,然后运行以下命令:
$jobService.QueueJobNow([Guid] $job.JobId, $false)
要更改计划,请运行:
$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)
要真正了解此作业的下一次运行计划,您必须转到数据库并运行以下查询(该查询并不完全正确,因为它在“ScheduledTime”和“Interval”列中显示了所有列出的集合的 Tfs_YourCollection 信息,其他信息是正确的,尤其是 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'
看http://blogs.msdn.com/b/chrisid/archive/2010/02/15/introducing-the-tfs-background-job-agent-and-service.aspx和http://blogs.msdn.com/b/granth/archive/2013/02/13/tfs2012-what-are-all-the-different-jobs-built-in-to-tfs.aspx了解更多信息。