SQL Server应用与开发范例宝典
上QQ阅读APP看书,第一时间看更新

1.10 常见问题与解决

实例047 连接失败

这是一个提高基础技能的实例

实例说明

连接SQL Server实例失败时,最常见的错误是“连接服务器×××失败,SQL Server不存在或访问被拒绝”。本实例将解决这一问题。

技术要点

上述问题可能由以下原因造成。

● MS SQL Server服务没有启动。

● Net-Library与协议问题。

● MDAC的问题。

● 防火墙的问题。

实现过程

引起连接失败的原因很多,初学者最易犯的错误是没有启动MS SQL Server服务,SQL Server安装后,应该检查MS SQL Server服务是否启动,如果需要,最好将其设置为自动启动。检查MS SQL Server服务是否需要启动的步骤如下。

(1)在SQL Server服务器中,打开SQL Server服务管理器。依次选择“开始”→“程序”→“Microsoft SQL Server”→“服务管理器”菜单命令。

(2)在打开的“SQL Server服务管理器”对话框中,单击“服务器”下拉列表,选择要检查的SQL Server实例名,如MRGCY,单击“服务”下拉列表,选择SQL Server选项,如果此时“暂停”与“停止”按钮可用,则说明MS SQL Server服务已经启动。

(3)如果需要,在“SQL Server服务管理器”对话框中选择“当启动OS时自动启动服务”复选框,让MS SQL Server服务随操作系统启动而自动启动,如图1.221所示。

图1.221 SQL Server服务管理器

除了上面这种最初级的错误外,导致连接服务器失败更多的原因是Net-Library、网络、协议及防火墙的配置问题。

1.NET-Library与协议问题

(1)要保证客户端能正常访问SQL Server实例,首先要保证网络是畅通的,最简单的方法是在操作系统中,通过网上邻居访问SQL Server实例所在服务器的共享资源,如果能访问,可以证明网络是通的。

(2)要注意NET-Library的匹配问题,如果客户端与SQL Server实例采用不匹配的NET-Library,那么客户端无法连接到SQL Server实例。可以通过服务器网络实用工具配置SQL Server实例上的NET-Library,用客户端网络实用工具配置客户端的NET-Library。

(3)如果使用TCP/IP通信,需要注意端口的问题。

服务器端必须在特定的端口上监听,要检查服务器是否在监听指定的端口,可以按照以下操作步骤进行。

① 依次选择“开始”→“运行”菜单命令,在“运行”对话框的“打开”文本框中输入“cmd”。

② 在命令提示符下,执行下列命令:

        NETSTAT-an

③ 查询结果中,有无Proto为TCP、Local为指定端口号、State为LISTENING的项。

客户端可以执行Telnet程序,验证是否可以连接到SQL Server正在侦听的端口,具体操作如下。

说明:SQL Server实例会开启一个端口,监听客户端的连接,而客户端可以通过执行Telnet程序来检查客户端是否可以与SQL Server实例监听的端口建立连接。

① 依次选择“开始”→“运行”菜单命令,在“运行”对话框的“打开”文本框中输入“cmd”。

② 在命令提示符下,执行下列命令(IP Address是SQL Server实例所在服务的IP地址,Port Number是服务端设置的监听端口):

        Telnet <IP Address> <port Number>

如果Telnet程序没有成功,则根据接收到的错误信息作相应的处理。如果网络中有防火墙,则应该检查防火墙是否阻止了该端口的通信。如果通过Internet连接,验证失败时,应该咨询网络服务供应商该端口是否被限制。

客户端连接时,必须使用服务器端配置的端口,如果未在客户端中做端口配置,可以在应用程序连接时,直接指定连接使用的端口号,方法是在连接的SQL Server实例名后使用逗号(,)加端口号。例如,连接的服务器名为Server,端口号为123的SQL Server实例时,应指定服务名为Server,123。

