从 TFS 迁移到 VSTS - 减少 TPC 数据库大小

2023-12-04

我们计划很快从本地 TFS 实例迁移到 VSTS。在迁移之前,我们运行先决条件的验证任务并获得有关 TPC 数据库大小的以下输出报告:

“数据库当前为 191GB。这超出了使用 DACPAC 导入方法时建议的 150GB 大小。当前最大表大小为 172GB。这超出了使用 DACPAC 导入方法时建议的 20GB 大小。

验证已完成“验证集合数据库大小”,结果为警告,消息最大表大小当前为 172GB。这超出了使用 DACPAC 导入方法建议的 20GB 大小。”


本指南的最新版本位于我的博客上:在迁移到 VSTS 之前清理您的团队项目集合。对于最新版本的 Azure DevOps Server 来说,该指南仍然非常准确。


鉴于您需要将最大的表减少 150GB,我想知道 DACPAC 是否是一个选择。也就是说,清理 TFS 实例始终是个好主意。除非您设法剥离足够的数据以真正从收缩中获得任何好处,否则您的第一步不会有太大帮助。

您确定的行动确实会有所帮助,大多数已经记录在这里。还可以帮助检测空间分配位置的查询在最近的支持票中找到.

删除旧工作区

删除工作区和搁置集可以大大减少迁移和升级时间。要么使用tf命令行或利用类似的工具TFS 助手识别并删除这些。

构建结果

不仅仅是构建结果,而且经常被忽视的实际构建记录也会占用大量数据。使用tfsbuild destroy(XAML) 永久删除构建记录。过去,我遇到过一些客户,他们的数据库中有 180 万个“隐藏”构建,删除它们会减少相当多的数据。这些记录保存在仓库里。

老团队项目

当然,销毁旧的团队项目可以返还大量数据。任何不需要发送到 azure 的内容都会有帮助。你也可以考虑拆分集合并留下旧项目。如果您再次需要该数据,您可以选择分离该集合并将其存储在某个地方。

冗余文件

删除的分支是一种非常常见的隐藏大小问题。当删除 TFVC 中的内容时,它们实际上并没有被删除,它们只是被隐藏了。查找已删除的文件,尤其是旧的开发或功能分支可以为您返回大量数据。使用tf destroy摆脱他们。

您可能还想查找签入的 nuget 包文件夹,这些文件夹也可以快速占用大量空间。

测试附件

哦,是的,特别是当您使用测试附件时,这些附件可能会疯狂增长,具体取决于您的 TFS 版本,可以使用内置的测试附件清理功能,也可以使用TFS 电动工具测试附件清洁器.

XAML 构建

构建定义本身不会占用大量数据库空间,但构建结果可能会占用大量数据库空间。但这些已在前一节中介绍过。

Git 存储库

您的 git 存储库中可能有由于强制推送或删除分支而无法再访问的数据。 Git 中的某些数据也有可能被更有效地打包。要清理存储库,您必须在本地克隆它们,清理它们,从 TFS 中删除远程存储库,然后将清理后的副本推送到新存储库(可以使用与旧存储库相同的名称)。这样做会破坏现有构建定义的引用,您必须修复它们。当您这样做时,您还可以运行BFG repo Cleaner 并转换存储库以启用 Git-LFS 支持更优雅地处理存储库中的大型二进制文件。

git clone --mirror <<repo>>
# optionally run BFG repo cleaner at thi s point
git reflog expire --expire=now --all 
git gc --prune=now --aggressive
git repack -adf
# Delete and recreate the remote repository with the same name
git push origin --all
git push origin --tags

工作项目(附件)

工作项目可以收集大量数据,尤其是当人们开始向其附加大型附件时。您可以使用witadmin destroywi删除附件过大的工作项。要保留工作项,但删除其附件,您可以从当前工作项中删除附件,然后克隆它。克隆后,销毁旧的工作项以清理附件。

您不再需要的旧工作项目(例如 6 年前的冲刺项目)也可以删除。我的同事雷内有一个很好的工具,允许您通过首先创建适当的工作项查询来批量销毁.

确保运行清理作业

TFS 通常不会直接从数据库中删除数据,在许多情况下,它只是将内容标记为已删除以供最新处理。要强制立即进行清理,请在项目集合数据库上运行以下存储过程:

EXEC prc_CleanupDeletedFileContent 1
# You may have to run the following command multiple times, the last
# parameter is the batch size, if there are more items to prune than the 
# passed in number, you will have to run it multiple times
EXEC prc_DeleteUnusedFiles 1, 0, 100000

