从Windows 64位连接到SQL Server命名实例

3
我有Java和.NET应用程序在使用Microsoft Windows Server 2003,企业版的应用服务器上运行。这些正在迁移到另一个应用服务器Windows 2008 64位机器。
所有应用程序都连接到同一个SQL Server 2005数据库,该数据库使用命名实例。
到目前为止,我已经尝试将应用程序移动到新的应用服务器,而不更改配置文件中的任何内容。
在新的应用服务器上,Java和.NET应用程序都不能连接到数据库(命名实例)。
JDBC错误消息:“连接到命名实例失败。错误:java.net.SocketTimeoutException:接收超时。”
.NET错误消息:“在建立与SQL Server的连接时发生与网络相关或特定于实例的错误。找不到服务器或无法访问服务器。”
如果我更改DB配置为不是命名实例的配置,则可以在新的应用服务器上正常工作。
因为我们能够在旧的应用服务器上连接数据库,所以数据库设置正确。 我可以从新的应用服务器ping通数据库服务器。
是否有任何原因导致新的应用服务器无法正常工作?
Java连接字符串:“jdbc:microsoft:sqlserver://[dbservername];SelectMethod = Cursor; instanceName = [dbinstance]”
.NET连接字符串:“Server = [dbservername] \ [dbinstance]; Database = Risk_DB; Uid = [user]; Pwd = [pwd];”
更新:根据答案中的建议,我获取了实例端口号。 我还安装了SQL Server Management Studio,以便消除我的应用程序作为问题点。 从管理工具中,如果我使用[servername] [instancename],我会收到消息“在建立与SQL Server的连接时发生与网络相关或特定于实例的错误...”但是当我使用[servername],[port]时它可以正常工作。 不确定是否有任何方法可以解决这个问题?
更新2:将问题升级到基础架构/服务器/网络团队。他们在新的应用服务器上禁用了Windows防火墙。 Presto,现在我可以在Management Studio中连接到[dbservername]\ [dbinstance],并且所有应用程序都使用现有的配置文件正常工作。
2个回答

6

您的命名实例将在不同的端口上运行。端口1433(默认实例的默认端口)可能已经开放,而运行命名实例的端口可能已被阻止。您可以在命名实例的错误日志中检查端口(假设您可以在本地连接,在对象资源管理器中展开服务器,展开管理,展开SQL Server日志,右键单击当前,然后选择“查看SQL Server日志”),启动时它会像这样显示:

Server is listening on [ 127.0.0.1 <ipv4> 3587 ].

那个最后的数字是需要从远程机器和通过它到达该端口的任何网络设备和服务都可以访问的端口号。如果您没有找到这样的行,可能是因为未启用命名实例的TCP/IP。在那个服务器上,进入SQL Server Configuration Manager,展开SQL Server Network Configuration,在“Protocols for ”上单击,并确保右侧窗格中启用了TCP/IP。如果您必须启用此功能,则需要重新启动SQL Server才能生效。
如果已经启用(或者一旦您启用并重新启动服务),您应该能够刷新此视图并验证正在使用的端口,如果您右键单击TCP/IP,点击属性,然后转到IP地址选项卡。您可以看到每个IP当前使用的端口。这里将有多个IPn部分和一个IPAll部分。对于每个IP,您可以更改“TCP端口”框以使用您想要的端口(并删除所有“动态TCP端口”框中的值为0)。单击应用程序并重新启动服务。这将再次要求重启服务,但将允许您指定特定的端口,以便您可以添加防火墙排除(或利用已经存在的防火墙排除,假设此服务器尚未使用该端口)。

只是为了进一步确认某些检查事项 - 可能情况是旧的盒子在防火墙中有一个显式的例外,允许它连接到数据库服务器(这可能是我的IP地址或名称)。 如果是这种情况,请忽略我的建议更改/修复SQL Server端口,并与您的网络管理员交谈,以便为新盒子设置相同的防火墙例外。 - Aaron Bertrand
也有可能是因为旧服务器上运行了SQL Server Browser服务(从而动态路由命名实例请求到正确的端口),但新服务器上没有运行该服务。 - Clark
@Clark,你不应该在应用服务器上需要SQL浏览器服务来完成任何操作。我认为从问题中并不完全明显,但对我来说听起来像是应用程序已经移动,而不是数据库。仍然可以连接到数据库的“旧服务器”是旧的应用程序服务器。 - Aaron Bertrand
我的错误,看起来我误读了问题。再仔细阅读一遍,我同意你的解释,SQL浏览器服务并不起作用。 - Clark
编辑了问题以澄清Aaron Bertrand的解释是正确的 - 只有应用程序在移动,而不是数据库。感谢大家对端口提出的建议。我无法访问SQL Server日志。我必须向DBA询问命名实例端口,并会报告回来。 - Lost In Code
如问题更新所述,问题似乎不仅仅是实例正在运行的端口,可能是将实例名称解析为端口的端口。我们不知道是哪个端口。我接受这个答案,因为它引导我走上了正确的轨道。谢谢@AaronBertrand。 - Lost In Code

0

可能出现的问题:

  • 防火墙可能会阻止连接。
  • 实例名称与连接字符串中指定的不同。
  • 连接字符串指定了不同的端口,或者 SQL Server 运行在非默认 1433 端口。

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