我这里有一个有趣的情况。我们基本上是在尝试将一些 SQL Server 基础架构迁移到新硬件,其中一个盒子(单实例、2 节点集群)正在运行 2008R2。其他是 2012 年和 2014 年,但没有出现此问题。
有一个应用程序连接到名为“OLD-SQL”的服务器;假设 IP 是 11.22.33.44。这是运行默认实例 SQL 2008R2 和 Windows Server 2008R2 的旧版 SQL 框的名称。目前无法更改应用程序的连接设置/配置/字符串/任何内容。
设置为替换那个新 SQL 框的新 SQL 框被命名为“NEW-SQL”;假设它的 IP 是 11.22.33.55。还运行 SQL 2008R2(相同的 SQL 构建)。操作系统是 Windows Server 2012 R2(较新的操作系统)。这两个盒子实际上都是集群实例,每个都有 2 个节点(老式的故障转移集群,没什么特别的)。
因此,为了帮助迁移,目前,出于测试/QA 的目的,我们已经完成了以下操作: 1. 在客户端 QA 机器上设置 Hosts 文件,将名称“OLD-SQL”重定向到 11.22.33.55(新服务器)。2. 在 NEW-SQL 服务器上创建一个 SQL Server Alias(使用 SQL Config Mgr.),命名为“OLD-SQL”,指向自身,端口 1433,协议 TCP/IP。
为了测试它,我尝试通过 SSMS 连接;我输入“OLD-SQL”作为要连接的服务器名称。它因臭名昭著的“SSPI 上下文”错误而失败 ( https://support.microsoft.com/en-us/kb/811889 )。正在测试的应用程序也会发生同样的事情。来自 cmd-line 的 Ping 解析正常——它知道“OLD-SQL”解析为基于主机文件的新 IP 11.22.33.55。
现在,真正地把事情搞砸了。我回到服务器 NEW-SQL,并添加另一个别名,相同的参数但命名为“OLD-SQL2”。此名称在域网络中是唯一的。我回到我的盒子,更改我的主机文件以从该名称指向 IP (11.22.33.55),然后转到 SSMS 并尝试再次连接。 这行得通!
我通过执行 a 验证我是否在“正确的服务器”上SELECT @@SERVERNAME
,然后瞧瞧,它说“NEW-SQL”。但这当然不是我真正想要的别名;我希望能够为其提供别名“OLD-SQL”,并通过主机条目和 SQL 别名将我的应用程序重定向到“NEW-SQL”。
那么我对第一个别名做错了什么?只是我不能使用与网络上现有服务器相同的名称,2008R2?
SO 上的类似帖子:https ://stackoverflow.com/questions/6406811/alias-not-working-on-sql-server-2008-r2 (未解决问题)
PS:我特别说“使用 2008R2”,因为当我尝试使用我们的 2012-2014 盒子进行相同的设置(主机、SQL 别名)时,它们以第一种方式工作得很好!(即“NEW-SQL2012”框中的别名可以是“OLD-SQL2012”,与现有服务器相同,连接或任何问题都没有问题。)
PPS:我确实读到过这些别名更像是客户端的东西,但这就是我使用 Hosts 文件技巧的原因。当我们准备好进行“真正的”迁移时,我们将使用 DNS 和我所不知道的其他技巧(这是 SysEng 的领域)来将客户端(应用程序/计算机)重定向到新服务器,但他们现在说,对于测试,Hosts 文件是一个很好的替代品。
更新:“工作”设置和“非工作”设置之间的主要区别,除了 SQL Server 版本之外,是旧的 2008R2 实例“SQL-OLD”,当我使用“原始”设置连接时(没有别名或主机文件重定向。),使用Kerberos身份验证。当我通过唯一别名或重定向(例如“OLD-SQL2”)连接时,它注册为 NTLM。在所有其他工作连接方法中,它也是 NTLM。Kerberos 到底在对我做什么??
总结我们在聊天中发现的内容。
通过网络连接时,如果 Windows Server 使用服务主体名称 (SPN) 在 Active Directory (AD) 中注册,则尝试使用集成身份验证连接的客户端将从 AD 获取与服务器名称匹配的 AD 对象的 Kerberos 令牌附加到身份验证。当连接的服务器没有 SPN 或使用 SQL 身份验证连接时,将不会使用 Kerberos。
在这种情况下,因为“OLD-SQL”仍然在 AD 中注册并且有一个 SPN 注册欺骗,本地主机文件中的 DNS 在使用集成/Windows 身份验证时将不起作用,因为没有调整返回哪个令牌/从公元使用。似乎没有办法让客户端知道将 Kerberos 令牌用于“NEW-SQL”,而原始“OLD-SQL”服务器仍在使用中,除了从 AD 中删除“OLD-SQL”SPN强制身份验证回退到 NTLM。欺骗 DNS 适用于不是在 AD 中注册的实际计算机名称或没有注册 SPN 的别名,因为 AD 不会为它们返回令牌,因此身份验证回退到使用 NTLM。
参考
了解 Kerberos 密钥
注册 SPN