启用 SQL Server Express 2012 的远程连接

409
我刚在家庭服务器上安装了SQL Server Express 2012。我试图从桌面PC上的Visual Studio 2012连接它,但一直收到如下常见错误信息:
"A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)"
我已经采取以下措施来尝试解决此问题: - 在服务器上运行SQL Server Configuration Manager并启用SQL Server Browser。 - 在本地子网上为TCP的1433和1434端口添加了Windows防火墙例外。 - 验证我在桌面上所登录的用户在SQL Server实例上有一个登录账号。 - 确认我在使用SQL Server实例上的Windows身份验证。 - 反复重启SQL Server和整个服务器。 - 拔光头发。
我该怎么做才能让SQL Server 2012 Express允许远程连接呢?

7
我通过启用SQL Server Browser服务解决了这个问题:D。感谢您的发布。 - alansiqueira27
1
解锁1433 UDP端口帮了我! - Michael
1
如果您正在使用Azure VM,请不要忘记通过Azure的管理门户打开端口(它充当VM自己的防火墙的外部防火墙...)。像这样:https://dev59.com/gZLea4cB1Zd3GeqPwgDb - jleach
对于那些想知道在新版本中Sql Server配置管理器去哪里了的人,请前往此处。 - StuartLC
17个回答

740

很好,很高兴我问了这个问题。 我最终发现的解决方案在这里:

如何配置 SQL Server Express 允许端口 1433 上的远程 tcp/ip 连接?

  1. 运行 SQL Server 配置管理器。
  2. 转到 SQL Server 网络配置 > SQLEXPRESS 的协议。
  3. 确保启用 TCP/IP。

到目前为止,一切进展顺利,完全符合预期。但接下来:

  1. 右键单击 TCP/IP 并选择 属性
  2. 验证 IP2 下的 IP 地址是否设置为本地子网上计算机的 IP 地址。
  3. 向下滚动到 IPAll。
  4. 确保TCP 动态端口为空(我的设置为一些5位数字的端口号)。
  5. 确保TCP 端口设置为1433(我的为空)。

(此外,如果按照这些步骤操作,则无需启用 SQL Server Browser,而且只需要允许端口1433,而不是1434。)

我以前从未在 SQL Server 的任何版本(包括 Express 版本)中遇到过这些额外的五个步骤。它们似乎是必需的,因为我在服务器上使用了一个命名实例(myservername\SQLEXPRESS),而不是默认实例。请参见此处:

配置服务器以侦听特定 TCP 端口(SQL Server 配置管理器)


7
如果SQL Server Express不是唯一的实例,可能需要取消其他实例上的1433端口分配。我有一个2008 R2默认实例(MSSQLSERVER),从外部连接它们的唯一方法是将端口1433分配给2012实例(如上所述),并将旧默认实例的端口分配更改为TCP动态端口="0"和TCP端口=""(空白)。相反地做只能访问默认实例。 - Robert Calhoun
18
“IPAll”这个设置真的是救命稻草!我的设置跟你当时的一样... :D - Leniel Maccaferri
20
如果有人需要帮助......这对我很有帮助,但在我启动SQL Server浏览器服务之前,我仍然无法连接。(注意:由于某些原因,SQL Server浏览器服务的启动类型为“禁用”,因此我必须进入Windows“服务”应用程序来更改启动类型为“自动”,然后启动服务,就可以连接了。) - mercurial
9
在安装了Windows 8和SQL Server 2012 Express SP1的SQLEXPRESS实例中,我需要将动态端口设置为非空值(如果您已删除它,请设置为0,然后它将重新计算一个新的随机端口),并且在高级防火墙控制面板中打开TCP 1433和UDP 1434入站端口规则。当动态端口为空时,SQL Server仅会挂起启动。 - Tony Wall
10
想要表达感谢并点赞。你帮我省了很多时间。 你介意更新你的帖子,加上正确的连接语法吗? 我需要使用 myserver\sqlexpress,[端口号],不需要方括号。 请注意,应该用逗号而不是冒号。 - Marco
显示剩余19条评论

