起因

七月三日早晨刚到公司,同事就跟我讲TFS开始返回 TF30042错误,报告数据库已满。按照处理问题的第一直觉,我上bing的英文网站搜了一下,发现是部署TFS的时候使用的SQL Express限制导致的。于是就开始漫长的数据库迁移之旅。

第一阶段:自信满满

给整个开发团队发了消息,通知TFS临时中断半小时到一小时。关停了TFS所有的相关服务,找到SQLExpress的数据库文件,然后拷贝到数据库服务器上。由于数据库文件比较大,拷贝大概花了半小时。由于最近在思考怎么制定一个比较好的发布流程,在这个拷贝过程中,把基本的发布工具的设计确定了下,还有点沾沾自得。拷贝完成后开始附加数据库,结果SQL服务器提示现有数据的版本过高,无法兼容。检查了一下SQL Expres的版本,要比SQL 2008R2高个好几十,随手百度了下,也没找到820版本对应的数据库的发行版本号,一狠心决定部署下SQL 2016,正好可以研究一下SQL 2016对结构化数据(json等)执行属性查询的功能。于是又开始了下载过程。又花了半个多小时,期间给团队成员发了个延期通知,许诺下午一点钟之前搞定。一边等待下载,一边继续写工具,虽然麻烦,但是一切尽在掌握。

第二阶段:略有腹诽

终于下载完安装镜像,准备开始部署数据库服务。但是安装程序提示当前运行的服务器为WIN SERVER 08R2,SQL 2016不支持。于是又开始着手准备兼容的WIN Server服务器环境。当时也没有细想,直接就选用了WIN SERVER 2016。下载大概花了一个小时,慌里慌张的,中途还把语言包当作安装文件下载下来了。中途去开了一个会议,回来的时候,已经下午三点钟了,显然的,给团队的承诺已经无限延期了。由于服务器有点久了,而且是在虚拟机上安装,安装过程持续了大概四十分钟。然后部署数据库服务、迁移数据库文件。迁移完成之后,需要将TFS的数据库绑定重定向。这里有几个做法:1:修改配置文件 2:使用TFS的配置工具,初始化当前配置,并重新配置数据库。出于慎重考虑,选择了第二种。参考:http://www.accentient.com/blog/unconfiguring-team-foundation-server-2013/

tfsconfig setup /uninstall:all

重新启动TFS的配置管理器进行TFS配置。执行到数据库这一步的时候,发现只能填写一个host名称,无法提供登陆信息。于是开始了各种脑补:TFS默认配置了一个登陆身份信息?TFS使用了一个配置文件?TFS仅支持基于域服务器场的部署?好吧,鉴于微软的方便使用、无脑点击下一步的作风,最后一个可能性最大。还是通过bing搜索了下,找到了肯定的答案。参考:https://serverfault.com/questions/457006/how-to-connect-tfs-2012-with-a-remote-database-using-sql-server-authentication 以及 https://serverfault.com/questions/457006/how-to-connect-tfs-2012-with-a-remote-database-using-sql-server-authentication

心中虽然腹诽,但是还算是松了一口气,毕竟简单的集成域环境也还简单。看下时间,已经五点半了,于是依然开始了无尽之旅。

第三阶段:无尽的折磨

按照一般性套路,开始修改客户机的dns,指向dc的ip,同时为dc所在的服务器添加了一条host,防止一些乱七八糟的无法访问。点击加域。5秒,15秒,30秒......无法找到网络路径。虽然心里奇怪,但是还是继续bingstackoverflowserverfault,同时也象征性的百度。然后不停检查TCP/IP NETBIOS Service,检查文件和打印机共享,检查dns,检查和禁用ipv6,检查防护墙防火墙例外,关闭、开启防火墙,检查hdcp,检查ip,检查ping。马不停蹄的检查了三四个小时,仍然无果之后开始自检,首先查看window server的日志,发现返回状态码53,然后检查system windows debug下的日志,发现net use 指令导致了53的结果码。然后开始疯狂的搜索与net use相关的,与53状态码相关的,与network path not found相关的资料,开始拿不同的服务器做对比实验。最后发现,win server 2008r2的服务器都能成功入域,而win server 2016与win 10都无法成功。开始推测时客户机的问题,然后再一次对客户机做了各种检查,仍然无果。

对客户机和服务器的行为总结如下:

  • 网络通信正常,进行入域请求的时候,可以正常接收到401的认证相应
  • 可以提交身份认证信息,但是无法成功认证,即使提供了错误的用户名和密码,也无法得到认证结果
  • net use \host\$IPC 指令无法正常使用

期间好几次想先放一放,但是每次都有一种错觉,似乎这个问题马上就要解决了。等到实在困得不行的时候,已经过了凌晨一点,实在是乏的不行,加上还连累另外一个同事一起,遂作罢。

第三阶段:柳暗花明