(4)NET-Library必须与特定的网络协议一起使用。比如,TCP/IP套接字Net-Library应该配置TCP/IP网络协议使用。如果NET-Library没有与之对应的网络协议,则客户端与服务器端无法完成通信。

(5)如果使用服务器名连接,要注意DNS解析的问题。

域名系统(DNS)中的名称解析过程用于解析SQL Server实例名称的IP地址。如果名称解析过程工作不正常,就不能获得SQL Server实例,可以通过下面的步骤验证名称解析过程是否正确。

① 依次选择“开始”→“运行”菜单命令,在“运行”对话框的“打开”文本框中输入“cmd”。

② 在命令提示符下,运行下列命令(Server Name是SQL Server实例的服务器名),并记录返回的IP地址:

          ping<Server Name>

③ 在命令提示符下,运行下列命令(Ipaddress是步骤②中记录的IP地址):

          ping-a <IP address>

如果两个指定的命令有任何一个不成功、超时或没有返回正确的值,那么说明DNS查找未能正常工作,或者有其他网络或路由问题引发的问题。

2.注意MDAC问题

MDAC的问题也可能会引起连接问题。例如,安装一个软件可能会覆盖一些MDAC文件或更改权限,而用户需要这些权限才能访问MDAC文件。

要访问SQL Server命名实例,要求客户端安装的是MDAC 2.6或更新的版本。MDAC的早期版本不识别SQL Server的命名实例。因此,可能无法连接到命名实例。

3.注意防火墙的问题

SQL Server是Windows应用程序,它使用套接字网络库通过TCP/IP进行通信。SQL Server侦听特定端口(默认是1433,可以通过服务网络实用工具修改)上的传入连接。

在客户端建立TCP/IP连接时,执行三向的握手。客户端打开一个源端口并向目标端口(默认情况下是1433)发送通信量。使用中的客户端源端口是随机的,但它大于1024。默认情况下,当应用程序从系统为传出呼叫请求套接字时,提供介于值1024~5000的端口。SQL Server通过将来自1433的通信量发送回该客户端建立的端口,与该客户端进行通信。形成1433(服务器默认端口)→ANY(客户端源端口)的连接。

防火墙软件应该通过使用规则允许进行此动态分配。没有任何方法可以限制用于要连接的SQL Server客户端的源TCP端口的数目。

实例048 用户登录失败

这是一个提高基础技能的实例

实例说明

在Visual Basic和SQL Server中的查询分析器、企业管理器都不能连接SQL Server,不管是使用Windows身份验证方式还是SQL Server身份验证方式,都显示登录失败。下面将介绍解决这一问题的方法。

技术要点

(1)使用Windows身份验证连接时遇到的错误信息为未能建立与“服务器名”的连接。原因为用户“用户名”登录失败。

(2)使用SQL Server身份验证连接时遇到的错误信息为用户“用户名”登录失败,原因为未与信任SQL Server接连相关联。

从第一个错误信息来看,是一个Windows账户登录失败,原因为该账户不在SQL Server的登录账户里面。如果用户在SQL Server服务器上连接自身的话,默认情况下Windows账户登录肯定是成功的,因为SQL Server会把BUILTIN\Administrators作为默认的登录账户。

第二个错误信息表明SQL Server使用了“仅Windows”的身份验证方式,因此用户使用SQL Server身份验证方式会导致“未与信任SQL Server连接相关联”的错误。

综上所述,出现这个问题的原因可能是由于SQL Server使用了“仅Windows”的身份验证方式,同时用户删除了BUILTIN\Administartors以及<机器名>\Administrator两个登录账户而引起的。

实现过程

解决上述问题可以通过修改注册表的方法把SQL Server的身份验证方式改为“SQL Server和Windows”,具体操作步骤如下。

(1)依次选择“开始”→“运行”菜单命令,输入Regedit.exe,回车后进入注册表编辑器。(2)依次展开注册表项,浏览到以下注册表项:

        HKEY-LOCAL-MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer

(3)在屏幕右方选择“LoginMode”,并双击它,打开“编辑DWORD值”对话框。

(4)将“数值数据”文本框中的1改为2,单击“确定”按钮。

(5)关闭注册表编辑器后重新启动SQL Server服务。

这样,用户可以使用SQL Server登录账户连接SQL Server服务器了,但是仍然无法使用Windows身份验证模式来连接SQL Server。因为BUILTIN\Administrator和<机器名>\Administrator两个登录账户不存在。

接下来,将创建这两个登录账户。

(1)在企业管理器中使用SQL Server身份验证方式新建SQL Server注册。

(2)在企业管理器中用右键单击所注册的服务器。

(3)展开“安全性”,右键单击“登录”,然后选择“新建登录”菜单命令,打开“SQL Server登录属性”对话框中的“常规”选项卡,如图1.222所示。

图1.222 “常规”选项卡

(4)在“名称”文本框中输入BUILTIN\Administrators。

(5)在“服务器角色”选项卡中选择System Administrators,如图1.223所示。

图1.223 “服务器角色”选项卡

(6)单击“确定”按钮退出。

(7)使用同样方法添加<机器名>\Administrator登录。

(8)将SQL Server的身份验证模式改为“SQL Server和Windows”。

说明:

        HKEY-LOCAL-MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer\LoginMode

上述注册表中的键值决定了SQL Server将采取何种身份验证模式。该值为1,表示使用Windows身份验证模式;该值为2,表示使用混合模式。因此,只要修改该键值就可以在不登录到SQL Server的情况下更改SQL Server的身份验证模式。

实例049 解决SQL Server 2000无法安装

这是一个提高基础技能的实例

实例说明

在安装SQL Server 2000的时候,有时候会遇到一些安装失败的问题。下面将通过实例来解决SQL Server 2000无法安装的问题。

技术要点

如果已有不成功的SQL Server 2000的安装,可以检查两个文件的帮助,找出失败的原因。第一个文件是Windows目录中的Sqlstp.log文件。Sqlstp.log文件提供有关安装程序当前所进行操作的详细信息,并包含安装过程中遇到的所有错误。查阅该文件将使您更好地理解安装程序在哪里失败以及为何失败。

在安装的配置部分,SQL Server安装程序运行名为Cnfgsvr.exe的应用程序以配置SQL Server。该应用程序启动SQL Server,连接,并运行初始化安装脚本。该进程中遇到的所有错误写入Sqlstp.log文件。此外,应当检查SQL Server错误日志,该日志文件名为Errorlog(无文件扩展名),默认情况下位于Program Files\Microsoft SQL Server\Mssql\Log目录。该错误日志将包含在安装程序尝试启动SQL Server时SQL Server遇到的所有错误。

如果无法确定安装程序失败的起因,可以保存上面提到的文件,并致电Microsoft产品支持服务(PSS)与SQL Server支持专业人员联系,以帮助您解决问题。如果安装应用程序失败,它回滚对文件系统进行的所有更改(包括删除任何已复制的文件),并删除对注册表进行的所有更改。

实现过程

如果遇到SQL Server 2000无法安装,可以尝试使用下面几种方法解决。

(1)将安装光盘复制到本地硬盘上,再进行安装。

这种方法适用于“安装程序无法读取文件”的错误。安装程序复制到本地,可以避免很多由安装介质或网络传输等问题引起的错误。

(2)选择“最小”安装。

有时候,选择“最小”安装可以避免由于安装了其他一些可能发生问题的组件而导致的安装失败,尤其是在安装故障转移群集的时候。

(3)除了以下服务之外的所有服务启动类型设置为“手动”,然后重新启动计算机后再进行安装。

这种方法适用于由于第三方服务或者冲突的服务导致安装过程失去响应的情形。

