
自 2013 年以來,我們一直在使用 TFS 2012。這有幾個缺點,例如增加備份時間、浪費磁碟機空間…
在查看了“頂級表的磁碟使用情況”報告後,我發現該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了解更多。