如何解决 SQL Server 2000 中的连接问题适用于
重要说明:本文包含有关修改注册表的信息。修改注册表之前,一定要备份注册表,并且一定要知道在发生问题时如何还原注册表。有关如何备份、还原和编辑注册表的信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
256986 Microsoft Windows 注册表说明
本任务的内容
概要本文能帮助您解决 Microsoft SQL Server 2000 的连接问题。本文描述了常见连接问题和所能采取的有助于解决连接问题的步骤。
SQL Server 2000 支持 SQL Server 实例和客户端应用程序间的多种通信方式。如果您的客户端应用程序和 SQL Server 实例位于同一台计算机上,那么 Microsoft Windows 处理之间的通讯 (IPC) 部件(例如本地命名管道或共享内存协议)将被用于通信。但是,当客户端应用程序和 SQL Server 实例位于不同计算机上时,一个网络 IPC(例如 TCP/IP 或命名管道)将被用于通信。
SQL Server 2000 使用网络库(一个 DLL)与特定的网络协议进行通信。一对匹配网络库必须在客户端计算机上激活,而且在支持待用网络协议的服务器计算机上也必须是激活的。例如,如果您想启用一个客户端应用程序,通过 TCP/IP 与某个特定的 SQL Server 实例通信,那么客户端的 TCP/IP 套接字网络库 (Dbnetlib.dll) 就必须配置为连接到客户端计算机的服务器。同样,服务器 TCP/IP 套接字网络库 (Ssnetlib.dll) 必须侦听服务器计算机。在此方案中,TCP/IP 协议堆栈必须同时安装在客户端计算机和服务器计算机上。
在安装完 SQL Server 2000 之后,您可以通过客户端网络实用程序来配置客户端网络库的属性。您可以通过服务器网络实用程序 (Svrnetcn.exe) 来配置服务器网络库的属性。在安装 SQL Server 安装程序中的服务器工具时,服务器的网络库也同时被安装了。但是,某些服务器的网络库可能未被激活。在默认情况下,SQL Server 2000 启用并侦听 TCP/IP、命名管道和共享内存。因此,如果一个客户端要连接到一台服务器计算机,该客户端必须使用一个客户端网络库,该网络库须与 SQL Server 实例正在使用的服务器网络库之一相匹配。
有关 SQL Server 通讯部件和网络库的其他信息,请参见“SQL Server 在线参考书”中的下列主题:
通信部件
客户端和服务器网络库
管理客户端
解决连接问题在 SQL Server 2000 中您可能会注意到的大多数连接问题都是由 TCP/IP 的问题或 Windows 身份认证的问题引起,或者由两者共同引起。
重要说明:在开始解决 SQL Server 2000 的连接问题之前,请确认 MSSQLServer 服务已在运行 SQL Server 的计算机上启动。
验证 DNS 设置域名系统 (DNS) 中的名称解析过程用于解析 SQL Server 实例名称的 IP 地址。如果名称解析过程工作不正常,就不能获得 SQL Server 实例,您可能会收到一条或多条下列错误信息:
SQL Server does not exist or access denied
General Network Error
Cannot Generate SSPI Context
要验证名称解析过程是否在解析正确的服务器,可以使用服务器名和服务器的 IP 地址 ping 服务器。为此,请按以下步骤操作:
单击“开始”,然后单击“运行”。
在“运行”对话框中,在“打开”框中键入 cmd,然后单击“确定”。
在命令提示符下,运行下列命令:ping <Server Name>
记录返回的 IP 地址。
在命令提示符下,运行下列命令(此处的 IP address 就是您在步骤 3 中记录的 IP 地址):ping –a <IP address>
验证命令解析的是正确的服务器名。如果两个指定的命令有任何一个不成功、超时或没有返回正确的值,那么 DNS 查找未能正常工作,或者有其他网络或路由问题引发问题。要查看当前 DNS 设置,在命令提示符下运行下列命令:ipconfig /all
有关 ipconfig 命令的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
223413 Windows 2000 中 Ipconfig.exe 的选项
要解决此问题,可以在客户端计算机上的 %systemroot%\system32\drivers\etc\hosts 文件中为服务器添加一个条目。要解决此问题,还可以使用命名管道网络库连接到服务器。
验证启用的协议和别名如果客户端计算机上的别名设置错误,可能会引起连接问题。您可以使用客户端网络实用程序查看别名。为此,请按以下步骤操作:
启动客户端网络实用程序。如果 SQL Server 客户端工具被安装在正在运行客户端应用程序的计算机上,请按照以下步骤启动客户端网络实用程序:
单击“开始”,然后指向“程序”。
指向“Microsoft SQL Server”,然后单击“客户端网络实用程序”。如果 SQL Server 客户端工具没有安装在客户端计算机上,请按照以下步骤启动客户端网络实用程序:
单击“开始”,然后单击“运行”。
在“运行”对话框中,在“打开”框中键入 cliconfg,然后单击“确定”。
在“SQL Server 客户端网络实用程序”窗口中,单击“常规”标签,然后启用您要使用的所有协议。
注意:您必须至少启用 TCP/IP 协议和命名管道协议。
单击“别名”标签,然后验证为 SQL Server 实例所配置的别名。
验证别名的属性,确认服务器名或 IP 地址和协议的配置是正确的。通过使用服务器名、IP 地址或者其他协议,您可以创建一个新的别名以测试连接性能。
注意:在 Microsoft 数据存取部件 (MDAC) 的早期版本中,客户端网络实用程序的用户界面是不同的。因此,如果您没有看到本文中列出的选项,请在运行客户端应用程序的计算机上安装 MDAC 的新版本。
验证 SQL Server 实例正在正确地侦听要验证 SQL Server 实例正在正确地侦听命名管道、TCP/IP 或您在客户端应用程序中使用的其他协议,请打开当前的 SQL Server 错误日志文件。SQL Server 错误日志文件可能包括与以下类似的条目:2003-11-06 09:49:36.17 server SQL server listening on TCP, Shared Memory, Named Pipes.
2003-11-06 09:49:36.17 server SQL server listening on 192.168.1.5:1433, 127.0.0.1:1433.
通过分析 SQL Server 错误日志文件中的条目,可以验证 SQL Server 实例是否正在侦听正确的 IP 地址和端口。在默认情况下,一个默认的 SQL Server 实例侦听端口 1433。您还可以使用服务器网络实用程序来验证 SQL Server 的协议设置并更改 SQL Server 中的属性,包括可以连接到 SQL Server 和可以使用的端口的协议。关于使用服务器网络实用程序的更多信息,请参见 SQL Server 在线参考书中的“SQL Server 网络实用程序”专题。
有时候,SQL Server 2000 可能不会绑定于端口 1433 或任何其他指定的端口。如果端口正被其他应用程序使用,或者如果您正在尝试使用一个错误的 IP 地址进行连接,就可能会出现此问题。因此,TCP/IP 到 SQL Server 的连接可能不成功,在 SQL Server 错误日志中您会收到下列错误信息:
2001-11-14 15:49:14.12 server SuperSocket Info:Bind failed on TCP port 1433.
有关其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
307197 PRB:TCP\IP 端口正由另一应用程序使用
如果通过 TCP/IP 连接您不能连接到 SQL Server 实例,请尝试使用命名管道协议或共享内存协议。在命令提示符下运行下面的命令,以获取关于正在使用的端口的信息:NETSTAT -an
您还可以使用 Portqry 命令行实用程序来获取关于正在使用的端口的更多信息。
有关 Portqry 命令行实用程序的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
310099 Portqry.exe 命令行实用程序说明
有关与 TCP/IP 套接字相关的可能的错误的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
306865 BUG:当 TCP/IP 是唯一的协议时,SQL Server 可能无法侦听 TCP/IP 套接字
注意:对于 SQL Server 命名实例,SQL Server 动态地决定端口并侦听决定的端口。因此,当您启动 SQL Server 命名实例时,SQL Server 将设法侦听之前使用的端口。如果 SQL Server 不能绑定到该端口,命名实例可能会动态地绑定到另一个端口。在这种情况下,请确认客户端应用程序也被设置为动态地决定端口。作为选择,您还可以为命名实例指定一个静态端口,通过客户端网络实用程序对其进行绑定和侦听。
有关其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
286303 INF:动态端口检测过程中 SQL Server 2000 网络库的行为
823938 如何在 SQL Server 2000 中使用静态和动态端口分配
解决 MDAC 问题MDAC 的问题也可能会引起连接问题。例如,安装一个软件可能会覆盖一些 MDAC 文件或更改权限,而您需要这些权限才能访问 MDAC 文件。您可以运行 MDAC 部件检查器来验证 MDAC 在计算机上的安装。
有关如何确定您当前的 MDAC 版本的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
301202 如何检查 MDAC 版本
注意:如果您正连接到 SQL Server 的一个命名实例,请确认计算机上运行的是 MDAC 2.6 或更新的版本。MDAC 的早期版本不识别 SQL Server 的命名实例。因此,可能无法连接到命名实例。
您可以使用 Odbcping.exe 实用程序来验证通过 SQL Server ODBC 驱动程序的连接。
有关 Odbcping.exe 的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
138541 如何使用 Odbcping.exe 验证到 SQL Server 的 ODBC 连接
有关配置 ODBC DSN 的其他信息,请单击下面的文章编号,查看 Microsoft 知识库中的相应文章:
289573 PRB:使用 SQL Server Net-Libraries(SQL Server 网络库)配置 DSN
您还可以使用一个 .udl 文件测试与 SQL Server 实例的连接。
有关如何创建 .udl 文件的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
244659 示例:如何在 Windows 2000 中创建数据链接文件
解决防火墙问题如果防火墙存在于客户端计算机和正在运行 SQL Server 的计算机之间,请确认通过防火墙进行通信时所需的端口已打开。
有关通过防火墙进行通信时必须打开的端口的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
287932 INF:通过防火墙与 SQL Server 进行通信所需的 TCP 端口
269882 如何使用 ADO 连接到防火墙后的 SQL Server
如果您使用 TCP/IP 协议连接 SQL Server 实例,请确认能够用 Telnet 程序连接到 SQL Server 正在侦听的端口。要使用 Telnet 程序,在命令提示符下运行下列命令:Telnet <IP Address> <Port Number>
如果 Telnet 程序没有成功,并且您接收到错误信息,请解决此错误然后尝试再次连接。
注意:因为由 Slammer 病毒引起的问题,在您的防火墙上,用户数据报协议 (UDP) 端口 1434 可能被阻挡。
解决身份验证和安全问题由于身份认证失败,可能无法连接到 SQL Server。如果身份认证失败,您可能收到下列错误信息之一:
Login failed for user '<username>'
Login failed for user 'NTAUTHORITY\ANONYMOUS LOGON'
Login failed for user 'null'
如果您由于身份认证失败收到了错误信息,而且错误信息中没有提到一个明确的 SQL Server 登录名,请使用 Windows 身份认证解决该问题。由于 Windows 身份认证的问题,您可能会收到下列错误信息:
Cannot generate SSPI Context
下列问题可能会引起身份认证和安全问题:
NTLM 身份认证或 Kerberos 身份认证出现问题。
由于连接问题,无法联系域控制器。
域之间的信任关系出现问题。有关可能原因的更多信息,请参见计算机上的事件日志。要解决 Windows 身份认证的连接问题,您可以使用 SQL Server 身份认证连接到 SQL Server 实例。 有关如何诊断和解决“Cannot Generate SSPI Context”错误的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
811889 如何排除“Cannot generate SSPI context”错误信息
如果在使用 SQL Server 身份认证时连接没有成功,您会收到下列错误信息:
Login failed for user '<username>' .Not associated with a trusted connection
若要解决此问题,请按照以下步骤操作。
警告:“注册表编辑器”使用不当可导致严重问题,可能需要重新安装操作系统。Microsoft 不能保证您可以解决因“注册表编辑器”使用不当而导致的问题。使用“注册表编辑器”需要您自担风险。
请确认 SQL Server 实例配置为使用 Windows 身份认证和 SQL Server 身份认证。为此,请确认在正在运行 SQL Server 的计算机上存在下列注册表项。对于默认的 SQL Server 实例:
HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer\MSSQLServer\LoginMode
对于 SQL Server 的命名实例:
HKEY_LOCAL_MACHINE\Software\Microsoft\Microsoft SQL Server\<Instance Name>\MSSQLServer\LoginMode
请确认已设置下列注册表项的值:
身份认证类型
值
仅限于 Windows 身份认证
1
混合模式(SQL Server 身份认证和 Windows 身份认证)
2
注意:如果您对注册表进行了任何更改,必须关闭并重新启动 SQL Server 实例使更改生效。
尝试使用其他 Windows 帐户或 SQL Server 登录帐户连接到 SQL Server 实例。这样能够帮助确定是否是由于某个特殊的登录帐户的问题而造成连接失败。例如,登录帐户的密码可能已被更改。
尝试使用其他协议连接到 SQL Server 实例。例如,使用 TCP/IP 协议进行 Windows 身份认证的连接可能会失败,但是使用命名管道协议进行 Windows 身份认证的连接就可能会成功。如果您正在使用证书,当尝试连接到 SQL Server 实例时,可能会收到一条安全套接字层 (SSL) 安全错误信息。 有关其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
316898 如何借助 Microsoft Management Console 为 SQL Server 2000 启用 SSL 加密
322144 FIX:SECDoClientHandShake 无法连接到 SQL Server
解决 TCP/IP 套接字上的压力问题在使用 SQL Server ODBC 驱动程序、Microsoft OLE DB Provider for SQL Server 或 System.Data.SqlClient 管理提供程序时,可以使用恰当的应用程序编程接口 (API) 来禁用连接池。在禁用连接池、并且应用程序频繁打开和关闭连接时,对基本 SQL Server 网络库的压力可能会增大。有时候,Web 服务器和 JDBC 驱动程序也会尝试连接到 SQL Server 实例。因此,对 SQL Server 连接需求的增加可能会超过 SQL Server 的处理能力。这可能会给 TCP/IP 套接字带来压力,您还可能在 SQL Server 错误日志文件中收到下列错误信息:
2003-08-07 20:46:21.11 server Error:17832, Severity:20, State:6
2003-08-07 20:46:21.11 server Connection opened but invalid login packet(s) sent.Connection closed.
有关其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
154628 INF:SQL 在遇到多个 TCP\IP 连接请求时记录 17832
328476 禁用连接池时 SQL Server 驱动程序的 TCP/IP 设置
注意:如果运行 SQL Server 2000 SP3 或 SQL Server 2000 SP3a,则不会注意到对 TCP/IP 套接字的压力,这是由于添加了对登陆数据包数量的限制。在使用第三方驱动程序连接到 SQL Server 实例时,发生错误 17832。要解决该问题,请与第三方供应商联系,并获取经测试证明能够用于 SQL Server 2000 SP3 和 SQL Server 2000 SP3a 的驱动程序。
查看 SQL Server 实例是否以单用户模式启动如果尝试连接的 SQL Server 实例是以单用户模式启动的,只能建立一个到 SQL Server 的连接。如果运行软件的计算机自动连接到 SQL Server,该软件可以轻松地使用唯一的连接。例如,下面的软件可以自动连接到 SQL Server 实例:
SQL Server 代理程序
第三方备份软件
第三方监测软件
第三方病毒软件
Microsoft Internet 信息服务 (IIS)
SQL Server 企业管理器尝试连接到 SQL Server 实例的客户端应用程序收到下列错误信息:
SQL Server does not exist or Access Denied
当安装过程以单用户模式启动 SQL Server 实例时,此错误一般发生在 SQL 群集安装和服务软件包安装期间。指定的应用程序会自动连接到使用唯一可用连接的 SQL Server 实例,从而安装失败。
要确定 SQL Server 实例是否已经以单用户模式启动,请检查 SQL Server 错误日志文件中是否具有一个与以下类似的条目:
2003-07-31 11:26:43.79 spid3 Warning ******************
2003-07-31 11:26:43.80 spid3 SQL Server started in single user mode.Updates allowed to system catalogs.
验证到 SQL Server 的命名管道连接如果您无法使用命名管道连接到 SQL Server 实例,请确认 SQL Server 实例配置为接受命名管道连接。 有关测试命名管道的过程的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
68941 INF:测试命名管道的过程
解决在恢复过程中连接超时的问题在每次启动一个 SQL Server 实例时,SQL Server 将恢复各个数据库。在此恢复过程中,SQL Server 回滚未提交的事务。当停止 SQL Server 实例时,SQL Server 还将前滚已提交的事务和没有写入硬盘的更改。当恢复过程完成时,SQL Server 将在 SQL Server 错误日志文件中写入下列信息:
Recovery Complete
在恢复过程中,SQL Server 可能不会接受连接。在此时间内尝试连接到 SQL Server 的客户端可能会收到一条与以下类似的错误信息:
Timeout Expired
SQL Server 代理服务可能无法启动,这是因为它要等待 SQL Server 恢复数据库。因此,当您在 SQL Server 错误日志文件中收到下面的信息时,连接不再会因为超时错误而失败:
Recovery Complete
如果恢复过程花费的时间很长,您也许还要排除恢复过程的故障。
测试连接到 SQL Server 实例的不同方法当您连接到 SQL Server 实例时,如果遇到了连接问题,可以使用下面的一种或多种方法来解决连接问题。
使用SQL Server 身份认证和 Windows 身份认证测试到 SQL Server 实例的连接。
从其他数据源(例如 ODBC DSN、.udl 文件、SQL 查询分析器、SQL Server 企业管理器,isql 实用程序或 osql 实用程序)测试到 SQL Server 实例的连接。
使用其他协议测试到 SQL Server 实例的连接。您可以为使用该协议的 SQL Server 实例创建一个新的别名,从而指定不同的协议。还可以通过在 SQL Server 实例名称的开始处添加 tcp:、 np:、 lpc:、或 rpc: 来指定您的连接字符串中的协议。例如,如果 TCP/IP 连接失败,则命名管道连接成功。
使用其他登录帐户测试连接,这样可以帮助您确定该问题是否与某个特定的登录帐户有关。
在 %systemroot%\system32\drivers\etc\hosts 文件中添加一个与正在运行 SQL Server 实例的计算机的 IP 地址相应的条目。
尝试从运行 SQL Server 的计算机和客户端连接到 SQL Server 实例。
如果您正从运行 SQL Server 的计算机进行连接,可以指定“.”或“(本地)”(不带引号)取代服务器名称,然后连接。
尝试使用 IP 地址而不是服务器名称连接到 SQL Server 实例。
尝试指定 SQL Server 实例正在侦听的特定端口。有两种方法:创建一个别名或将一个端口号添加到连接字符串(例如 MyServer\MyInstance,1433)。返回页首
捕捉网络监视器踪迹如果使用“测试连接到 SQL Server 2000 实例的各种方法”小节中提到的步骤无法解决连接问题,请使用网络监视器实用程序捕捉网络踪迹。 有关网络追踪的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
148942 如何使用网络监视器捕获网络通讯量
294818 关于网络监视器的常见问题
169292 解读 TCP/IP 跟踪数据的基础知识
102908 如何在 Windows 2000 或 Windows NT 中排除 TCP/IP 连接问题
要获得更多详细信息,需要使用 SQL 事件探查器踪迹。对于运行 SQL Server 进行网络追踪的非聚集计算机,还可以使用网络诊断工具。 有关如何使用网络诊断工具的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
321708 如何在 Windows 2000 中使用网络诊断工具 (Netdiag.exe)
参考有关与 SQL Server 相关的各种连接问题的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
812817 支持 Web 广播:Microsoft SQL Server 2000:连接故障排除
319930 如何连接到 Microsoft 桌面引擎
257434 INF:现有 DSN 中的网络库被连接到同名 SQL Server 的新 DSN 中的网络库取代。
306985 使用命名管道连接群集虚拟服务器时发生 RPC 错误
313062 如何在 Windows 2000 中通过使用 Active Server Pages 连接到数据库
313295 如何在连接字符串中使用服务器名参数指定客户端网络库
320728 如何排除“The Maximum Connection Limit Has Been Reached”错误信息
328306 INF:出现 “SQL Server Does Not Exist or Access Denied”(SQL Server 不存在或拒绝访问)错误信息的可能原因
247931 INF:在 Active Server Page 中验证到 SQL Server 的连接的方法
169377 如何在 Active Server Page 中访问 SQL Server
328383 INF:SQL Server 客户端可在连接时更改协议
238949 如何在 ADO 连接字符串中设置 SQL Server 网络库
270126 PRB:在进行 Active/Active Cluster 7.0 升级后如何管理客户端与两个 SQL Server 2000 虚拟服务器的连接
316779 PRB:拥有强制协议加密设置的客户端可能无法通过 IP 地址进行连接
216643 INF:跟踪到 SQL Server 7.0 的连接时找不到 ODBC/OLEDB 连接选项
265808 INF:如何用早期版本的客户端工具连接到 SQL Server 2000 命名实例
191572 INFO:从 ASP 调用的 ADO 对象管理的连接池
313173 用于 Microsoft SQL Server 2000 的 JDBC 驱动程序的示例连接池管理器
237844 如何在 Visual Basic ADO 应用程序中启用 ODBC 连接池
259569 PRB:安装第三方产品破坏了 Windows 2000 MDAC 注册表设置