无法从另一个SQL Server连接到命名实例的SQL Server

15

我已经卡了两天,希望能得到一些帮助!

情况:我可以从我的开发机器(和另一个同事)连接到 SERVER\INSTANCE,但无法从另一个 SQL Server 连接。我收到的错误是通用的“...验证实例名称是否正确..”。我做/验证的事情如下:

  1. 我已禁用目标服务器(和源服务器)上的防火墙,以查看它是否是防火墙问题(由于我可以从我的机器连接,这似乎最有可能,但没有帮助)。

  2. 我已验证 SQL Browser 是否正常工作(因为我可以从开发机器连接)

  3. 由于两个 SQL 服务器都具有多个实例和硬编码端口,我甚至确保它们是不同的端口,以防有冲突(但这没有帮助)。

  4. 我已重启 SQL Server 并验证浏览器/实例服务正在运行

  5. 检查事件日志-没有值得注意的

  6. 有趣的是,如果我不通过实例名称连接而是通过第二个服务器上动态端口(即SERVER,PORT)进行连接,则可以正常工作-这表明 SQL Browser 有问题,除了在本地服务器和我的开发机器上正常工作外。

有什么想法和建议吗?谢谢。

编辑:为了澄清评论,我将把数据 SQL Server 称为 SQLA,非数据 SQLB。

编辑#2:添加更多测试用例/信息:

信息:上述测试都是通过 SSMS 接口进行的,以建立到数据库的连接,涉及的数据库均为 2012。

新测试用例:我尝试运行一个脚本来设置链接服务器,结果发现在 SQL Server 2005 箱上运行脚本很好用,但在 SQL Server 2012 服务器(SQLB)上运行相同的脚本无法连接到 SQLA,并显示错误:SQL Server Network Interfaces:Error Locating Server/Instance Specified [xFFFFFFFF]。

编辑#3:缩小潜在问题范围:

下载并运行了PortQry,在我的开发机上查询1434号端口时,所有实例都被返回。但是从SQLB运行相同的查询,没有实例被返回,并且它将1434标记为已过滤,而在开发机上则返回为已列出。我只能想到这与防火墙有关,尽管我已在两台机器上禁用了防火墙。


在控制面板 - 管理工具 - ODBC 中。请注意,在64位机器上,有一个64位和一个单独的32位ODBC管理器。 32位版本位于:C:\ Windows \ SysWOW64 \ odbcad32.exe。 - granadaCoder
@granadaCoder - 如果我使用端口样式SQLA,PORT而不是SQLA/INSTANCE,我可以从(让我们称非数据的为SQLB,数据的为SQLA)连接,似乎只有在尝试连接实例时才无法通过。 - user1839820
好的...让我搜索一些东西..给我几分钟。 - granadaCoder
当您尝试将SQLB与SQLA连接时,您的“连接字符串”是什么(我使用了这个术语)?您是否执行了“sp_addlinkedserver”?(这是您尝试让它们彼此通信的方式吗?) - granadaCoder
@RBarryYoung 在这个设置中没有域,每个SQL服务器都是独立的(并且连接是通过SA帐户进行的,因此不涉及Windows身份验证)。 - user1839820
显示剩余4条评论
9个回答

15

当你无法通过 "ServerName\Instance" 连接,但可以通过 "ServerName,Port" 连接到服务器时,这是在使用 Microsoft VPN 连接到网络时发生的情况(我曾遇到这个问题)。对于我的 VPN 问题,我只需使用静态端口号来解决它。

显然,这是由于 VPN 不转发 UDP 数据包,只允许 TCP 连接。

在你的情况下,你的防火墙、安全设置或杀软等可能会阻止 UDP。

我建议你检查你的防火墙设置以特别允许 UDP

浏览器文档

在启动时,SQL Server Browser 启动并声明 UDP 端口 1434。SQL Server Browser 读取注册表,在计算机上识别所有 SQL Server 实例,并记录它们使用的端口和命名管道。当一个服务器有两个或多个网络卡时,SQL Server Browser 将返回为 SQL Server 启用的所有端口。SQL Server 2005 和 SQL Server Browser 支持 ipv6 和 ipv4。

当 SQL Server 2000 和 SQL Server 2005 客户端请求 SQL Server 资源时,客户端网络库使用端口 1434 向服务器发送 UDP 消息。SQL Server Browser 以所请求实例的 TCP/IP 端口或命名管道进行响应。然后客户端应用程序上的网络库通过使用所需实例的端口或命名管道向服务器发送请求,从而完成连接。

使用防火墙