(4)检查注册表以及系统文件夹进行权限设置,确保administrator具有完全控制的权限。

如果administrator不具有对安装所需要的文件夹或者注册表完全控制的权限,则会导致某些安装步骤由于权限不足而失败。

(5)检查操作系统的MDAC(Microsoft数据访问组件)版本。

MDAC全称为Microsoft Data Access Component,Microsoft数据访问组件。Microsoft数据访问组件包括ActiveX数据对象(ADO)和远程数据服务(RDS),Microsoft为ODBC提供的OLEDB Provider、开放的数据库连接(ODBC)和为Microsoft SQL Server、Microsoft Access及其他桌面数据库以及Oracle数据库提供的ODBC驱动程序等。

如果操作系统的MDAC版本过低,或者MDAC中包含的驱动程序有问题,将会导致安装失败。用户可以到以下站点下载一个名为Component Checker(组件检查器)的工具,用该工具来检查当前的MDAC信息,给出一个详细的报表用于列出有问题的组件信息:

        http://www.Microsoft.com/download/details.aspx?FamilyId=8F0A8DF6-4A21-4B43-BF53-14332EF092C9&displaylang=en

(6)如果以上方法尚不能解决问题,可以到以下位置找到记录SQL Server安装过程的日志文件:

        C:\WINNT\sqlstp.log或C:\WINNT\Cnfgsvr.out

从中找出完整的错误信息或提示,再对症下药进行解决。

实例050 解决SQL Server 2000卸载失败问题

这是一个提高基础技能的实例

实例说明

由于卸载SQL Server的时候出错,在控制面板的“添加/删除程序”中便看不到SQL Server了,但是SQL Server还没有被完全卸载,它的程序组和一些工具都还存在,这样系统将无法再次安装SQL Server。本例将介绍完全卸载SQL Server 2000。

技术要点

SQL Server卸载失败后,用户可以手工卸载SQL Server,首先删除相关的注册表项,然后再删除相关的文件目录。

(1)删除注册表子项。

示例代码如下:

        HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft \MSSQLServer
        HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft \Microsoft SQL Server
        HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSSQLSERVER
        HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SQLSERVERAGENT
        HKEY_LOCAL_MACHINE\SYSEM\CurrentControlSet\Services\MSSQLServerADHelper

(2)删除相关的文件目录。

手工删除安装目录,默认情况下位于下面给出的位置:

        C:\Program Files\Microsoft SQL Server

卸载Microsoft Search服务,需要删除:

        HKEY_LOCAL_ MACHINE\SOFTWARE\Microsoft\Search

卸载Microsoft全文查询,需要删除:

        HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSFTPSVC
        HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSSCNTRS
        HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSSCNTRS
        HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlsSet\Services\MSSEARCH
        HKEY_LOCAL_MACINE\SYSTEM\CurrentControlSet\Services\MSSGATHERVER
        HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSSGTHRSVC
        HKEY_LOCAL_MACHINE\SYSTEM\CurrentControSet\Services\MSSINDEX

实现过程

下面介绍手工卸载SQL Server 2000,具体操作步骤如下。

(1)依次选择“开始”→“运行”命令,输入Regedit.exe,打开“注册表编辑器”。

(2)删除以下注册表子项。

        HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer
        HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server
        HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSSQLSERVER
        HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SQLSERVERAGENT
        HKEY_LOCAL_MACHINE\SYSEM\CurrentControlSet\Services\MSSQLServerADHelper

(3)手工删除安装目录。

          C:\Program Files\Microsoft SQL Server

(4)卸载Microsoft Search服务,删除以下注册表子项。

          HKEY_LOCAL_ MACHINE\SOFTWARE\Microsoft\Search

(5)卸载Microsoft全文查询,删除以下注册表子项。

          HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSFTPSVC
          HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSSCNTRS
          HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSSCNTRS
          HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlsSet\Services\MSSEARCH
          HKEY_LOCAL_MACINE\SYSTEM\CurrentControlSet\Services\MSSGATHERVER
          HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSSGTHRSVC
          HKEY_LOCAL_MACHINE\SYSTEM\CurrentControSet\Services\MSSINDEX

