如何缩小TFS 2017快速增长的tbl_content表

Jian Huang

我们使用TFS 2017 CI / CD管道,效果很好。但是,TFS 2017数据库平均每天增长约1GB。截至2018年10月23日,一个数据库从10GB增长到44GB。增长对我们而言逐渐变得不可持续。我们已经将保留政策调整到最低限度。

研究并阅读了至少30篇文章。以下是一些相关文章:

使用VNext构建后,TFS tbl_Content开始快速增长

https://mattyrowan.com/2014/04/02/need-help-tfs-tbl_content-table-and-database-growth-out-of-control/

https://developercommunity.visualstudio.com/content/problem/63712/tfs-database-size.html

这是我到目前为止所做的:

  1. 一次又一次地审查了保留政策,并减少到最少(1天1份)。将“保留已删除”调整为10天。

  2. 在发布定义中取消选中“保留内部版本”框

  3. 运行上述三篇文章中的脚本,并发现:

    a)FileContainer,具有149176个文件,43GB,(压缩后为34GB)

    b)FileContainerOwner:内部版本,29GB

因此,增长的主要原因是Build(和工件)。

我的问题是如何缩小数据库大小?

我查看构建定义下的“历史记录”和“已删除”标签。

  1. “历史记录”中的某些记录被“通过释放保留”锁定。我可以单击记录并删除。但是它什么也没做。记录仍然存在。

  2. “已删除”中的所有记录仍然存在。

因此,再次回到我的问题,如何删除这些记录以便可以回收空间?

谢谢。

Jian Huang

将RetainedByRelease重置为false并等待至少24小时后,增长突增停止,并且每天删除tbl_content中的条目。

因此,在总结中,我也这样做了:

  1. 在nuget Microsoft.VisualStudio.Services.Client之后,使用TFS REST API将RetainedByRelease重置为false。

特别感谢以下两个线程:

https://social.msdn.microsoft.com/Forums/vstudio/zh-CN/5f649821-b1bf-4008-bba9-0c960e124abb/tfs-releasemanagement-vnext-quotthis-build-has-been-retained-by-a- releasequot-issue?forum = tfsbuild

试图通过客户端库获取TFS用户列表

可以帮助开发人员的完整源代码:

using Microsoft.TeamFoundation.Build.WebApi;
using Microsoft.TeamFoundation.Core.WebApi;
using Microsoft.VisualStudio.Services.Client;
using Microsoft.VisualStudio.Services.Common;
using Microsoft.VisualStudio.Services.WebApi;
using System;

namespace TfsRestAPIs
{
    public class RestAPI
    {
        public static void UpdateRetainedByRelaseToFalse()
        {
            Uri tfsURI = new Uri("http://TFS2017:8080/tfs/YourProjectCollection");
            VssCredentials creds = new VssClientCredentials();
            creds.Storage = new VssClientCredentialStorage();
            VssConnection connection = new VssConnection(tfsURI, creds);
            var projectClient = connection.GetClient<ProjectHttpClient>();
            var projects = projectClient.GetProjects().Result;
            var buildClient = connection.GetClient<BuildHttpClient>();            

            foreach (var project in projects)
            {
                Log(project.Name);
                if (project.Name == "YourProjectName")
                {
                    var builds = buildClient.GetBuildsAsync(project.Id).Result;
                    foreach (Build build in builds)
                    {
                        if (build.BuildNumber.StartsWith("YourSearchCondition"))
                            try
                            {                                
                                if (build.RetainedByRelease.Value)
                                {
                                    Log(build.BuildNumber + "'s RetainedByRelease=true");
                                    build.RetainedByRelease = false;
                                    var res = buildClient.UpdateBuildAsync(build, build.Id).Result;
                                    Log("  --> RetainedByRelease is set to " + res.RetainedByRelease.Value);
                                }
                            }
                            catch (Exception e)
                            {
                                Log(build.BuildNumber + ":" + e.Message);
                            }
                    }
                }
            }
        }

        private static void Log(string msg)
        {
            Console.WriteLine(msg);
        }
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章