休息了一晚上,信心又足了很多,决定继续怼这个问题。还是从net use这个指令开始,还是以大量的搜索为基础。在搜索的过程中,发现了net的另外一个指令,net view。这个指令时用来查看共享文件夹的。共享文件夹这个名词让我突然想到一件事情,以前公司为了共享安装包,在服务器上开了共享目录。但是有一天win 10的机子全部无法访问了,而win 7和win server 2008r2都正常。猜测可能是相同的原因。于是开始搜索和收集这方面的资料。在一个论坛里面,偶尔看到了一句评论,和SEP 12也就是证书有关。又突然想起来,年中的时候为了测试微信小程序,在服务器上安装了证书(误操作),同时升级了服务器的TLS版本.......或许大家以为我马上要发现了真相,走进了科学 ——其实不然,我觉得越发头大了,因为这里的可能性太多了,所以我打算换个思路解决问题。

从net use和net view这两个指令的执行情况来看,应该是服务器的设置问题,导致了部分客户机无法访问,所以我向换个服务器——也就是迁移DC。迁移DC就得首先安装备用的DC,参考:http://www.cnblogs.com/yankliu-vip/archive/2012/06/13/2547646.html

dcpromo

安装完之后,突然又想到,其实我并不一定要主控DC迁移,我需要的是一个可以正常加域的入口,于是我将客户机的DNS指向了新配置好的DC。接下来操作,就比较丝滑了。

回顾与总结

总的来讲,在这个将近二十个小时里面,我经历了这些:

TFS数据库满了=>发现由于sqlexpress的限制=>计划升级sql服务版本=>sqlexpress的内核版本很高=>安装sql2016=>sql2016不支持winserver2008r2=>安装winserver2016=>部署时发现不支持数据库用户身份验证=>集成域环境=>winserver2016无法加入winserver2008r2的域环境=>bingstackoverflowserverfault=>都不满足=>继续bingstackoverflowserverfault=>发现别人在贴日志=>分析日志=>net use指令返回53=>bingstackoverflowserverfault=>都不满足=>论坛里面有人提到SEP12证书的问题=>删除域控下面安装的证书=>无效=>继续搜索net use指令相关问题=>尝试使用net view指令=>发现win10和winserver2016都无法使用共享文件夹相关的功能=>回忆起来以前win10是可以网络共享的=>回忆起来这似乎是和升级了TSL版本有关=>意识到自己做了很多无用功=>尝试使用tfsdeleteproject先删除部分项目释放空间=>发现由于数据库满了,删除功能无法正确使用=>

意识到可以通过新建项目集合的方式来处理,但是由于数据库已满,放弃=>继续从DC这个点解决问题,决定迁移DC到一个干净的环境=>安装了新的备份DC=>对备份DC 执行net use指令一切正常=>意识到可以将客户机的dns指向备份dc来解决问题=>成功加入域=>尝试在其他的服务器上部署tfs=>发现tfs版本不兼容迁移的数据库=>升级tfs版本到update1=>开始迁移=>数据库登录名冲突=>更改登录名=>全文索引服务未安装=>安装全文索引服务。

虽然我只是兼个部署,但是回头想想,其实很能发现问题:

  • 部署管理有问题,DC不应该和其他角色混淆
  • 使用产品的时候,没有仔细阅读产品说明书
  • 对当前部署的产品的版本没有清醒的认识
  • 决策的时候,没有仔细收集资料,没有分析可行性
  • 决策冲动,很多时候为了直观而增加了复杂度
  • 分析问题的方式有问题,很多时候应该从当前环境的日志着手,而不是盲目的binggooglestackoverflow
  • 解决问题的思路有问题,很多时候绕道其实是更好的选择
  • 做部署工作的时候,千万不好和环境讲道理

    当然这次经历也不尽是坏事,总的来讲,我确认了一点,我确实拥有一颗还算坚韧的心。

关于net use 53 以及 network path not found

这个问题尚未解决,欢迎道友指路。