要与防火墙后面的服务器上的 SQL Server Browser 服务通信,在 SQL Server 使用的 TCP 端口之外,还需要打开 UDP 端口 1434。


1
VPN只是我举的一个例子,说明了一个阻止UDP流量的系统。如果您可以通过端口号连接,则建立了一个TCP/IP连接,没有涉及任何其他协议。如果您的两个数据库实例位于不同的计算机上,则它们之间存在某种级别的网络。在我的公司网络中,我们在服务器系统之间有相当多的防火墙规则,有时甚至在同一物理位置。如果路由器位于它们之间并且不允许UDP流量通过,则该系统可能是阻止点。除此之外,几乎没有其他可能导致问题的情况。 - DarrenMB
值得注意的是,大多数企业系统根本不使用SQL Server实例。这就是为什么这种问题很少出现的原因。使用默认实例和默认端口时,SQL浏览器服务完全未被使用。 - DarrenMB
1
@DarrenMB 虽然我同意你说的其他所有内容(+1),但关于企业系统不使用 SQL Server 实例的最后一点绝对是正确的。我为许多大型公司工作,其中绝大多数都使用实例名称,而且大多数都广泛使用它们。与它们的名称有问题通常相当罕见且很容易解决。 - RBarryYoung
1
(顺带一提,我一直怀疑你的答案最有可能是正确的 :-) ) - RBarryYoung
2
没错。我进入了“高级安全的Windows防火墙”,在那里我启用了我的传入规则,这是针对TCP上的端口1433到任何端口的,在“端口和协议”选项卡中。然后它就起作用了。谢谢! - ilans
显示剩余2条评论

6
不确定这是否是您要找的答案,但它对我有用。 在Windows防火墙中摸索后,我回到了SQL Server配置管理器,在SQL Server网络配置中检查了一下使用的实例的协议,看了一下TCP/IP。 默认情况下,我的设置似乎被禁用了,这允许在本地计算机上进行实例连接,但无法使用另一台计算机上的SSMS连接。 启用TCP / IP对我很有效。 http://technet.microsoft.com/en-us/library/hh231672.aspx

1
这正是我的问题,你的解决方案帮了我大忙。我进入了SQL Server配置管理器>> SQL Server网络配置>> MSSQLSERVER20126协议>> TCP/IP并启用它。我现在可以从其他机器连接到指定实例了。 - Raghav

4
我终于找到了问题所在。尽管两个位置的防火墙都已关闭,但我们发现SQLB数据中心的路由器正在主动阻止UDP 1434端口。我通过安装微软的PorQry工具(http://www.microsoft.com/en-ca/download/details.aspx?id=17148)并针对UDP端口运行查询来确定这一点。然后我安装了WireShark(http://www.wireshark.org/)以查看实际连接详细信息,并找到了拒绝转发请求的路由器。由于此路由器仅影响SQLB,因此可以解释为什么其他每个连接都正常工作。

感谢大家的建议和帮助!


1
没问题。被标记为“答案”会很好。这就是我认为是你的问题的原因 :) - DarrenMB

3
你已经尝试了很多。我感到难过。 这里有一个想法,我跟进了你尝试的每一步。 我的脑海中有一个念头: "当Sql Server 在尝试所有方法都无法连接时,请按程序而非端口规划您的防火墙规则"

我知道你说过你已禁用了防火墙。但还是让我们试试吧。
我认为您必须按“程序”开放防火墙,而不是按端口。 http://technet.microsoft.com/en-us/library/cc646023.aspx
To add a program exception to the firewall using the Windows Firewall item in Control Panel.


On the Exceptions tab of the Windows Firewall item in Control Panel, click Add a program.


Browse to the location of the instance of SQL Server that you want to allow through the firewall, for example C:\Program Files\Microsoft SQL Server\MSSQL11.<instance_name>\MSSQL\Binn, select sqlservr.exe, and then click Open.


 Click OK.

编辑..........

http://msdn.microsoft.com/zh-cn/library/ms190479.aspx

我有点不确定您在 SQLB 上尝试使用哪个“程序”?

是在 SQLB 上使用的 SSMS 吗?还是在 SQLB 上使用的客户端程序?

编辑...........

不知道这是否有帮助。但我使用这个来ping“端口”,和SSMS世界之外的一些东西。

http://www.microsoft.com/zh-cn/download/details.aspx?id=24009


