无法连接远程 SQL 服务器。

5
我的一个客户给我提供了一个完全合格的服务器名称 [servername].somedomain.net,以尝试通过 VPN 连接到他们的 SQL Server 实例。
于是我尝试使用他们给我的用户名和密码。没有成功。我可以 ping 它但无法连接,我收到的错误消息是用户名和密码不正确。
所以我登录实际的服务器,验证我的登录账户是否在安全性中,并拥有权限,它出现在其中。Workgroup\mylogin,看起来 workgroup\ 实际上与 somedomain.net\mylogin 相同。因为当我尝试添加 somedomain.net\mylogin 时,它会说已经添加了它,这就是 workgroup\mylogin
不确定还要检查什么。我在 SQL Server 中给自己分配了 sysadmin 角色。我可以 ping 服务器的 IP。
我查看了他们如何对我进行身份验证,他们已将我的用户在 SQL Server 中设置为使用 Windows Auth。好吧,当我尝试在本地管理工具中连接时,我收到的错误消息是它不能信任跨域的 Windows 身份验证,我已连接到他们的 VPN,那么问题可能是什么呢?
他们目前不可用以尝试解决问题,如果我能自己解决,我很好奇还能尝试什么。
3个回答

21

通常,当无法连接到SQL Server时,问题可能是:

  1. 网络问题,
  2. SQL Server配置问题。
  3. 防火墙问题
  4. 客户端驱动程序问题
  5. 应用程序配置问题。
  6. 身份验证和登录问题。

步骤1:网络问题

您可能能够在没有工作网络的情况下进行本地连接,但那是一种特殊情况。对于远程连接,需要稳定的网络。排除SQL连接性问题的第一件事是确保我们依赖的网络可用且稳定。请运行以下命令:

ping -a(使用-4和-6分别针对IPv4和IPv6) ping -a nslookup(多次输入本地和远程机器名称和IP地址)

注意查看返回结果上的任何不匹配之处。如果无法ping通目标计算机,则很有可能是网络故障或目标计算机未运行。尽管如此,目标计算机可能位于防火墙后,并且防火墙会阻止ping发送的数据包。Windows防火墙默认不阻止ping(ECHO)数据包。网络上DNS配置的正确性对于SQL连接至关重要。错误的DNS条目可能导致后续各种连接性问题。例如,请参见此链接“无法生成SSPI上下文”错误消息,DNS被中毒。

步骤2:SQL Server配置问题

您需要确保目标SQL Server正在运行并且正在侦听适当的协议。您可以使用SQL Server配置管理器(SCM)在服务器机器上启用协议。 SQL Server支持共享内存,命名管道和TCP协议(以及需要特殊硬件且很少使用的VIA)。对于远程连接,必须启用NP和/或TCP协议。一旦您在SCM中启用了协议,请确保重新启动SQL Server。

您可以打开错误日志文件以查看服务器是否成功侦听任何协议。错误日志文件的位置通常在: %ProgramFile%Microsoft SQL Server/MSSQLxx.xxx/MSSQL/Log 如果目标SQL实例是命名实例,则还需要确保SQL Browser在目标计算机上运行。如果无法访问远程SQL Server,请要求管理员确保所有这些操作都已完成。

步骤3:防火墙问题

SQL Server机器上的防火墙(或客户端和服务器之间的任何位置)可能会阻止SQL连接请求。如果可以,隔离是否存在防火墙问题的简单方法是短时间关闭防火墙。长期解决方案是为SQL Server和SQL Browser设置例外。

针对NP协议,请确保文件共享在防火墙例外列表中。文件共享和NP都使用SMB协议。 针对TCP协议,您需要将SQL Server监听的TCP端口放到例外中。 针对SQL Browser,请将UDP端口1434加入例外。同时,您也可以将sqlservr.exe和sqlbrowser.exe加入例外,但这不被推荐。我们不信任的机器之间的IPSec也可能会阻止一些数据包。请注意,防火墙对于本地连接永远不应该成为问题。

第四步:客户端驱动程序问题

在这个阶段,你可以使用一些工具来测试你的连接。这些测试肯定要在客户端机器上进行。

首先尝试运行: telnet 如果启用了TCP,则应能够通过telnet连接到SQL服务器TCP端口。否则,请返回检查步骤1-3。然后,使用OSQL、SQLCMD和SQL Management Studio测试SQL连接。如果您没有这些工具,请从Microsoft下载SQL Express,你可以免费获得这些工具。

OSQL(与SQL Server 2000一起发货)使用MDAC。 OSQL(与SQL Server 2005和2008一起发货)使用SNAC ODBC。 SQLCMD(与SQL Server 2005和2008一起发货)使用SNAC OLEDB。 SQL Management Studio(与SQL Server 2005和2008一起发货)使用SQLClient。

可能使用的命令如下: osql -E -SYour_target_machine\Your_instance 用于Windows认证 osql -Uyour_user -SYour_target_machine\Your_instance 用于SQL认证

