如何将 ODBC DSN 连接到默认端口上的非默认 SQL Server 实例?

如何将 ODBC DSN 连接到默认端口上的非默认 SQL Server 实例?

我们正在将一台服务器上的 SQL Server 2000 数据库迁移到另一台服务器上的 SQL Server 2008 R2。客户端应用程序使用用户 DSN 直接连接到互联网上的 SQL Server。

我已经在旧服务器上备份了数据库,并在新服务器上恢复了数据库,并且能够使用 SQL Management Studio 登录、运行查询等等。

新服务器中的 SQL Server 不是默认实例,但我使用 SQL 配置管理器将该实例的默认端口更改为 1433。SQL Management Studio 只需指定服务器 IP 或域名即可连接到正确的实例(因此没有防火墙问题,或者我是这样认为的)。

到目前为止,一切都很好。

当我尝试使用客户端应用程序连接到服务器时,问题出现了。我收到“连接错误/无效实例”错误。客户端应用程序在 50 个不同位置的大约 100 台计算机上运行,​​因此一天内无法重新配置每台计算机,从而导致停机。

我尝试在计算机上创建 DSN 来测试连接。如果我指定带有端口号的 IP 地址(123.123.123.123,1433),它就可以正常工作,但如果我仅使用 IP 地址(123.123.123.123),我会得到与上述相同的错误。


连接失败:
SQLState:'01000'
SQL Server 错误:14
[Microsoft][ODBC SQL Server 驱动程序][TCP/IP 套接字]ConnectionOpen(无效实例())。
连接失败:
SQLState:'08001'
SQL Server 错误:14
[Microsoft][ODBC SQL Server 驱动程序][TCP/IP 套接字]无效连接。


除了 SQL Server 版本之外,我能想到的新服务器和旧服务器之间的唯一区别是,在旧服务器中它是默认实例,而在新服务器中它是一个命名实例。

您对我下一步可以尝试什么有什么想法吗?

编辑:

我还尝试了其他一些方法:

  • 我正在使用 SQL Server ODBC 驱动程序。如果我使用 SQL Server Native Client 驱动程序,一切都会按预期运行。
  • 如果我在同一台服务器中创建 DSN 连接,使用该服务器的公共 IP 地址,则会观察到相同的行为。
  • 如果我停止非默认实例,并在 1433 端口上运行默认实例,它会按预期工作(无需指定端口)。如果我将非默认实例设置为侦听端口 1433,则需要明确指定要连接的端口。

结束编辑

谢谢!

路易斯·阿隆索·拉莫斯

答案1

看来您想要实现的目标不可能通过该客户端实现。

该问题是由于较旧的 SQL 客户端(特别是使用 MDAC sqlsvr32.dll 驱动程序)在连接到 SQL Server 时执行“InstanceValidity”检查。驱动程序将“MSSQLServer”作为要验证 InstanceValidity 检查的实例传递。在这种情况下,由于在默认端口 (1433) 上侦听的实例名称名为“Instance01”和“Instance02”,因此它失败,因为实例名称与 InstanceValidity 检查不匹配。

根据您在这种情况下最方便的情况,您可能需要在客户端上指定端口、更改客户端或将您的命名实例更改为默认实例。

来源: http://social.msdn.microsoft.com/Forums/sqlserver/en-US/7f353b59-7e7f-4ec3-adcb-e69ca2629b21/named-sql-2008-r2-server-listening-on-default-port-1433-with-dedicated-ip-address-requires-port?forum=sqldataaccess

答案2

首先验证您的 SQL Server 实例是否启用了 TCP/IP 协议。然后检查您的 SQL Server 实例正在“监听”哪个 TCP/IP 端口。

然后,如果这台机器上有防火墙,请检查 SQL Server Management Studio 程序的规则(入站)中是否存在例外。如果是,那么它将能够穿过防火墙,但 ODBC 则不能。

关于服务器引用,您可以尝试将您的服务器引用为“servername\instancename”或使用端口号,尝试“servername,1433”或“servername\instancename,1433”作为您的服务器地址。

您的服务器还需要知道在哪个端口上进行回复,当 TCP 端口为空时并不意味着使用默认端口。根据您想要实现的目标,您可能需要执行或验证以下其中一项操作是否正确完成:

您的服务器中如何设置端口分配 https://dba.stackexchange.com/questions/47651/when-is-a-dynamic-port-dynamic

配置服务器以侦听特定 TCP 端口(SQL Server 配置管理器) http://msdn.microsoft.com/en-us/library/ms177440.aspx

为 SQL Server 命名实例分配静态端口 - 并避免常见的陷阱 http://blogs.msdn.com/b/arvindsh/archive/2012/09/08/how-to-assign-a-static-port-to-a-sql-server-named-instance-and-avoid-a-common-pitfall.aspx

要连接到远程 SQL Server,您有两个选择,一个是使用 IP 和端口(更安全),或者明确指定命名实例并打开 UDP 端口 1434 并启用 SQL Server 浏览器。

原因是:只有 SQL Server 的命名实例才能使用动态端口分配过程。在动态端口分配过程中,首次启动 SQL Server 实例时,端口设置为零 (0)。因此,SQL Server 会向操作系统请求一个空闲端口号。一旦为 SQL Server 分配了端口号,SQL Server 就会开始侦听分配的端口。

当 SQL Server 实例使用动态端口分配时,除非用户或程序员明确指定端口,否则在 SQL Server 客户端上构建的连接字符串不会指定目标 TCP/IP 端口。因此,SQL Server 客户端库会在 UDP 端口 1434 上查询服务器,以收集有关 SQL Server 目标实例的信息。当 SQL Server 返回信息时,SQL Server 客户端库会将数据发送到适当的 SQL Server 实例。

如果禁用 UDP 端口 1434,SQL Server 客户端将无法动态确定 SQL Server 命名实例的端口。因此,SQL Server 客户端可能无法连接到 SQL Server 命名实例。在这种情况下,SQL Server 客户端必须指定 SQL Server 2008 命名实例的动态分配端口。

此外,根据您的需要,您可能希望使用系统 ODBC,而不是用户 ODBC。区别在于用户 ODBC 与机器上的一个用户帐户绑定。

答案3

我遇到了完全相同的问题,但我设法解决了它!这就是我学到的。

  • 如果您已安装命名实例。您无法将名称更改为默认。但是您可以:使命名实例侦听默认端口。这有助于从 Management Studio 进行连接而无需指定实例名称,但对 ODBC 没有帮助。

  • 您可以创建别名(使用 MSSQLServer 之类的名称或 IP 地址,这是一种技巧)以使您的客户端正常工作。可能对某些应用程序有用。

  • 如果此解决方法不起作用,那么最好的办法是完全卸载 SQL 并重新安装,但即使您选择了“默认实例”,新安装也可能会再次使用命名实例的名称。您可以在 SQL 服务中验证这一点,看看它是否仍在使用旧名称。在这种情况下,最好的方法(对我有用)是安装一个新实例,其显式名称为 MSSQLServer,已知这是默认实例名称。这将使它与 ODBC 一起工作。

另外说明一下:SQL 采用计算机名称并将其用作别名。

相关内容