109
连接远程SQL Server的正确方式(不需要打开UDP端口1434和启用SQL Server浏览器)是使用IP地址和端口而非实例名称
使用IP地址和端口而非实例名称也更加安全,因为它减少了攻击面。
或许两张图片胜过千言万语... 这种方法使用指定的端口(我认为这是大多数人想要的)... 输入图像描述 该方法需要打开UDP端口1434并运行SQL Server浏览器... 输入图像描述

你能详细说明一下,你所说的“正确”的方式是什么意思吗? - Ryan Lundy
3
@Kyralessa 哈!经过4-5个小时的折磨,我终于清醒了,发现自己无法连接到远程实例。也许我应该解释一下,这里的“正确”是指从我的角度来看。如果我没有启用SQL Server浏览器,则使用实例名称连接是“不正确”的。 - Rosdi Kasim
我已经对我的回答进行了一些澄清,以避免误解。 - Rosdi Kasim
1
谢谢 ;) 当您无法访问浏览器服务时,必须指定端口。 - Arman
3
加1表示微软使用逗号作为端口号的分隔符,而不是列。 - Jorj

35

还有一件事...

Kyralessa提供了很好的信息,但我还有一件事情需要补充,在阅读这篇文章后我仍旧碰到了问题。

在SQL Server网络配置 > 服务器协议 > TCP/IP已启用。右键点击TCP/IP并选择属性。在IP地址下,您需要将使用的每个连接类型的“启用”设置为“是”。

输入图片说明


18
您可以使用此方法解决此问题:

转到“开始”>“运行”,并运行CLICONFG.EXE。

命名管道协议将首先列在列表中。请降低其优先级,提升TCP / IP的优先级。

彻底测试应用程序。

希望这有所帮助。


哇,真是个宝藏...谢谢。从来不知道这个东西的存在。 - Louis van Tonder
1
这将配置客户端使用TCP/IP,而不是服务器。 - mcr
哇,太棒了!我刚刚登录投票支持这个答案。谢谢。 - Aki

15
你还可以在协议对话框中设置“全部禁止”,然后在IP地址IP1(例如)中: - 设置启用为是 - 定义您的IP地址 - 将TCP动态设置为空白 - 将TCP端口设置为1433(或其他端口号)。

在安装了 SQL 2012 Express SP1 的 Windows 8.1 上执行此操作会导致 SQL 在启动时挂起 :( - Zhaph - Ben Duguid
我将所有的IP条目1、2、...都设置为启用+活动状态,擦除动态、擦除端口,并将IPAll端口设置为1433,然后不得不添加规则在防火墙中打开TCP 1433和UPD 1434(如果不使用名称,则不需要1434,但只需端口号)。 - Mordachai

12

我最近遇到了这个问题。2015年8月

通过打开SQL Server配置管理器解决了问题。

  • SQL Server网络配置->SQLEXPRESS协议
  • TCP/IP属性-> IP地址选项卡
  • 一切保持默认,只需将IPALL: TCP端口设置为1433

可以使用SQL Server管理器连接到计算机:[主机地址], 1433

示例:

输入图像描述


11

每个人都知道或者很容易找到Azure允许的端口配置。我没有想到这些端口可能会被Windows虚拟机防火墙阻止。谢谢。+1 - 2b77bee6-5445-4c77-b1eb-4df3e5

6
在我的SQL Server 2012开发版中,安装默认设置后,我只需要加载SQL Server配置管理器 -> SQL Server网络配置 -> MSSQLSERVER协议,并将TCP / IP从禁用更改为启用即可。

1
快速提示:对我来说,这并没有起作用。由于某种原因,错误的IP地址在其中。然而,Kyralessa的步骤起了作用,因为它们涉及更新IP地址。 - Brian MacKay
这适用于我的一个服务器,但对另一个服务器不起作用。 - cheny

5

我需要添加一个防火墙入站端口规则来打开UDP 1434端口,这是SQL Server Browser监听的端口。


3
我曾经遇到了SQL Server 2014本地安装的命名实例相同的问题。使用 FQDN\InstanceName 连接会失败,而仅使用 hostname\InstanceName 连接是可以的。例如:使用 mycomputername\sql2014 能够成功连接,但使用 mycomputername.mydomain.org\sql2014 则不行。DNS 解析正确,在 SQL 配置管理器中启用了 TCP/IP,在 Windows 防火墙规则中添加了端口(测试时关闭防火墙以确保不会阻止任何内容),但这些都不能解决问题。
最后,我必须在 SQL Server 上启动“SQL Server Browser”服务才能解决连接性问题。
我从未意识到 SQL Server Browser 服务实际上有助于 SQL Server 进行连接;我认为它仅仅是帮助填充下拉菜单,当你点击“浏览更多”服务器进行连接时,但如果端口号没有显式指定,则它实际上可以帮助客户端请求与正确的端口号对齐(类似于网站绑定,可以缓解托管多个网站的 IIS Web 服务器上的相同问题)。
这个连接项就是给我提供了 SQL Server Browser 服务提示的线索:https://connect.microsoft.com/SQLServer/feedback/details/589901/unable-to-connect-on-localhost-using-fqdn-machine-name 以下是一个引用块:
  • 当您使用 wstst05\sqlexpress 作为服务器名称时,客户端代码会将计算机名与实例名分开,wstst05 与 NetBIOS 名称进行比较。我认为它们没有问题可以匹配,并且连接被视为本地连接。从这里,我们检索所需的信息 而不 接触 SQL Browser 并通过共享内存连接到 SQL 实例,没有任何问题。
  • 当您使用 wstst05.capatest.local\sqlexpress 时,客户端代码无法将名称(wstst05.capatest.local)与 NetBIOS 名称(wstst05)进行比较,并将连接视为“远程连接”。这是设计上的问题,我们肯定会在未来考虑改进此问题。无论如何,由于考虑到连接是远程连接并且它是一个命名实例,客户端决定需要使用 SQLBrowser 进行名称解析。它尝试在 wstst05.capatest.local 上联系 SQL Browser(UDP 端口 1434),显然该部分失败了。因此你得到了错误提示。
“SQL Server Browser”服务的原因来自 TechNet(我强调添加):https://technet.microsoft.com/en-us/library/ms181087(v=sql.120).aspx 从“使用 SQL Server Browser”部分中可知:
如果SQL Server浏览器服务未运行,则仍然可以连接到SQL Server,只要提供正确的端口号或命名管道即可。例如,如果TCP/IP运行在端口1433上,则可以使用TCP/IP连接到SQL Server的默认实例。但是,如果SQL Server浏览器服务未运行,则以下连接不起作用:
- 任何试图连接到未完全指定所有参数(如TCP/IP端口或命名管道)的命名实例的组件。 - 生成或传递稍后可由其他组件重新连接的server \ instance信息的任何组件。 - 连接到无需提供端口号或管道的命名实例。 - DAC连接到命名实例或默认实例(如果未使用TCP/IP端口1433)。 - OLAP重定向服务。 - 在SQL Server Management Studio、Enterprise Manager或Query Analyzer中枚举服务器。
如果您在客户端 - 服务器方案中使用SQL Server(例如,当应用程序跨网络访问SQL Server时),如果停止或禁用SQL Server浏览器服务,则必须为每个实例分配特定的端口号,并编写客户端应用程序代码以始终使用该端口号。此方法具有以下问题:
- 必须更新和维护客户端应用程序代码,以确保其连接到正确的端口。 - 您为每个实例选择的端口可能会被服务器上的另一个服务或应用程序使用,从而导致SQL Server实例不可用。
由于只有一个SQL Server实例可以使用端口或管道,因此为命名实例(包括SQL Server Express)分配了不同的端口号和管道名称。默认情况下,在启用时,命名实例和SQL Server Express都配置为使用动态端口,即在启动SQL Server时分配可用端口。如果需要,可以向SQL Server实例分配特定端口。连接时,客户端可以指定特定端口;但是,如果端口是动态分配的,则每次重新启动SQL Server时端口号可能会更改,因此客户端不知道正确的端口号。当SQL Server客户端请求SQL Server资源时,客户端网络库使用端口1434将UDP消息发送到服务器。 SQL Server浏览器将响应所请求实例的TCP/IP端口或命名管道。然后,客户端应用程序上的网络库通过使用所需实例的端口或命名管道向服务器发送请求以完成连接。

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