注意:在进行此项操作之前,建议用户应从安全角度出发,对注册表文件以及重要的数据库文件进行备份。

举一反三

根据本实例,读者可以:

通过光盘删除SQL Server 2000;

通过“添加/删除程序”删除SQL Server 2000。

实例051 解决安装SQL Server补丁时出现的问题

这是一个提高基础技能的实例

实例说明

安装SQL Server补丁时会遇到一些问题,本实例将介绍解决这些问题的方法。

技术要点

SQL Server的补丁版本检查不如Windows补丁版本检查直接,作为系统管理员,如果不了解SQL Server版本对应的补丁号,可能也会遇到一点麻烦。可以通过以下方法检查SQL Server的补丁版本。

(1)通过以下两种方法可以登录到SQL Server。

● 通过isql登录到SQL Server。

要通过isql登录到SQL Server,首先应该在cmd窗口输入以下命令,然后输入密码进入:

          isql-Usa

● 通过SQL查询分析器登录到SQL Server。

要通过SQL查询分析器登录到SQL Server应该从程序中启动,输入sa和密码(也可以通过Windows验证)。

(2)在isql或者SQL查询分析器中输入并执行以下SQL语句。

          Select@@Version

这时会返回SQL的版本信息如下:

          Microsoft SQL Server2000-8.00.760(Intel X86)Dec 172002 14:22:04 Copyright(c)1988-2003 Microsoft Corporation
    Enterprise Edition on Windows NT 5.0(Build 2195:Service Pack3)

其中的8.00760就是SQL Server的版本和补丁号。对应关系如下:

          8.00.194—        SQL Server 2000RTM
          8.00.384—      (SP1)
          8.00.534—      (SP2)
          8.00.760—      (SP3)

实现过程

如果在安装过程中出现“以前进行的程序创建了挂起的文件操作,运行安装程序前,必须重新启动”的提示时,重新启动计算机,再次进行安装,如果发现还有该错误,应执行下面的步骤。

(1)选择“开始”→“运行”,在打开的“运行”对话框中输入regedit。

(2)在打开的“注册表编辑器”窗口中,找到HKEY_LOCAL_MACHINE\SYSTEM\

CurrentControlSrt\Control\Session Manager位置。

(3)在“注册表编辑器”窗口中的主菜单中,选择“注册表”→“导出注册表”命令,将注册表导出至某个文件夹中。

(4)在“注册表编辑器”窗口的右边窗口中,用鼠标右键单击PendingFileRenameOperations,然后选择“删除”命令,在打开的“确认”对话框中,单击“确认”按钮。

(5)重启安装SQL Server补丁,即可解决这种问题。

在安装SQL Server SP3时;有时候无论用Windows认证还是混合认证,都会出现密码错误的情况,这时查看临时目录下的sqlsp.out,会发现以下描述:

        [TCP/IP Sockets]Specified SQL server not found
        [TCP/IPSockets]ConnectionOpen(Connect()).

其实这是SQL Server SP3的一个小缺陷,在安装SP3的时候,没有监听TCP/IP端口,可以执行以下步骤来解决这个问题。

(1)打开SQL Server客户端网络实用工具和服务器网络工具,确保启用的协议中包含name pipe,并且处在第一位。

(2)在“注册表编辑器”窗口的左边子窗口中,依次单击“HKEY_LOCAL_MACHINE”→“SOFTWARE”→“Microsoft”→“MSSQL Server”→“Client”→“ConnectTo”。

(3)在“注册表编辑器”窗口的右边子窗口中,确保名称为DSQUERY的键的数据值为DBNETLIB。

(4)停止MS SQL。

(5)再次安装SQL Server SP3。