不确定这是否有帮助或导致更多混乱,但我尝试连接到默认实例(即没有实例名称),SQLB可以成功连接到SQLA,但如果我尝试使用实例名称连接到默认实例,则会失败。 - user1839820
1
你在 SQLB 上使用 SSMS 的方式是什么?比如,当凭据屏幕出现(当你第一次启动 SSMS 时),你是输入 servername\instance(指的是 SQLA)和一个在 SQLA 上存在的用户的用户名吗?还是以“sa”的身份登录到 SQLB,然后使用 TSQL 尝试连接回 SQLA? - granadaCoder
在 SSMS 登录窗口中...转到“连接属性”...尝试选择“Tcp/Ip”...以避免命名管道尝试。 - granadaCoder
尝试重新安装“功能包”。(我认为这是出于绝望)http://www.microsoft.com/en-us/download/details.aspx?id=29065 - granadaCoder
1
你应该将其中一个回答标记为“答案”,并点赞那些给出有用信息的人的回答。是的,我不确定你是否看到了,但我提到了http://www.microsoft.com/en-us/download/details.aspx?id=24009作为PortQry工具,它讲述了关于与不同IP:端口通信的快速故事(我知道那只是你发现的一部分)。 - granadaCoder
显示剩余6条评论

2
你的开发机器上是否定义了任何客户端别名?如果是,请在SQLB上定义相同的别名。具体来说,我怀疑你已经使用实例名称格式定义了客户端别名,从而绕过了实际实例名称和需要SQL浏览器(部分)的需求。还有其他可能性与客户端别名相关,因此请确保它们是相同的。
要检查SQL客户端别名,请使用SQL Server配置管理器(在Microsoft SQLServer、程序开始菜单中)。在那里,转到客户端配置,然后是“别名”。
其他需要检查的事项:
1. SQLA和SQLB是否在同一个域中,或者它们之间没有信任问题。 2. 确保SQLB启用了TCP/IP作为客户端协议(这也在SQL配置管理器中)。
通过你的一些回复,我认为你可能错过了我关于域和信任的陈述的重点。除非客户端和服务器之间有足够的信任,否则无法连接到SQL“Server\Instance”。这是因为SQL Server使用的整个实例命名方案依赖于SPN(服务主体名称)进行发现、定位和授权,并且SPN存储在AD中。因此,除非客户端在同一台计算机上,否则实例需要能够注册其SPN,并且客户端需要能够浏览服务器实例将其SPN注册到的任何AD林。
如果你无法这样做,那么实例名称实际上不起作用,你必须使用端口号(或管道名称)代替。我现在怀疑这就是正在发生的事情。

感谢您的评论 - 我没有定义任何别名,并且我能够在我拥有的 SQL Server 2005 实例上重现“良好”的行为,我成功地向“SQLA”添加了一个链接服务器。 在 SQLB 上运行相同的脚本未能接收 UDP 数据包。 这就像 SQLB 无法协商(尽管没有启用防火墙)到 SQLA - 但它可以与自己的 SQL 浏览器进行协商(它可以自由访问自己)。 - user1839820
2
我认为本地连接不需要SQL浏览器。 - RBarryYoung
这是一个有趣且正确的观点,在本地系统上不需要SQL Browser服务,因此我的测试一开始就存在缺陷。 - user1839820

2
  1. 我必须在SQL配置管理器中指定一个端口 > TCP/IP
  2. 打开防火墙上的端口
  3. 然后使用以下方式进行远程连接:"服务器名称\其他数据库实例,(端口号)"
  4. 已连接!

1

经过约10天的尝试解决此问题,今天我终于找到了解决方法并决定发布出来。

在开始菜单中,输入RUN并打开它,在运行框中键入SERVICES.MSC,然后点击确定。

确保这两个服务已启动: SQL Server(MSSQLSERVER) SQL Server Vss writer


0

我需要做2件事才能连接到实例名称

1. Enable SQL Server Browser (in SQL server config manager)
2. Enable UDP, port 1434 trong file wall (if you using amazon EC2 or other service you need open port in their setting too)

重启 SQL,完成


0
要解决这个问题,您必须确保托管 SQL Server 的计算机上满足以下条件...
  1. 确保服务器浏览器服务正在运行。
  2. 确保启用了TCP/IP通信,以便与网络上的每个实例进行通信。 enter image description here
  3. 如果运行多个实例,请确保每个实例使用不同的端口,并且该端口未被使用。例如,对于两个实例,第一个实例使用默认端口1433,第二个实例使用命名实例1435。 enter image description here
  4. 确保防火墙允许通过UDP协议在端口1434上与SQL Server浏览器进行通信。
  5. 确保防火墙允许通过TCP协议在步骤3中分配给它们的端口上与SQL Server实例进行通信。 enter image description here

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接