出自: http://blogs.msdn.com/b/apgcdsd/archive/2011/01/12/sql-server-1.aspx
一。前言
在使用SQL Server 的过程中,用户遇到的最多的莫过于连接问题了。本文将深度讨论SQL Server 连接问题的方方面面,希望能帮你彻底解决SQL server 的连接问题。
SQL Server 支持的通讯协议很多,如命名管道(Named Pipes)、TCP/IP 套接字、共享内存(Shared Memory)等。由于最常用的是前两种即命名管道和TCP/IP套接字,所以我们主要讨论这两种协议的连接问题。先来讨论命名管道,然后我们再讨论TCP/IP。
二。什么是命名管道(Named Pipes)
在Windows 系统中,进程间通信机制有邮槽,管道和套接字等. Windows平台上就管道而言,有命名管道和匿名管道两种。命名管道通过进程间通讯(IPC)机制实现通讯, 利用它能够在同一台计算机的不同进程之间,或在跨越一个网络的不同计算机的进程之间,进行单向或双向的数据通信。具体点说, 命名管道建立在服务器的IPC$共享基础上,通过IPC$共享来进行通讯。管道的名称也是和网络共享类似,都是UNC格式(见后面讨论的命名管道命名格式)。
如果你曾使用命名管道进行编程,你就会发现命令管道利用标准的Win32文件系统API 函数(如ReadFile和WriteFile)来进行数据的收发,与系统基层网络传送协议(如TCP,NETBEUI或IPX等)无关. 客户端使用命名管道连接的基本过程如下:
(1)SQL Server服务器使用CreateNamedPipe函数创建命名管道并对之进行监听.
(2)客户端使用CreateFile()和WriteFile()函数试图连接到服务器的命名管道.
综上所述,
1) 命名管道不是一个基层网络协议
由于命名管道运行在TCP,NETBEUI等基础协议之上,不是一个基层网络传送协议, 所以即使客户机和SQL Server 服务器之间使用命名管道通讯, 你亦需要配置TCP或其它基层网络协议以保证客户机和SQL服务器之间的网络连通性.
2) 命名管道是一个需要通过系统认证的协议
当客户端使用命名管道协议连接的时候, 它会首先访问服务器的IPC$共享。访问IPC$共享必须通过Windows 的认证。通过了这个认证后,才可以真正连接到SQL Server 监听的管道上。所以说命名管道是一个需要通过Windows认证的协议. 这是使用命名管道的最大一项好处,即用它可以直接利用Windows Server内置的安全机制. 如果你没有访问SQL Server 服务器的文件系统的权限(Permission),那么你就无法使用命名管道访问SQL Server。
三。SQL Sever 命名管道工作原理
SQL Server 首先在服务器上创建一个命名管道并监听之,然后客户端即可连接到这个管道上来进行对话。对每一个客户端管道连接请求SQL Server都会创建一个新的管道实例来与之进行通讯。
1. 命名管道的名称。
SQL Server和其它Windows程序一样都采用UNC格式标识命名管道。例如:
\\server\Pipe\path_name
上述命名管道标识字符串可分为三部分
\\server部分: 指定命名管道所在服务器的名字。命名管道便是在此机器上创建。SQL Server 多是用一个点(.)来表示它正在运行的本地服务器。
\Pipe部分:是一个固定的“硬编码”字串(大小写均可)表明是管道协议。
\path_name部分:命名管道的名字。可以是多级目录。SQL Server 监听的是两级目录即\sql\query。
缺省情况下,SQL Server监听的命名管道名称如下:
(默认实例和命名实例有不同的管道名字)
默认实例:\\.\pipe\sql\query
命名实例:\\.\pipe\MSSQL$instancename\sql\query
上述管道名称pipe后面的部分可以在安装 SQL Server 后使用服务器网络实用工具进行更改。
2. 配置或查看SQL Server 2000 监听的命名管道
在SQL Server 2000 服务器上运行svrnetcn.exe调出服务器网络实用工具(英文名是SQL Server Network Utility),或者在"开始"菜单中,指向"程序",接着指向"Microsoft SQL Server",然后单击"服务器网络实用工具"。如果 "启用的协议(Enabled Protocals)" 框内没有命名管道则从左边选中命名管道并点击 启用(Enabled) 按钮加入(参考图1)。选中命名管道协议并点击 属性 按钮(Properties)即可查看或修改SQL Server 监听的命名管道名称(参考图2)。如果刚刚启用命名管道协议那么需要点击OK按钮并重新启动SQL Server 服务才能生效。
(图1:服务器网络实用工具)
(图2:命名管道名称)
3. 配置或查看SQL Server 2005/SQL Server 2008 监听的命名管道
打开SQL Server Configuration Manager,在左侧的面板中展开SQL Server Network Configuration节点,并选中节点下面你想要操作的SQL Server实例。此时在右侧的面板上会看到该实例的各个网络协议是否启用,其中包括命名管道。在协议名字的右侧会显示它当前的状态是否为启用。参考图3。
(图3 SQL Server Configuration Manager)
右键Named Pipes并选择“ 启用 ”。然后重启SQL Server实例来使得刚才做的操作生效。
在图3中,选中命名管道协议并点击 属性 按钮(Properties)即可查看或修改SQL Server 监听的命名管道名称。
(图4)
4. 验证SQL Server 是否真的监听了命名管道
解决命名管道连接问题的重要一步是检查SQL Server是否真的监听了命名管道。
在SQL Server 2000中,为了验证SQL Server 确实监听了命名管道,可以打开SQL Server Query Analyzer (查询分析器),然后运行如下命令:
exec master..xp_readerrorlog
在结果栏,如果看到如下一行则表明SQL Server已经监听了命名管道:
2000-01-13 09:57:37.38 server SQL server listening on TCP, Shared Memory, Named Pipes.
在SQL Server 2005或SQL Server 2008中,我们可以打开SQL Server Management Studio,然后运行:
exec master..xp_readerrorlog
你可以在结果栏中看到它监听的管道名称:
2011-01-12 11:35:37.980 Server Server named pipe provider is ready to accept connection on [ \\.\pipe\sql\query ].
四。客户端的命名管道配置
大多数情况下在客户端你不需要进行配置,因为命名管道协议默认是启用的。但既然是检查命名管道的连接问题,还是需要熟悉客户端的命名管道配置。
1. 使用客户端网络实用工具
在客户端可以使用客户端网络实用工具配置连接到SQL Server 使用的协议。运行cliconfg.exe或从开始-->程序-->Microsoft SQL Server -->客户端网络实用工具调出该工具(参考图5)
(图5:使用客户端网络实用工具)
客户端网络实用工具中左边是禁用的协议,右边的是启用的协议。如果右边没有命名管道协议,则点击Enable按钮启用它。右边列表上的协议上下顺序决定在连接 SQL Server 实例时客户端超级套接字 Net-Library (Dbnetlib.dll)考虑使用的客户端协议的优先顺序。你可以改变它。
选中命名管道点击属性(Properties)按钮即可查看客户端连接的缺省的命名管道名称。
缺省情况下是sql\query(参考图6)。需要注意的是该名称是不完整的,连接的时候客户端超级套接字网络库会自动补充完整成\\RemoteComputerName\pipe\sql\query 格式。
如果命名管道连接出现问题, 必须保证SQL Server 监听的命名管道名称和客户端连接的缺省管道名称是一致的。
(图6:客户端连接的缺省命名管道名称)
2.使用SQL Server Configuration Manager
我们也可以过SQL Server Configuration Manager为SQL Server Native Client这个数据库驱动配置客户端网络协议。
我们打开SQL Server Configuration Manager,在左侧的面板中展开SQL Native Client Configuration(或者SQL Native Client 10.0 Configuration)节点,并选中节点下面的Client Protocols。此时在右侧面板你会看到所有支持的客户端协议。我们可以通过右键来启动和禁用命名管道协议。可以右键选择属性来编辑客户端的默认管道。见图7。
(图7)
3.善用客户端SQL Server别名
可以在客户端配置SQL Server别名,以明确指定连接到SQL Server所使用的协议。在某些情况下, SQL Server 监听的命名管道或IP地址、端口等可能并不是缺省的那样而是出于某种目的已被改变。在这种情况下就可以使用客户端SQL Server别名来解决连接问题。使用客户端网络实用工具可以方便的创建、删除或修改SQL Server别名(参考下面二图):
(图8)
注意上图中的pipe name必须和服务器上监听的命名管道名称匹配,Server Name里填上的的字符串必须是正确的SQL Server服务器名字。而Server Alias里填的是任意的合法的名字字符串,不一定非得和SQL Server服务器名相同。
SQL Server Configuration Manager里面的配置步骤和上面的类似。(图9)
(图9)
五。 命名管道连接问题的解决步骤
好了,介绍到这里你应该对命名管道很不陌生了,也应该是时候讨论命名管道连接问题的解决步骤了:
步骤1:使用服务器端网络实用工具检查命名管道配置并确认SQL Server已经监听了命名管道协议。
步骤2:使用客户端网络实用工具检查客户端的连接协议配置,确保启用了命名管道。当然,客户端连接的缺省管道名称需要和SQL服务器监听的一致。另外,需要仔细查看是不是存在错误的SQL Server 别名。
步骤3:检查网络连通性。例如要确保不但能够ping通 SQL Server服务器的IP地址,也
能够ping 通SQL Server服务器的名称。
步骤4:检查客户端是否能够通过SQL Server 服务器的Windows认证。可以使用如下命令进行:
net view \\servername
net use \\servername\IPC$
如果这两条命令出错,则表明有访问SQL Server服务器权限上的问题。需要扫除了这些问题之后再去解决命名管道连接的问题。
步骤 5:确保客户端登录(login)帐号有权限访问SQL Server。为了简化问题,排除Windows认证问题的干扰,在作这一类问题分析时,如果SQL Server配置了SQL Authentication,建议还是使用一个SQL Server帐号。等SQL Server帐号能连通以后,再使用Windows帐号。
如果上述五个步骤还不能解决命名管道的连接问题,那么你可以使用下面介绍的实用工具来测试命名管道。
六。测试命名管道连接的实用工具
SQL Server安装盘带有测试网络命名管道服务完整性的实用工具makepipe和readpipe。 这两个小工具需要一起使用。可在SQL Server 2000 光盘上的 x:\x86\Binn 目录下找到该实用工具。使用方法如下:
1)在服务器的操作系统命令提示符处键入:
Makepipe /pmytestpipe
注意/p和后面的pipename不能有空格
这将创建命名管道 \\.\pipe\mytestpipe 。
运行该命令后返回信息如下:
Making PIPE:\\.\pipe\mytestpipe
read to write delay (seconds):0
Waiting for Client to Connect...
Waiting for client to send... 1
Data Read:
Hello world
(参考图10)
(图10:使用makepipe实用工具)
2)在客户端工作站的操作系统命令提示符处键入:
readpipe /Smy server /D“Hello world” /pmytestpipe
其中 “Hello world” 是测试字符串。如果字符串包含空格,则必须括在双引号内。 /S 与服务器名称之间无空格, /D 与字符串之间无空格 /p与pipename之间不能有空格
如果命名管道连接可以建立,则客户端工作站分别返回以下信息:
SvrName:\\myserver
PIPE :\\myserver\pipe\mytestpipe
DATA :Hello world
Data Sent: 1 :Hello world
Data Read: 1 :Hello world
(参考图11)
(图11:使用readpipe实用工具)
如果readpipe和makepipe工具无法连通,说明网络命名管道服务不可用。这时候就需要先检查网络连通性问题或访问Windows的权限问题。
七. 一些常见的连接问题
连接问题一 :
[Named Pipes]SQL Server does not exist or access denied.
[Named Pipes]ConnectionOpen (Connect()).
这个连接错误多是因为客户端没有找到命名管道服务器(也就是SQL Server)造成的。
解决方法:
1)检查网络连通性,如ping等,确认SQL Server已经启动。
2)检查SQL server 服务器端和客户端的命名管道配置。
连接问题二:
Login failed for user ‘NULL’或Login failed for user anonymous
这个错误基本上意味着网络连通性没有问题, 只是使用命名管道访问服务器有权限上的问题。不要忘记那个IPC$共享哦。没有权限访问IPC$就无法使用命名管道。可以运行“net use \\servername\IPC$ ”命令测试一下。
大多数情况下这个错误是因为你使用了权限不足的账号登录客户端机器,而你又使用Windows authentication 访问SQL Server 引起。比方说你使用客户端机器的本地帐号登录,同时使用了windows authentication方式访问SQL Server。 由于客户端本地帐号没有权限访问服务器的资源,必然会导致访问失败。 解决方法就是使用域的帐号重新登录客户端机器,同时确保该域帐号已经加入到SQL Server 的login里面。还有另外一个方法就是使用SQL Server 帐号而不是windows帐号尝试连接SQL Server,并且使用TCP/IP 协议。不要忘了,即使使用SQL帐号,如果协议是命名管道,也是需要Windows 认证的。
连接问题三:
Login failed for user 'User123'.
这类问题多是User123没有权限访问服务器的资源,或没有权限访问SQL Server。应该不是一个连接问题而是一个SQL Server访问权限(即SQL Server的身份验证)问题了 J
八. 友情贴士(Tips)
1.连接建立后,如何查看使用的协议呢?可以在SQL Server 2000的Query Analyzer或者SQL Server 2005/2008得Management Studio中运行如下语句:
Select Net_library, hostname, program_name, nt_domain, nt_username, loginame from
master..sysprocesses where spid>50
其中的net_library字段说明该连接使用的协议。注意如果你看到协议是LPC,那么它代表是使用shared memory 连接的。
2.当使用来自 SQL Server 7.0 或其早期版本的 SQL Server 客户端连接组件时,在连接到 SQL Server 2000 的命名实例之前,必须使用客户端网络实用工具设置别名.另一个方法是安装MDAC 2.6或以后更高的MDAC版本.只有MDAC2.6或更高版本才有能力不用客户端别名连接到SQL Server 2000的命名实例.
3.除了使用SQL Server查询分析器(Query Analyzer)测试SQL Server 的连接问题外, 另一个更好的测试工具是ODBC数据库源. 运行ODBCAD32.exe即可调出该工具.使用该工具可以尝试建立连接到SQL server 的系统DSN. 为什么说ODBCAD32.exe工具比较好呢?因为它输出的信息比Query Analyzer的要详细.
比方说连接到不存在的服务器, Query Analyzer中输出的信息是:
而如果ODBC数据源建立ODBC DSN来测试, 输出的信息是:
这个信息不但指出了连接使用的协议,而且显示了一个重要的错误号码如上图的53.
如果使用 NET Helpmsg 查看错误号53,你会发现:
Net helpmsg 53
The network path was not found.
既然是network path not found, 很明显是网络的连通性问题了.
4. 命名管道也可以说是基于命名文件系统 NPFS(Named Pipe File System)来实现的,相关的驱动程序有npfs.sys等.有兴趣的读者可自行研究.
5.最后贴一个从SQL Server 联机手册里面的一张通讯组件图,希望对理解SQL Server 的连接问题有帮助: