AzureDevOps备份和还原

标签: Azure 分类: 软件 创建时间:2020-04-16 02:34:14 更新时间:2025-01-17 10:39:21

1.数据备份

AzureDevops支持数据备份,虽然备份的时候要一个网络地址。
(1) 我在安装了AzureDevopsServer的机器上新建了一个文件夹,然后打开了共享,设置了EveryOne可读取写入,然后这个文件夹就有了网络路径(其实是本机文件夹)

(2) 然后立即执行了备份计划,最后将数据成功备份到了本机上。

(3) 备份成功。

问题

AzureDevops支持数据备份,但是备份有一个限制,就是要备份到网络文件夹上。

但是这个文件要对AzureDevops的安装账号及SQL Server服务账号有读写的权限,否则就会报错。

我尝试了以下步骤:
(1) 打开网络共享中心 – 更改高级共享设置 – 公用 关闭了密码保护共享

(2) 组合键 win+r ,输入 gpedit.msc 进入本地组策略编辑器->计算机配置 – windows设置 – 安全设置 – 本地策略 – 安全选项 – 网络访问:本地账户的共享和安全模型 修改为仅来宾

(3) 文件夹属性 – 共享 – 共享 – 添加 – Everyone – 共享

最后测试,SQL Server账号还是无法访问。

3.数据还原

我在另一台虚拟机电脑上重新安装了Azure Devops Server,如果是新装的,为了避免出现问题,可能需要将创建的数据库删除掉,删除方法见下面的解决方法。
(1) 将备份文件从旧机器移动到新的的机器上,修改BackupSets.xml中的计算机名,为新的本机的计算机名称

(2) 打开新的AzureDevops管理控制台,选择新的部署

(3) 选择高级,设置好之后,需要的话可能重启电脑

(4) 打开控制台,选择计划的备份

(5) 选择还原数据库,备份的网络路径文件夹,这个直接复制共享文件夹路径就好了,然后点击后面的列表备份,列出可以还原的文件。

(6) 选择要还原的数据库实例,这个实例,要选择本机的数据库实例,默认的是备份数据时所备份的数据库实例

(7) 执行验证之后,就可以还原数据库

问题

(1) 数据实例的名字是本机的计算机名+实例名,右键开始菜单,计算机管理->服务->SQL Server,可以看到实例的名字,默认为数据实例的名字是MSSQLSERVER。计算机名,可以右键 系统菜单栏->系统 进行查看。

所以实例的最终的名字为 计算机名\MSSQLSERVER。

当然,即便我改了实例的名字,最后还是报错了。

(2) 查看日志,出现了: TF246017: Azure DevOps Server 未能连接到数据库。请验证是否已正确指定实例,承载数据库的服务器是否能够正常运行,且没有网络问题阻止与服务器进行通信。
刚开始我改了备份文件中的BackupSettings.xml配置文件,然后将涉及到的数据库实例名,改为本机的SQL Server实例,尝试了一下,不可以。

(3) 我怀疑是否是因为我虽然安装了 Azure Devops Server,但是还没有运行过配置向导,所以需要先运行一下配置向导,连接数据库。

(4) 果然,不出所料,真的运行了配置向导之后,连接了数据库,还是不行啊,还是没有权限。

终极解决方法

(1) 再次尝试解决,首先在新装的AzureDevops上,备份一遍数据库,然后将旧的备份文件夹中的文件,除BackupSets.xml和BackupSettings.xml两个文件之外的文件夹,都拷贝到新的备份文件夹中。

(2) 打开计算机管理->服务->停止Azure DevOps Server 后台作业代理和 Azure DevOps Ssh Service两个服务,不停止这两个服务器,就会出现下面的数据库占用问题

停止IIS中的Azure Devops网站(还原之后再打开)

(3) 然后打开SQL Server数据库管理工具,删除AzureDevOps_Configuration和AzureDevOps_DefaultCollection两个数据库,。删除数据库之后,重启上面两个服务

(4) 修改新的备份文件夹目录下的BackupSets.xml文件,将旧的备份文件夹下的BackupSets.xml,文件的内容复制到新的文件中。

(5) 重新打开Azure DevOps Server Administration Console 管理控制台,执行还原数据库

(6) 选择新的备份文件夹(这个文件夹要是共享文件夹)

(7) 下一步,下一步,检查,验证,终于都绿了。

(8) 点击还原,等待还原结果,最后还原成功

副作用

千辛万苦搞定了数据库还原,结果打开新的站点,出现了错误:TF30046: 实例信息不匹配。找不到 Azure DevOps 需要的 caa455c5-2cc2-4971-ad0c-b10f5ed043e7。请与 Azure DevOps Server 管理员联系。

无奈啊,只能重新卸载,安装AzureDevops了。

20200415更新
经过一夜的修整,今天再次来奋战DevOps的备份和还原。(有什么我就在思考,我这样执着的意义,到底是什么?这项工作明明可以不做,或者是以后需要的时候,在做,或者让专门的运维去做,我为什么还要这么折磨自己,已经弄了快一天了。甚至明明就可以将全部的仓库和配置都可以重新上传的啊,这么简单和高效的做法,为什么不采用,而我却非得要装了卸,卸了再装,这样不断的重复。)


