如何解决错误 26:“Error Locating Server/Instance Specified”

Mic*_*art 6 sql-server sql-server-2012 connectivity

我正在尝试配置对我的 SQL Server 命名实例(名为 SQL2012)的 TCP 访问。我使用管理工作室连接到数据库引擎。我输入服务器名称:“tcp:localhost\SQL2012”,然后收到此错误消息:

(提供者:SQL 网络接口,错误:26 - 错误定位服务器/指定的实例)

SQL Server 团队的这篇文章似乎非常有用,他们建议使用 PortQry 测试 SqlBrowser 服务。当我这样做时,我会得到以下信息:

Querying target system called:

 localhost

Attempting to resolve name to IP address...


Name resolved to 127.0.0.1

querying...

UDP port 1434 (ms-sql-m service): LISTENING or FILTERED

Sending SQL Server query to UDP port 1434...

Server's response:

ServerName MSWART7
InstanceName SQL2012
IsClustered No
Version 11.0.5058.0
tcp 52329

   ?K   K P?K 5 - 2 1 qK 1 4  rK 8 7 0?    1 qK

==== End of SQL Server query response ====
Run Code Online (Sandbox Code Playgroud)

果然,当我指定服务器名称“tcp:localhost,52329”时,我能够连接到数据库

我不确定我错过了什么。SQL 浏览器似乎正在运行,端口和防火墙似乎是开放的或不相关的(我正在尝试连接到本地主机)。

我接下来看哪里?

Aar*_*and 4

当您尝试连接到本地实例时,SQL Server 将始终尝试使用共享内存。此连接将正常工作:

localhost\SQL2012
Run Code Online (Sandbox Code Playgroud)

这在我的场景中有效,并且在这种情况下连接确实使用共享内存。

SELECT session_id,net_transport,local_net_address,local_tcp_port
FROM sys.dm_exec_connections;
Run Code Online (Sandbox Code Playgroud)

结果:

session_id  net_transport   local_net_address   local_tcp_port
----------  -------------   -----------------   --------------
53          Shared memory   <local machine>     NULL
Run Code Online (Sandbox Code Playgroud)

如果您想尝试覆盖共享内存(不知道为什么,在本地计算机上)并强制使用 TCP/IP,则不能将其与显式指定命名实例混合在一起,至少在我尝试过的所有实例中(没有双关语意图) )。命名实例强制 SQL Server 使用 SQL Server 浏览器将实例名称映射到端口号,但是当您首先强制使用 TCP/IP 时,这显然无法完成(使用 TCP/IP 的全部意义在于您可以直接进入端口,无需浏览器)。如果您的命名实例碰巧在其自己的 IP 地址上运行并强制使用端口 1433,您也许能够使其正常工作;如果您使用客户端网络别名,您也可以让它工作(但我不能)。

如果我在配置管理器中查找分配给该实例的当前动态端口(在我的例子中为 49538),我就能够连接,然后使用以下命令进行连接tcp:localhost,49538

具有两个连接、一个共享内存和一个 TCP/IP 的对象资源管理器

所以现在:

SELECT session_id,net_transport,local_net_address,local_tcp_port
FROM sys.dm_exec_connections;
Run Code Online (Sandbox Code Playgroud)

结果:

session_id  net_transport   local_net_address   local_tcp_port
----------  -------------   -----------------   --------------
53          Shared memory   <local machine>     NULL
54          TCP             10.211.55.10        49538 
Run Code Online (Sandbox Code Playgroud)

我尝试过的所有变体 - 跨多个计算机和版本 - 我尝试将命名实例与覆盖共享内存结合起来并使用 TCP/IP 代替 - 产生了与您收到的相同错误。当我在服务器/实例名称中添加前缀tcp:以及在连接属性对话框中为网络协议指定 TCP/IP 时,都会出现这种情况。

长话短说:如果您确实需要强制使用 TCP/IP 进行本地连接,则需要为该实例使用固定端口,并指定该端口。或者使用 1433(只有在没有默认实例或者您有该实例的专用 IP 地址时才有效),那么您不需要指定端口,但您仍然需要指定前缀或使用该tcp:前缀连接对话框中的选项。

我不建议尝试禁用共享内存。FWIW。