微软虐我千百遍——记一次比较漫长的TFS数据库迁移的更多相关文章

  1. JAVA_集合框架虐我千百遍,虐也是一种进步

    1.Collection和Collections区别: Collection是java的一个集合接口,集合类的顶级接口 Collections是一个包装类(工具类),不能被实例化(由于其构造函数设为私 ...

  2. Maven 虐我千百遍,我待 Maven 如初恋

    前言 在如今的互联网项目开发当中,特别是Java领域,可以说Maven随处可见.Maven的仓库管理.依赖管理.继承和聚合等特性为项目的构建提供了一整套完善的解决方案,可以说如果你搞不懂Maven,那 ...

  3. Maven虐我千百遍,我待Maven如初恋

    前言 在如今的互联网项目开发当中,特别是Java领域,可以说Maven随处可见.Maven的仓库管理.依赖管理.继承和聚合等特性为项目的构建提供了一整套完善的解决方案,可以说如果你搞不懂Maven,那 ...

  4. 一个虐你千百遍的问题:“RPC好,还是RESTful好?”

    看到知乎上有这样一个问题 WEB开发中,使用JSON-RPC好,还是RESTful API好? 还有其他优秀的推荐方案吗? -------------------------------------- ...

  5. 漫说测试 | 研发虐我千百遍,我待bug如初恋

    的行业之一他们的运筹帷幄,他们的勾心斗角,只有自己知道.000,但绝对也是最枯燥的行业之一! IT可能是几个最高薪行业之一,但同时也绝对是最辛苦的行业之一!IT业是最需要创新能力的行业之一,但绝对也是 ...

  6. 硬不硬你说了算!35 张图解被问千百遍的 TCP 三次握手和四次挥手面试题

    每日一句英语学习,每天进步一点点: 前言 不管面试 Java .C/C++.Python 等开发岗位, TCP 的知识点可以说是的必问的了. 任 TCP 虐我千百遍,我仍待 TCP 如初恋. 遥想小林 ...

  7. 被 GANs 虐千百遍后,我总结出来的 10 条训练经验

    一年前,我决定开始探索生成式对抗网络(GANs).自从我对深度学习产生兴趣以来,我就一直对它们很着迷,主要是因为深度学习能做到很多不可置信的事情.当我想到人工智能的时候,GAN是我脑海中最先出现的一个 ...

  8. Java千百问_05面向对象(005)_接口和抽象类有什么差别

    点击进入_很多其它_Java千百问 1.接口和抽象类有什么差别 在Java语言中.抽象类abstract class和接口interface是抽象定义的两种机制. 正是因为这两种机制的存在,才赋予了J ...

  9. Java千百问_05面向对象(011)_引用传递和值传递有什么差别

    点击进入_很多其它_Java千百问 1.什么是值传递 值传递,是将内存空间中某个存储单元中存放的值,传送给还有一个存储单元.(java中的存储单元并不是物理内存的地址,但具有相关性) 比如: //定义 ...

随机推荐

  1. Java图书管理系统(用Java常用集合实现)

    图书管理系统 一.需求说明 1.功能:登录,注册,忘记密码,管理员管理,图书管理. 2.管理员管理:管理员的增删改查. 3.图书管理:图书的增删改查. 4.管理员属性包括:id,姓名,性别,年龄,家庭 ...

  2. R语言&页游渠道分析(转)

    对着满屏的游戏后台数据,需要快速了解数据特征,一种茫然无从下手的感觉? 本文在游戏后台数据中,如何通过R语言快速的了解游戏后台的数据特征,以及统计各个数据之间的相关系数,并通过相关图来发现其中相关系数 ...

  3. 浅谈C语言指针

    下面就几种情况讨论指针. 一.指针和变量 变量是存储空间的别名,访问形式是直接访问. 指针访问内存地址是间接访问. 使用指针访问内存的场合:1.局部变量,参数传递    2.动态分配内存 指针本身也是 ...

  4. Linux OS共享文件

    背景: 相较于windows.unix等OS,Linux因为其开源.安全.稳定.性能优越等优点,已越来越受到互联网的青睐.而我们在学习和使用Linux也就会考虑到Linux机器和我们日常用的windo ...

  5. JVM-1.编译

    目录 一.编译器概述 二.编译器组成 三.示例 四.深入理解JVM中的编译器 五.语法糖 六.补充     一.编译器概述 1.编译器实质 编译器的实质是将一种语言规范转化为另一种语言规范:由人容易理 ...

  6. 惊心动魄的SAP S4客户额度调整运动

    今天一大早,收到商务部发来的消息,说某一个客户的额度超额了,但实际上并未超额.从SAP系统中反馈的额度来看,显示超了2万多.后来经过在BP画面检查信用段发现,这个客户额度占用里面,某一个未清订单已经部 ...

  7. JS学习笔记——数组去重

    <script type="text/javascript"> //indexOf"是ECMAScript5方法,IE8以下不支持,需多写兼容低版本浏览器代码 ...

  8. CVE-2017-8464远程命令执行漏洞(震网漏洞)复现

    前言 2017年6月13日,微软官方发布编号为CVE-2017-8464的漏洞公告,官方介绍Windows系统在解析快捷方式时存在远程执行任意代码的高危漏洞,黑客可以通过U盘.网络共享等途径触发漏洞, ...

  9. 代码管理器 TFS2013

    多人开发代码管理器肯定是少不了的,出于项目需要在服务器上装了tfs2013用于代码管理,既然用vs进行开发自然选择微软自家的tfs.记录下安装和使用起来的过程. 安装 TFS2013(Team Fou ...

  10. javascript基础数据类型与引用类型

    javascript一共有6种数据类型 有5种基本类型:Null,String Number,Boolean,Undefined 和一种引用类型Object 基础类型在内存中存在于栈空间中,例如 va ...