使用 TfsPreUpgrade 减少停机时间

Azure DevOps Server 2022 |Azure DevOps Server 2020 |Azure DevOps Server 2019

要求

仅 Team Foundation Server 部署支持 TfsPreUpgrade,其中:

  • 在 SQL Server 企业版上拥有相关的集合数据库。
  • 在 SQL Server 2012 SP1(或更高版本)或 SQL Server 2014 CU3(或更高版本)上具有相关的集合数据库。

有关详细信息,请参阅下文。

介绍

Team Foundation Server 2015 包括对大量表的架构更改,以支持重命名项目。 因此,升级到 Team Foundation Server 2015 可能需要很长时间,具体取决于数据库的大小。 由于 TFS 升级处于脱机状态,因此Microsoft提供了一个工具,TfsPreUpgrade.exe,该工具可用于执行最昂贵的工作部分来升级到 TFS 2015,而 TFS 2013 部署仍处于联机状态。 在升级之前,无需运行此工具。 建议为大小超过 1 TB 的集合数据库运行它,以减少 TFS 脱机所需的时间。

通常,TfsPreUpgrade.exe 的工作原理是创建受 TFS 2015 中架构更改影响最大的表的新副本,然后将数据从原始表迁移到新副本。 为了处理持续进行的用户活动,它还会设置触发器,以便使得原表的变化得以持续更新到新副本。 Microsoft已广泛优化 TfsPreUpgrade.exe,以最大程度地降低其对服务器和用户的性能影响,但可能会对性能产生影响。 对于创建和删除分支的 Team Foundation 版本控制(TFVC)等大型作,这可能会导致用户不满甚至数据库超时。 下文提供已知受到重大影响的操作完整列表。

因此,TfsPreUpgrade.exe 应尽可能接近脱机升级的计划日期开始,同时确保仍有时间完成其工作,并应在可以避免这些大型操作的时间窗口中运行。 许多因素将决定完成 TfsPreUpgrade.exe 需要多长时间,但我们通常预计需要两周或更短的时间,因此通常建议在计划脱机升级前的两周开始 TfsPreUpgrade.exe。 TfsPreUpgrade.exe 可以通过运行“估计”命令来大致估计执行所需的时间。

TfsPreUpgrade.exe Estimate /TargetDatabaseNames:"{SQL Instance};{Collection Database Name}"

由于工作原理,TfsPreUpgrade.exe 需要稳定的源和目标数据库架构。 因此,它只能针对 TFS 2013 Update 4 和 Update 5 数据库运行。 如果 TFS 部署尚未在 TFS 2013 Update 4 或 5 上,则需要在运行 TfsPreUpgrade.exe之前升级到其中一个版本。 可以 在此处下载 TFS 2013 Update 5。

TfsPreUpgrade.exe 做什么?

TfsPreUpgrade.exe 执行以下操作:

  • 为 2013 年未压缩但将于 2015 年压缩的少量表启用压缩。
  • 扫描并修复 TFS 版本控制数据中非常罕见但已知的数据损坏。
  • 创建新表并将现有数据迁移到其中。
  • 创建触发器。
  • 更新存储过程。
  • 创建索引。 (需要 SQL Server 企业版才能使这些操作在线执行。)

由于它创建新表以联机方式迁移数据,因此 TfsPreUpgrade.exe 需要为数据和事务日志提供大量额外的磁盘空间。 在执行 TfsPreUpgrade.exe过程中,它将检查该空间量是否已可用。 否则,它将尝试预先分配该多空间。 如果失败,它将生成错误。 TfsPreUpgrade.exe 可以通过运行 Estimate 命令提供尝试预分配的空间的估计值。

TfsPreUpgrade.exe Estimate /TargetDatabaseNames:"{SQL Instance};{Collection Database Name}"

由于 TfsPreUpgrade.exe 执行可能昂贵的作(批量复制数据、索引创建等),因此它可能会影响服务器的性能。 Microsoft预期这种影响不会显著,并且我们优化了 TfsPreUpgrade.exe 执行的操作,以最大程度地降低对服务器和用户的影响。 如果在运行 TfsPreUpgrade.exe 时遇到性能问题,可以随时通过键入 Ctrl-C 来取消运行。 写入 TfsPreUpgrade.exe,以便在取消时也能取消其正在执行的操作。 它不应使数据库处于错误状态,如果数据库在运行完成之前退出,则始终可以多次重新运行。

由于 TfsPreUpgrade.exe 会创建触发器,在初始迁移后保持表的原始副本和新副本保持同步,即使取消 TfsPreUpgrade.exe 也可能继续影响服务器的性能。 同样,Microsoft预计这种影响不会戏剧性,并且我们优化了这些触发器的性能,以最大程度地降低对服务器和用户的影响。 如果在取消 TfsPreUpgrade.exe后仍然遇到性能问题,可以使用 TfsPreUpgrade.exe Revert 命令来撤消 Run 命令执行的大部分动作。 还原将删除 Run 命令安装的所有触发器,以及它创建的所有新表,等其他操作。有关 Revert 不会还原的 Run 执行操作集,请参阅下文。

处理大量项的 TFVC 操作最有可能受到 TfsPreUpgrade.exe 创建的触发器的负面影响。 如果可以,请在 TfsPreUpgrade.exe 正在运行时以及脱机升级到 TFS 2015 完成之前,避免这些 TFVC 操作。

  • 创建、删除和重命名分支。
  • 销毁影响许多物品的操作。
  • 删除使用 TFVC 的项目。

如果您确实需要执行这些操作,可以预计在启用 TfsPreUpgrade 触发器的情况下,它们完成所需的时间至少会增加一倍。

如何运行 TfsPreUpgrade.exe?