其他有用的查询

要确定每个部分中存储了多少数据,您可以运行一些有用的查询名词实际查询取决于您的 TFS 版本,但由于您正在准备迁移,我怀疑您目前使用的是 TFS 2017 或 2018。

找到最大的表:

SELECT TOP 10 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

查找最大的内容贡献者:

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

如果文件容器是问题所在:

SELECT CASE WHEN Container = 'vstfs:///Buil' THEN 'Build'
WHEN Container = 'vstfs:///Git/' THEN 'Git'
WHEN Container = 'vstfs:///Dist' THEN 'DistributedTask'
ELSE Container 
END AS FileContainerOwner,
SUM(fm.CompressedLength) / 1024.0 / 1024.0 AS TotalSizeInMB
FROM (SELECT DISTINCT LEFT(c.ArtifactUri, 13) AS Container,
fr.ResourceId,
ci.PartitionId
FROM tbl_Container c
INNER JOIN tbl_ContainerItem ci
ON c.ContainerId = ci.ContainerId
AND c.PartitionId = ci.PartitionId
INNER JOIN tbl_FileReference fr
ON ci.fileId = fr.fileId
AND ci.DataspaceId = fr.DataspaceId
AND ci.PartitionId = fr.PartitionId) c
INNER JOIN tbl_FileMetadata fm
ON fm.ResourceId = c.ResourceId
AND fm.PartitionId = c.PartitionId
GROUP BY c.Container
ORDER BY TotalSizeInMB DESC
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 TFS 迁移到 VSTS - 减少 TPC 数据库大小 的相关文章

  • 更改 TFS 构建代理的身份

    我们有一个运行集成测试的 TFS 构建代理 其中一些测试会调用 Internet 上的 Web 服务 我们的网络使用代理与互联网通信 由于构建代理在网络服务上的身份下运行 并且网络服务的设置未配置为使用代理 因此测试失败 我该如何执行以下操
  • 在 TFS 下的 CI 队列上构建时包未恢复(VS Online VS2015)

    我问过一个关于构建错误的问题 https stackoverflow com questions 34808954 build errors of missing packages in visual studio online并继续由我绝
  • 使用 tf.exe 设置 Azure DevOps Pipeline 的分支权限

    我有一个 Powershell 脚本 它尝试设置在构建管道中调用的分支权限 不幸的是 我收到了未经授权的错误 但我不知道为什么 代码片段 tfExe split path parent MyInvocation MyCommand Defi
  • Buid 定义:调用 COM 组件返回了错误 HRESULT E_FAIL

    当我向 TFS 添加新工作项时 构建定义会抛出异常 如下所示 Exception Message Error HRESULT E FAIL has been returned from a call to a COM component t
  • 从 TFS 下载工作项附件(文件已损坏)

    我正在尝试创建 C 代码 因此我可以自动从 Team Foundation Server 下载 BUGS 预定义查询的所有附件 该代码似乎工作得很好 但所有下载的文件都因意外原因而损坏 我无法查看它们 有人可以看一下代码并分享意见吗 非常感
  • 如何在azure发布管道失败时创建工作项而不是构建管道

    我没看到Create work item on failure选项选项卡上的选项 我用这个作为参考https developercommunity visualstudio com content problem 343557 create
  • 默认“合并后完成链接的工作项”为未选中

    VSTS 中出现了 PR 完成的新功能 其中默认标记为完成的 PR 也会将链接的工作项标记为完成 除非未选中 如果可能错过此复选框 是否可以将其默认为未选中 自 2017 年 8 月 28 日起 您可以更改此复选框的默认行为 虽然它默认为
  • 我们是否错误地使用了 TFS 2010? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我们的团队是 TFS2010 的新手 从历史上看 我们一直使用我们自己的业务需求矩阵 可追溯性矩阵 Excel 电子表格 它具有典型的列 例如
  • VSTS 使用 API 在队列时设置构建参数

    我需要对来自 REST API 的 VSTS 构建进行排队 记录于https learn microsoft com en us rest api vsts build builds queue view vsts rest 4 1 htt
  • Azure Devops - Nuget 包中从 .NET Core 3.1 迁移到 .NET 5 时出现兼容性问题

    我有一个 NET Core 解决方案 该解决方案在 Azure Devops 上使用 Pipeline 使用 NET Core 3 1 运行良好 管道上的一切都运行良好 从 NET Core 3 1 迁移到 NET 5 0 后 我开始在运行
  • 如何确定代理池在 Azure DevOps 中脱机的原因

    我注意到我的所有构建突然卡住了 如果我单击构建 则会收到以下错误 所有符合条件的代理均已禁用或离线 When I check my agent pools I get the following 我怎样才能让他们上线 确定他们离线的原因 尝
  • 使用 Git 在线使用 TFS 的 Visual Studio 2013:自动保存文件签入

    我目前正在将 Visual Studio Premium 2013 Update 3 与 Team Foundation Server Online 结合使用并使用 Git 存储库 直到最近 我已经成功使用 Git Repo 几个月了 现在
  • 将处理项目移至 Eclipse

    我已经在处理项目上工作了一段时间 现在想将其移至 Eclipse 中 我已经在 Eclipse 环境中安装了 Proclipse 我有很多扩展名为 pde 的文件 然而 Proclipse 文件都以 java 结尾 所有 pde 文件都存在
  • 如何替换 Visual Studio/TFS 2010 中的合并工具 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 解析和更改 NSPredicate

    我必须将数据从以前的应用程序版本迁移到新版本 这也会影响一些谓词 NSPredicate实例 由用户保存 这意味着我必须以编程方式更改它们 目前我尝试解析我得到的字符串 NSPredicate predicateFormat 并手动更改一些
  • 获取 405 方法不允许将 NuGet 发布到 VSTS/ADO

    我刚刚设置了一个新的 ADO 以前称为 VSTS VSO 包管理源 并且尝试从桌面向其发布本地 NuGet 包 我按照提要中的说明进行操作 但当我尝试发布时收到 405 方法不允许 我按照 NuGet 3 3 VSTS 凭据提供程序 的说明
  • linux azure web 应用程序不显示我的reactjs 应用程序

    我使用 npx create react app 创建了一个 Reactjs Web 应用程序 并创建了一个 azure ci cd 管道以将构建文件夹推送到我的 Linux Web 应用程序实例 我还指定了启动命令 pm2 serve h
  • 如何检查Azure SQL数据库中是否已存在数据库用户

    我的新客户计划使用 Azure 托管 SQL 数据库服务 我正在使用 dacpac 来部署数据库 在 dacpac 中 我有一个部署后脚本 用于创建 sql 用户 如下所示 IF NOT EXISTS SELECT name FROM sy
  • 发布到特定环境时自动关闭工作项

    在 PR 发布到特定环境后 而不是在 PR 合并到主版本时 是否有办法自动关闭与 PR 关联的 Azure Boards 工作项 You can use the REST API Builds Get Build Work Items Re
  • 如何使用服务帐户模拟 Azure Devops 中的用户

    我创建了一个服务帐户来模拟组织中的用户 以便以用户的名义更改工作项 我已经将该服务帐户添加到 项目收集服务帐户 组中 其中 代表其他人提出请求 设置为 允许 服务帐户具有 Visual Studio 订阅 然后 我使用与本地 TFS 配合使