还原的时候,我少还原了一个数据库,出现了下面的问题:

TF246083: Azure DevOps Server 的配置无效。必须重新映射数据库以修复配置。从服务器收到以下错误: TF246064: 找不到以下主机的数据库: Document。该主机具有以下 ID: cdb41e9f-b2b9-4c13-81e9-3fd4cd6b4a49。若要修复此问题,请使用 TFSConfig RemapDBs 命令行工具,并确保指定包含此数据库的 SQL Server 实例。

也就是提示我少还原了一个数据库。

4.执行命令行TfsConfig

发现了一个神奇的工具,打开 C:\Program Files\Azure DevOps Server 2019\Tools 文件夹,可以执行 TFSConfig 命令,这个命令包含了很多的有用的命令。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
## 修改changeServerID,执行过程中可能出现卡住,关闭命令行,重新执行一遍就好了。其中的WIN-C7341PBVGMN为计算机名,出现的提示:只应对没有配置应用层的一组 Azure DevOps Server 数据库运行 ChangeServerId 命令,输入y即可,不要输入Yes。如果命令执行出错了,没关系,关闭命令行,再执行一遍好了。
TfsConfig changeServerID /sqlInstance:WIN-C7341PBVGMN /databaseName:AzureDevOps_Configuration

## 将Azure DevOps Server重定向到远程集合数据库
TFSConfig remapDBs /DatabaseName:WIN-C7341PBVGMN;AzureDevOps_Configuration /SQLInstances:WIN-C7341PBVGMN

## 注册已还原数据库的位置
TFSconfig registerDB /sqlInstance:WIN-C7341PBVGMN /databaseName:AzureDevOps_Configuration

## 重启服务
TFSServiceControl unquiesce

## 删除了缓存文件_tfs_data
E:\soft\AzureDevOpsData\ApplicationTier\_tfs_data

以 changeServerId 为例,changeServerId命令的作用主要是: 使用新的实例 ID 对Azure DevOps Server 实例及其所有集合重新进行标记。

命令的格式(蛋疼的格式,我光参考这个格式就用了很长时间):

1
2
3
4
5
6
## /sqlInstance是命令行参数的名字,这个参数的含义是要输入数据库的实例,冒号后面是参数的值;/databaseName是数据库的参数名,冒号后面是值,参数名,有些是必须输入的,就原样写就好了,也可以首字母大小比如写成/SQLInstance也是正确的,写/DatabaseName也是正确的。
TfsConfig changeServerID /sqlInstance:<serverName> /databaseName:<configurationDatabaseName>
[/projectCollectionsOnly] [/configDBOnly] [/collectionName]

## 例如:
TfsConfig changeServerID /sqlInstance:WIN-C7341PBVGMN /databaseName:AzureDevOps_Configuration

问题

(1) 数据库实例名是:计算机名
这里有一个问题,就是/sqlInstance这个参数,我无论指定MSSQLSERVER数据库实例名,还是计算机名\实例名,都会报错:TF246017: Azure DevOps Server 未能连接到数据库。请验证是否已正确指定实例,承载数据库的服务器是否能够正常运行,且没有网络问题阻止与服务器进行通信。

后来我以为是我的数据库还原时出错了,然后又重新还原了一遍,发现了数据库实例名是:计算机名,于是我重新用这个计算机名尝试。

果然,这个实例名 serverName 竟然是计算机的名字,输入y,进行下一步,最终命令执行成功。


(2) 当我执行了下面一系列操作之后,提示错误改变了:TF401054: 请求的服务级别属性 TFS_SERVICE_LEVEL 与所需值不匹配。Azure DevOps Server 需要 Dev17.M153.5 服务级别,但数据库当前实现的是 Dev17.M143.6。

根据错误提示: TF401054: 请求的服务级别属性 TFS_SERVICE_LEVEL 与所需值不匹配。Azure DevOps Server 需要 Dev17.M153.5 服务级别,但数据库当前实现的是 Dev17.M143.6。
意思是数据库不匹配?在参考文章2中,有这样一段话:

The version of SQL Server that you install must exactly match the version on the original server that hosted the databases. This requirement includes the service-pack level, the collation settings, and the language edition. If the match is not exact, you may not be able to restore the data, or Azure DevOps Server may not operate correctly even if you can restore the data.

意思就是要在新安装AzureDevops上还原数据,数据库的版本要和原先的数据库版本完全一致,否则可能无法还原数据库或者是AzureDevops可能不能正常工作。我的旧的AzureDevops是安装的SQL Server2017数据库,新的AzureDevops是SQL Server2019,我怀疑是这个问题。

好蛋疼啊,只能重新安装了吗?微软这步操作也做的太坑了吧,使用新的数据库还不行,必须使用旧的数据库才能完成备份和还原啊。