SQLCMD也适用于此。此外,您可以使用“-Stcp:Your_target_machine, Tcp_port”用于TCP,“-Snp:Your_target_machine\Your_instance”用于NP,“-Slpc:Your_target_machine\Your_instance”用于共享内存。你会知道它是否失败了所有协议或只是某些特定的协议。

在这个阶段,你不应该再看到一般性错误信息,如错误26和错误40。如果你使用NP,并且仍然看到错误40(命名管道提供程序:无法打开到SQL Server的连接),请尝试以下步骤: a)在您的服务器机器上打开文件共享。 b)运行“net view \your_target_machine”和“net use \your_target_machine\your_share”(您也可以从Windows资源管理器尝试映射网络驱动器) 如果b)失败了,则很有可能您有操作系统/网络配置问题,这不是SQL Server特定的。请先搜索互联网以解决此问题。

您可以尝试使用Windows认证和SQL认证进行连接。如果所有工具测试都失败了,那么步骤1-3很可能没有正确设置,除非失败是关于登录的,那么您可以查看第6步。

如果您在一些工具中成功了,但在其他工具中失败了,那么很可能是驱动程序问题。您可以在我们的论坛上发布问题并给出详细信息。

您还可以使用 Windows 自带的“\windows\system32\odbcad32.exe”来测试各种驱动程序的新 DSN 连接,但这仅适用于 ODBC。

步骤 5:应用问题

如果您在步骤 1-4 中成功了,但在应用程序中仍然看到失败,那么很可能是应用程序中的配置问题。考虑以下可能的问题: a)您的应用程序是否在与您在步骤 4 中进行测试的帐户下运行?如果不是,您可能需要在该帐户下尝试进行步骤 4 的测试,或者如果可能的话,请更改为适用于您的应用程序的可工作服务帐户。 b)您的应用程序使用哪个 SQL 驱动程序? c)您的连接字符串是什么?连接字符串是否与您的驱动程序兼容?请参考http://www.connectionstrings.com/

步骤 6:身份验证和登录问题 这可能是解决 SQL 连接性问题最困难的部分。它通常与您网络、操作系统和 SQL Server 数据库的配置有关。这没有简单的解决方案,我们必须逐个解决。sql_protocols 中已经有几篇博客谈论了一些特殊情况,您可以检查它们是否适用于您的情况。除此之外,需要注意以下事项: a)如果使用 SQL 身份验证,则必须启用混合身份验证。请参考此页面http://msdn.microsoft.com/en-us/library/ms188670.aspx。 b)确保您的登录帐户对您在登录期间使用的数据库(OLEDB 中的“Initial Catalog”)具有访问权限。 c)检查系统事件日志以查看更多信息。

参考资料:http://blogs.msdn.com/b/sql_protocols/archive/2008/04/30/steps-to-troubleshoot-connectivity-issues.aspx

很抱歉这么长的一段文字,希望其中的某些内容能帮助您解决您的问题!

祝好。


我说我可以在他们的 SQL Server 安全性中为该 SQL Server 实例创建一个新的 SQL 用户(使用 SQL Auth 连接到该数据库服务器)...并通过此方式对他们的数据库进行授权。 - PositiveGuy
经过大量的研究,我最终找到了你的答案,这让我怀疑 SQL Browser。我不知道这个服务是如何停止和禁用的。启用并启动它对我来说可以建立远程连接。 - Vinayaka S P

1

如果您想访问该服务器,您需要来自该域的域帐户或使用SQL身份验证。如果允许的话,我建议只使用SQL身份验证-这更加直接。


我正在使用SQL身份验证,但只是尝试获取原始域用户帐户。由于某种原因,当我将我的域帐户添加到SQL Server安全性中时,它会将其添加为workgroup\myusername。因此,看起来我的域帐户已添加到SQL Server安全性中,这就是为什么我无法弄清楚为什么通过VPN时我无法通过Windows身份验证选项进行身份验证的原因。 - PositiveGuy
如果我没记错的话,“Workgroup”之所以能够工作,是因为这是微软工作组的通用默认名称,适用于未加入域的计算机。然而,我有99.99%的信心,这种方法永远不会奏效,因为SQL Server无法在域上与域服务器进行验证。 - Mike Perrenoud
这并不一定是这样的。我不知道系统管理员的逻辑是什么,但我们有两个域,如果用户domain2\Bob_Smith输入SQLDB01.domain1.corp.com,他可以连接到另一个域上的服务器。 - user565869

0
我曾经遇到过同样的问题,其他计算机可以连接到 SQL Server,但是有一台电脑无法连接并显示错误“与网络相关或特定于实例的错误...”,当我在 SSMS 的登录窗口中更改了网络协议时,问题得到了解决,在高级选项中从 TCP/IP 更改为命名管道。请参见下面的截图。

Connect to server dialog of SSMS - click options

Select Named pipes in network protocol dialog on connection properties tab

请注意,您应该在同一个域上,并且您的凭据应该在服务器上有效。

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