随机推荐

  • 使用 hbase 处理图像、视频和音频类型

    任何人都知道如何使用 Hbase 处理音频 视频和图像等非结构化数据 我尝试了很多 但没有任何想法 请提供任何帮助 选项1 将图像转换为字节数组 您可以准备放置请求并插入到表中 同样也可以实现音频和视频文件 See https docs o
  • C语言中的对象

    即使我浏览了一些 C 语言教程 笔记 我还是遇到了 对象 这个术语 我一直想知道对象与过程语言有什么关系 深入一点我可以理解 占用一块内存的东西在c中被称为 对象 我的问题是我的理解是否正确或者是否有我遗漏的东西 谢谢 来自C99标准草案
  • 如何存储/检索 RSA 公钥/私钥

    我想使用RSA公钥加密 存储或检索私钥和公钥的最佳方法是什么 XML 在这里是个好主意吗 如何获得钥匙 RSAParameters privateKey RSA ExportParameters true RSAParameters pub
  • ExpressJS:每 24 小时运行一次函数

    在 ExpressJS 中每 24 小时运行一次自动化函数的最简单方法是什么 除了运行无限循环之外 我到处寻找解决方案 原则上这是唯一的方法吗 你需要使用节点 cron npm var cron require node cron cron
  • 为什么 Ruby `**` 运算符的优先级高于一元 `-` ?

    这会导致这样的情况 1 0 5 gt 1 只有括号可以解决这个问题 1 0 5 gt 6 123031769111886e 17 1 0i 这比预期的要差1 i 但基本可以接受 在我去抱怨 Ruby bug 之前 我想知道是否有某种原因造成
  • 有没有办法提高FlyingSaucer的性能?

    我已经关注了本文使用 FlyingSaucer 将 XHTML 转换为 PDF 这很出色 但有一个重大缺点 速度慢得离谱 我发现从 XHTML 渲染 PDF 需要 1 到 2 分钟 无论该页面多么简单 基本代码 import java io
  • VBscript 代码捕获标准输出,而不显示控制台窗口

    这是一个 VBScript 代码示例 展示了如何捕获命令行程序发送到标准输出的任何内容 它执行命令xcopy 并在消息框中显示输出 在消息框出现之前 您会看到控制台窗口突然弹出 Set objShell WScript CreateObje
  • 使用指针了解数组的大小

    我如何使用使用 malloc 分配的指针知道数组的大小 include
  • Java:从字节数组中删除连续的零段

    例如 假设我想从数组中删除所有长度超过 3 个字节的连续 0 段 byte a 1 2 3 0 1 2 3 0 0 0 0 4 byte r magic a System out println r result 1 2 3 0 1 2 3
  • .NET 最好的音频压缩库是什么?

    我正在寻找一个好的 NET 音频压缩库 任何使用 MP3 的东西都已经过时了 因为许可问题 基本上我只需要能够将常规 WAV 音频数据压缩为某种格式 然后解压缩回 WAV 最好代码全部是 NET C 或 VB NET 但我认为这不太可能 它
  • 用于从 Google 表单获取平均分数和电子邮件的 Google 脚本(如测验)

    我需要一个 Google 脚本 GAS 来从已转换为测验的 Google 表单中检索电子邮件和总分 在GAS中你可以得到每个问题的分数 但我需要得到所有问题的分数 然后平均得出最终分数 每个测验有20个问题 我还需要每个完成测验的人的电子邮
  • R - ggplot 轴数字格式 - 删除前导零

    从 R ggplot geom bar 轴删除前导零的选项 代码是什么 即 我希望 0 05 显示为 0 05 我能找到的只是内置格式 如百分比 逗号等 thx 作为受 m evans 给出的答案启发的简单替代方案 可以使用以下方法轻松实现
  • 使用 Dataview.RowFilter 从 SomeTable 中选择 TOP 5 *?

    我需要从缓存的 Dataview 对象中选择最近的 5 行 有什么方法可以做到这一点吗 我已经尝试过 但索引器数据列是空的 public static DataView getLatestFourActive DataTable produ
  • 委托的构造函数和成员函数在哪里定义?

    当我在看的时候ActionReflector 中的委托 我看到它有一个像这样的构造函数 public Action object object IntPtr method 但我找不到任何机构以及其他成员职能 例如Invoke BeginIn
  • MYSQLI准备语句bind_param类型不起作用

    我已经使用准备好的插入语句好几年了 并假设它正确绑定了参数 否则会给出错误 但它似乎不像以下 php 绑定并插入记录而没有任何错误 而是将应该是 int 的字符串更改为零 因此 它可能可以防止 SQL 注入攻击 但最终会在表中得到虚假记录
  • Monotouch:在 iPhone 上关闭飞行模式后 WebRequest 连接失败

    我的单点触控应用程序正在与网络服务进行定期后台同步 它运行完美并正确检测飞行模式 当我关闭 WiFi 时 它会自动开始使用 WWAN GPRS 3G 连接 到目前为止 我非常满意 但是 关闭飞行模式后 当没有可用的 WiFi 时 我的应用程
  • 类型错误:列表索引必须是整数,而不是 str Python [重复]

    这个问题在这里已经有答案了 list s 是一个字符串 为什么这不起作用 出现以下错误 类型错误 列表索引必须是整数 而不是 str list abc def map list for s in list t list s 1 map li
  • 如果数组包含值,Mongoose 查找文档

    所以我有这个模式 const Document new mongoose Schema id type Number creationDate type Date default Date now title String status t
  • 致命错误:未捕获错误:调用未定义的函数 sqlsrv_connect()

    我正在尝试连接到我们可以通过 Microsoft SQL Server Management Studio 访问的 SQL Server 我已经尝试了很多我在 SO 上看到的不同的东西 但没有任何效果 我收到错误Fatal error Un
  • 从 TFS 迁移到 VSTS - 减少 TPC 数据库大小

    我们计划很快从本地 TFS 实例迁移到 VSTS 在迁移之前 我们运行先决条件的验证任务并获得有关 TPC 数据库大小的以下输出报告 数据库当前为 191GB 这超出了使用 DACPAC 导入方法时建议的 150GB 大小 当前最大表大小为