运行 TfsPreUpgrade.exe 的建议过程为:

  1. 下载 TfsPreUpgrade.exe。 请注意,安装 TfsPreUpgrade 的计算机并不重要,只要它能够访问相关的 SQL 实例即可——该软件包会连同其所有的依赖项一起压缩提供。

  2. 将其解压缩到本地目录。

  3. 确定要在哪些集合数据库上运行 TfsPreUpgrade.exe。 它可以在任何集合数据库上运行,而不会对其升级能力造成负面影响,但通常只在那些足够大的数据库上运行,因为在脱机升级期间需要显著的停机时间。 Microsoft建议对大小超过 1 TB 的数据库使用 TfsPreUpgrade.exe。

  4. 作为 SQL 实例上的 sysadmin 的用户(TfsPreUpgrade 在其执行过程中设置多个跟踪标志),请执行 Run 命令:

    TfsPreUpgrade.exe 运行 /TargetDatabaseNames:“{SQL 实例};{Collection Database Name}”

  5. 如果要在多个集合数据库上运行 TfsPreUpgrade.exe,可以使用 TfsPreUpgrade.exe 的多个调用(在这种情况下,它们将并行运行),也可以在单个调用中指定多个逗号分隔的 SQL 实例/集合数据库字符串(在这种情况下,它们将按顺序运行)。

TfsPreUpgrade.exe 将运行相当长一段时间,具体取决于它所针对的集合数据库的大小。 它将报告一路上的进度,以便你可以了解它有多远,以及可能留下多少时间。 TfsPreUpgrade.exe 完成后,安装触发器将保留由于服务器联机流入已迁移表而进行的任何其他更改。 因此,在执行到 TFS 2015 的脱机升级之前,无需再次运行它。

代码变动统计信息

运行 TfsPreUpgrade.exe 时可以考虑的一个高级选项是跳过超过某个阈值的代码变动统计信息的迁移。 将更改签入到 TFVC 时,代码流失统计信息由后台进程计算,并存储在 TfsPreUpgrade.exe迁移的其中一个表中。 然后,此数据将流入仓库和多维数据集,然后可在报表中使用。 有关详细信息,请参阅此处

如果旧代码变动统计信息对你来说不感兴趣(或者任何代码变动统计信息对你来说不感兴趣),则可以通过跳过早于给定日期的统计信息迁移来节省 TfsPreUpgrade.exe 执行和后续脱机升级过程中的时间。 可以在运行命令时使用可选参数 /SkipCodeChurnBefore 来完成。 例如,如果想要跳过 2015 年 1 月 1 日之前的代码变动统计信息迁移,则可以使用以下命令行:

TfsPreUpgrade.exe Run /TargetDatabaseNames:"{SQL Instance};{Collection Database Name}" /SkipCodeChurnBefore:"1/1/2015"

如果使用此选项,则不会迁移相关的代码变动统计信息,在脱机升级后不会存在于仓库和多维数据集中。

脱机升级到 TFS 2015

现在可以脱机升级到 TFS 2015,可以按照升级 TFS 的正常过程进行作。

有关由 TfsPreUpgrade.exe 阻止的一些不常执行的操作的其他数据,以及有关 TfsPreUpgrade.exe Revert 未能还原的 TfsPreUpgrade.exe 所做数据库更改的详细信息,请参阅下文。

被阻止的操作

在执行 TfsPreUpgrade.exe 早期,将实施一些“安全”触发器来阻止 TFS 2013 允许的作,但 TFS 2015 不再允许,或者会导致 TfsPreUpgrade.exe存在触发器时出现问题。 这些包括:

  1. 删除项目。 在对集合数据库运行 TfsPreUpgrade.exe 后,不建议删除项目。 如果确实删除项目,在完成删除之前,它将失败,使项目处于“删除”状态。 升级到 TFS 2015 后,将再次支持项目删除。
  2. 创建包含对不存在根文件夹的引用的工作区。 这些操作将失败,并出现错误TF10169。 请注意,其中一种可能的情况是在生成定义中,其工作区模板引用了不存在的根文件夹 —— 在这样的情况下,构建可能会在创建工作区时失败,并显示给定的错误信息。 由于项目重命名相关的更改,TFS 2015 中将继续不支持此方案,但会失败并显示更相关的错误消息。
  3. 通过针对 TFS 客户端 OM 编写的代码调用 VersionControlServer.CreateTeamProjectFolder()。 这将失败,并出现错误 TF10169。 由于与团队项目重命名相关的更改,TFS 2015 中将继续不支持此方案,但会失败并显示更相关的错误消息。

TfsPreUpgrade.exe 反转的例外

运行 TfsPreUpgrade.exe 有许多副作用,这些副作用不会通过运行 TfsPreUpgrade.exe 还原来还原。 最引人注目的是,由 TfsPreUpgrade.exe 完成的数据库和/或事务日志空间的任何预分配都不会被还原,这意味着数据库文件在运行 TfsPreUpgrade.exe之后可能会比之前大得多。 但是,将不使用额外的空间,因为将删除由 TfsPreUpgrade.exe 创建的其他表。 我们建议保留这个空间,首先是因为随着数据库文件中数据大小的增加,它会自然填充,其次是因为将来升级到 TFS 2015 时会需要它。

未能逆转的其他副作用影响不大,此处仅供您参考列出。 在任何情况下,这些更改都是由升级到 TFS 2015 进行的,并且不应对服务器运行或其最终升级产生任何影响。

  1. 不会还原在 TFS 版本控制数据中找到并修复的任何损坏。
  2. 由损坏检测和修复脚本添加到 tbl_Version 的列不会被删除。
  3. 启用压缩的表不会再次禁用它。