20200416更新
又是能量满满的一天。
(1) 我将新的AzureDevops的SQL Server2019数据库,换回了旧版AzureDevops使用的SQL Server2017数据库版本。然后重新执行第(3)步的TfsConfig changeServerID、TFSConfig remapDBs、TFSconfig registerDB等命令。

见证奇迹的时刻了,还是不行呢?还是出现了错误:“TF401054: The requested service level property TFS_SERVICE_LEVEL did not match the expected value. Azure DevOps Server requires the Dev17.M153.5 service level but the database currently implements Dev17.M143.6.”

(2) 我又重新查看了原先服务器上安装的AzureDevops版本,发现了在旧的服务器上安装的AzureDevops版本是:azuredevopsserver2019.0.1.exe,而新的服务器上安装的最新版:azuredevopsserver2019.1.1.exe。应该是这个问题。那么就应该使用的是升级AzureDevops版本的操作。

后来找到了TfsPreUpgrade.exe 这个工具,据官网说是可以进行升级的工具,死马当活马医吧。下载->解压,然后再解压后的目录中运行以下命令

1
2
## TfsPreUpgrade.exe Run /TargetDatabaseNames:"{SQL Instance};{Collection Database Name}",其中{SQL Instance}为实例名,默认的实例是:计算机名,我这里是WIN-C7341PBVGMN,{Collection Database Name} 是集合数据库的名字,我这里第一次尝试使用了 AzureDevOps_Configuration
TfsPreUpgrade.exe Run /TargetDatabaseNames:"WIN-C7341PBVGMN;AzureDevOps_Configuration"

结果失败了:“TfsPreUpgrade cannot be run on these databases. The deployment is already at or beyond Team Foundation Server 2015 - this build of TfsPreUpgrade is not relevant to these versions.”

意思是版本不对?

(3) 于是我在备份还原数据库之后,又重新卸载了AzureDevops2019.1.1版本,然后重新安装了老版本AzureDevops2019.0.1。

其实我有点搞不懂官方的升级文档,官网的升级文档中只是提了升级前的准备,然后清理数据,然后是各种先前版本的2018、2017的升级等,但是就是没有说明白如何进行升级,就算下载了TfsPreUpgrade.exe工具,还是不可以的,因为这个工具只针对老版本进行的升级操作。下面有句话就是说,安装新版本,然后执行升级。难不成是直接安装最新版,覆盖旧版本就可以了吗?在安装完旧版之后,可以进行尝试使用升级的方式进行升级。

After you finish your preparation, install the new version. Get the binaries and run through the installation process to upgrade your servers.

安装完AzureDevops2019.0.1之后,自动打开配置中心->启动向导->选择现有的数据库->高级,然后一项项的和安装的时候进行的一模一样。

(4) 虽然能成功的启动网站了,但是貌似还是有些问题,无法访问页面

要在管理控制台上将集合启动,才能正常访问网站。

可喜可贺啊,可喜可贺啊。项目都在,用户都在。终于完成了数据的备份和还原。


(3) 关于数据备份时文件夹权限的问题

我对比了两个能成功部署的文件夹权限,发现其中都添加了数据库实例用户的名字。所以数据实例对这个文件夹具有访问权限。

但是当我们点击编辑->点击添加权限的时候,是找不到这个用户的,这就是问题所在。


(4) TF30046: 实例信息不匹配。找不到 Azure DevOps 需要的 65ed6567-e33d-4c10-a36b-84aa8bf0ea5b。请与 Azure DevOps Server 管理员联系。

5.剩余步骤

(1) 修改公共url
在管理控制台中,修改公共的url路径。

(2) 添加本机用户为:管理控制台用户,至于其他的用户,因为AzureDevops的认证,似乎是借助于Windows自带的认证,所以相关的人员配置也要在新的电脑上,创建新的用户,然后配置权限,否在登录不上去。

虽然用户名密码不重新配置无法使用,但是曾经使用过的ssh方式进行连接,似乎还是可以的,使用ssh进行代码推送拉取等操作不受影响,但是你在配置ssh密钥的时候,又找不到这些已经配置了的key。

6.总结

经过进两天的间断尝试,我终于完成了AzureDevops的备份和还原,总结一下。

(1) 备份时要设置备份计划,并且要备份到网络文件夹中,这个文件夹要能被SQL Server实例所访问。对这个网络文件夹设置用户权限的时候,执行立即搜索,没有SQL Server实例的用户怎么办?可以通过备份到本机的一个共享目录上,然后将里面的内容,拷贝到另一台机器上,然后重新设置这个目录进行共享,这样在新机器上,就可以使用这个文件夹里面的备份内容进行恢复了。

(2) 还原时,需要注意,就是AzureDevOps的版本要一致,否则就会出现问题。

(3) 还原数据库之后,要执行 TFSconfig 的一系列命令,才能使AzureDevops实现正常的数据库访问。

(4) 数据库还原成功,AzureDevops重新配置成功,还要注意集合要启动之后,网站才能正常访问。

(5) 升级的步骤:升级AzureDevops,备份数据库,然后卸载重新安装数据库。

小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。