SQL Server 2005 连接和卷影复制服务(VSS)

适用于: Microsoft SQL Server 2005 Standard EditionMicrosoft SQL 2005 Server EnterpriseMicrosoft SQL Server 2005 Developer Edition

SQL Server 支持语音列


SQL Server 2005 连接和卷影复制服务

若要根据你的需要自定义此列,我们希望邀请你提交有关你感兴趣的主题和你希望在未来的知识库文章中解决的问题以及支持语音列的建议。 你可以使用Ask For It表单提交你的想法和反馈。 此列底部还有一个指向窗体的链接。
欢迎回来! 我正在与 Microsoft SQL Server 内容团队 Sandy Yakob。 我是 SQL Server 支持语音列的女主人。 有关我的快速笔记:我已与 Microsoft 进行了14年的相关介绍。 过去三年来,我一直在使用 SQL Server 内容团队。 对于本月的专栏,Suresh Kandoth 将解决 Microsoft SQL Server 2005 连接和卷影复制服务(VSS)的需要。 Suresh 是一个与 SQL Server 支持团队的升级工程师。 他曾在过去四年的时间里使用过 SQL Server 技术。 我希望您尽情享受专栏,找到它很有帮助。

SQL Server 2005 连接和 VSS

在本文中,我们将讨论使用支持卷影复制服务(VSS)的备份应用程序时可能遇到的 SQL Server 连接问题。

背景信息

在跳转到这些错误和问题的详细信息之前,让我们看一下本讨论中涉及的不同组件。
  • VSS VSS 是一个包含一组接口和结构的框架,这些接口和结构使应用程序可以在其他应用程序使用这些卷中的数据时执行卷备份。 VSS 包含在 Microsoft Windows XP 和 Microsoft Windows Server 2003 中。
  • 备份应用程序备份应用程序是指使用 VSS 获取快照备份的任何 Windows 应用程序。 例如,Windows 中包含的 Windows NT 备份应用程序是一个备份应用程序。
  • 写入编写器是应用程序或服务,可在磁盘上存储持久信息,并通过卷影复制接口与提供程序和请求者协作。 我们将在本文中讨论 MSDEWriter 编写器和 SqlServerWriter 编写器。
    • MSDEWriter: MSDEWriter 编写器是 SQL Server 的 VSS 编写器。 MSDEWriter 包含在 Windows XP 和 Windows Server 2003 的 VSS 框架中。 MSDEWriter 适用于 SQL Server 7.0、SQL Server 2000 和 SQL Server 2005。
    • SqlServerWriter: SqlServerWriter 编写器是 SQL Server 的 VSS 编写器。 SqlServerWriter 包含在 SQL Server 2005 中。 SqlServerWriter 仅适用于 SQL Server 2005 的实例。

连接到 SQL Server

你可能想知道为什么当组件仅执行卷备份时,VSS 框架组件需要连接到 SQL Server。 在创建快照的初始阶段,配置的默认编写器将与特定服务器上的 SQL Server 实例建立连接。 快照创建过程的第一个阶段是 "备份初始化"。 在此阶段中,备份应用程序(请求程序)执行以下操作以确保快照创建过程中的所有组件均已准备好:
  • 备份应用程序绑定到IVssBackupComponents接口。
  • 备份应用程序初始化IVssBackupComponents接口。
  • 备份应用程序调用IVssGatherWriterMetadata API 以执行元数据枚举。
然后,VSS 框架指示所有编写器收集元数据。 这包括 SQL Server 附带的默认编写器。 它可以是基于服务器的当前设置的 MSDEWriter 或 SqlServerWriter。 SQL Server 的此默认编写器将连接到本地系统上启动的所有 SQL Server 实例,获取有关 SQL Server 实例上的数据库的所需信息,然后创建元数据文档。 然后,将元数据文档返回到备份应用程序。

标识编写器

MSDEWriter 或 SqlServerWriter 将执行元数据枚举。 因此,MSDEWriter 或 SqlServerWriter 将需要连接到 SQL Server 实例。 若要确定默认情况下配置为 SQL Server 实例的编写器的编写器,请使用以下信息。
SQL Server 版本注册表项 MSDEVersionChecking = 0 [或缺少]注册表项 MSDEVersionChecking > 0
7.0元数据枚举由 MSDEWriter 完成元数据枚举由 MSDEWriter 完成
2000元数据枚举由 MSDEWriter 完成元数据枚举由 MSDEWriter 完成
2005元数据枚举由 MSDEWriter 完成元数据枚举由 SqlServerWriter 完成
MSDEVersionChecking 值位于HKEY_LOCAL_MACHINE 的 \system\currentcontrolset\services\vss\settings注册表项中。 这是一个 DWORD 值,可能不会显示,除非你手动创建它。即使 SqlServerWriter 是随 SQL Server 2005 一起安装的,也不会将其配置为 SQL Server 2005 的默认写入程序。 必须手动将 SqlServerWriter 配置为默认编写器。 有关更多信息,请访问下面的 Microsoft 网站: 将编写器中的连接问题故障排除到 SQL Server 实例时,必须注意以下重要信息:
  • 当 MSDEWriter 尝试建立连接时,VSS 作为此特定连接尝试的客户端作为 SQL Server 的客户端。
  • 当 SqlServerWriter 尝试建立连接时,SQL Server VSS 编写器服务作为此特定连接尝试的客户端用作 SQL Server 的客户端。

编写器尝试连接到 SQL Server 时出现的问题

当默认编写器尝试连接到计算机上的 SQL Server 实例时,你可能会遇到以下两个问题:
  • 编写器无法对 SQL Server 实例执行成功的身份验证。
  • 编写器无法与 SQL Server 实例建立成功连接。
使用备份应用程序时所注意到的症状因问题而异。 对于身份验证问题,编写器无法执行元数据枚举,并在 Windows 事件日志和编写器的已配置跟踪日志中产生即时错误。 对于连接问题,备份应用程序将在初始化阶段停止响应一段延长时间。 在应用程序停止响应后,将在 Windows 事件日志和编写器的已配置跟踪日志中记录条目。

身份验证问题

安装 VSS 服务和 SQLWriter 服务时,服务启动帐户将配置为 "本地系统 [NT AUTHORITY\SYSTEM]"。 当编写器尝试建立与 SQL Server 实例的连接时,编写器使用本地系统 [NT AUTHORITY\SYSTEM] 启动帐户的凭据。 你必须确保 SQL Server 实例已通过显式或通过 BUILTIN\Administrators.If 身份验证问题的组成员身份授予此 Windows 帐户的访问权限,Windows 事件日志中记录了以下消息。
消息 1
事件类型: ErrorEvent 源: SQLWRITEREvent 类别: NoneEvent ID:24583Date: 4/30/2006Time:11:38: 44 AMUser: N/AComputer:ComputerName错误:调用 IDBInitialize:: Initialize 时遇到 OLEDB 错误。 hr = 0x80040e4d。 SQLSTATE:28000,本机错误:18456Error 状态:1,严重性:14Source: Microsoft SQL Native ClientError 消息:登录用户 "NT AUTHORITY\SYSTEM" 失败。DBPROP_INIT_DATASOURCE: ComputerNameDBPROP_INIT_CATALOG: MASTERDBPROP_AUTH_INTEGRATED: SSPI
消息 2
事件类型: ErrorEvent 源: SQLWRITEREvent 类别: NoneEvent ID:24583Date: 4/30/2006Time:11:38: 44 AMUser: N/AComputer:ComputerName错误:调用 IDBInitialize:: Initialize 时遇到 OLEDB 错误。 hr = 0x80040e4d。 SQLSTATE:28000,本机错误:18456Error 状态:1,严重性:14Source: Microsoft SQL Native ClientError 消息:登录用户 "NT AUTHORITY\SYSTEM" 失败。DBPROP_INIT_DATASOURCE: ComputerNameDBPROP_INIT_CATALOG: MASTERDBPROP_AUTH_INTEGRATED: SSPI
消息 3
使用 SQL Server VSS 编写器执行备份时,可能会遇到以下错误:
日志名称: ApplicationSource: SQLWRITEREvent ID:24581Task 类别: NoneLevel: ErrorDescription: Sqllib 错误: SQL Server 实例中的系统表 sys.databases sysdatabases <SQL Server 名称> 为空。 如果本地系统帐户没有 "更改任何数据库" 或 "查看任何数据库服务器级权限" 或 "在 master 数据库中创建数据库权限",则将发生错误,因为它将无法查询 sys. 数据库目录视图。 具有 db_datareader 权限不足,此操作才能成功。
此操作要求本地系统(NT 机关/SYSTEM)帐户具有下列权限之一:
  • 更改任何数据库服务器级别的权限
  • 查看任何数据库服务器级别的权限
  • 在 master 数据库中创建数据库权限
消息 4
事件类型: ErrorEvent 源: VSSEvent 类别: NoneEvent ID:6013Date: 4/30/2006Time:11:38: 44 AMUser: N/AComputer:ComputerName错误:调用 IDBInitialize:: Initialize 时遇到 OLEDB 错误。 hr = 0x80040e4d。 SQLSTATE:42000,本机错误:18456Error 状态:1,严重性:14Source: Microsoft OLE DB Provider for SQL ServerError 消息:登录用户 "NT AUTHORITY\SYSTEM" 失败。
你可以使用事件源明确标识遇到问题的编写器。 第一个错误来自 SqlServerWriter。 第二个错误来自 MSDEWriter。 如果你运行的是 SQL 事件探查器跟踪,并且跟踪中包含 "审核失败登录" 事件,则会为事件捕获以下信息。
SQL Server 2005
SQL Server 2000
你可以通过使用客户端进程 ID 清楚地标识尝试建立连接的编写器。 由于严格的安全要求,SQL Server 安装可能已从 SQL Server 登录名中删除了 BUILTIN\Administrators 组。 如果出现此问题,您必须确保已授予 NT AUTHORITY\SYSTEM 帐户访问 SQL Server 的权限。 若要执行此操作,必须将其添加为显式登录。 此外,由于编写器必须执行的操作类型,我们建议不要从 sysadmin 服务器角色中删除 NT AUTHORITY\SYSTEM 登录。即使 MSDEWriter 编写器和 SqlServerWriter 编写者可以成功地登录到 SQL Server,如果权限不足以查询系统表或包含有关数据库和文件的文件的内容,则可能会遇到以下错误消息:
事件类型: ErrorEvent Source: VSSEvent 类别: NoneEvent ID:6013Date: 9 9:09:43/2006Time: Computername说明: Sqllib 错误:调用 PMUser:: Execute 时遇到 OLEDB 错误。 hr = 0x80040e09。 SQLSTATE:42000,本机错误:229错误状态:5,严重性:14Source: Microsoft OLE DB Provider for SQL ServerError 消息:在对象 "sysaltfiles"、数据库 "master"、所有者 "dbo" 中选择 "权限被拒绝"。
若要避免此错误消息,请确保为 SQL Server 中的帐户分配正确的权限。 例如,将此帐户添加到master数据库中的db_datareader数据库角色。

连接问题

当编写器无法与 SQL Server 实例建立 SQL 连接时,会出现此类问题。 分配的编写器尝试建立与当前正在运行的 SQL Server 的特定实例的连接。 如果出现建立连接的问题,则会在 Windows 事件日志中记录以下错误消息。
消息 1
事件类型: ErrorEvent 源: SQLWRITEREvent 类别: NoneEvent ID:24583Date: 4/30/2006Time:12:11: 06 PMUser: N/AComputer:计算机名: Sqllib 错误:调用 IDBInitialize:: Initialize 时遇到 OLEDB 错误。 hr = 0x80004005。 SQLSTATE: HYT00,本机错误:0Source: Microsoft SQL Native ClientError 消息:登录超时已过期 SQLSTATE:08001,本机错误:2Source: Microsoft SQL Native ClientError 消息:与服务器建立连接时发生错误。 连接到 SQL Server 2005 时,此故障可能是由默认设置 SQL Server 不允许远程连接的事实导致的。SQLSTATE:08001,本机错误:2错误状态:1,严重性:16Source: Microsoft SQL Native ClientError 消息:命名管道提供程序:无法打开到 SQL Server [2] 的连接。 DBPROP_INIT_DATASOURCE: ComputerNameDBPROP_INIT_CATALOG: MASTERDBPROP_AUTH_INTEGRATED: SSPI
消息 2
事件类型: ErrorEvent 源: SQLWRITEREvent 类别: NoneEvent ID:24583Date: 4/30/2006Time:12:52:40: N/PMUser:计算机名说明: Sqllib 错误:调用 AComputer:: Initialize 时遇到 OLEDB 错误。 hr = 0x80004005。 SQLSTATE: HYT00,本机错误:0Source: Microsoft SQL Native ClientError 消息:登录超时已过期 SQLSTATE:08001,本机错误:10061Source: Microsoft SQL Native ClientError 消息:与服务器建立连接时发生错误。 连接到 SQL Server 2005 时,此故障可能是由默认设置 SQL Server 不允许远程连接的事实导致的。SQLSTATE:08001,本机错误:10061错误状态:1,严重性:16Source: Microsoft SQL Native ClientError 消息: TCP 提供程序:无法建立连接,因为目标计算机主动拒绝它。DBPROP_INIT_DATASOURCE: ComputerNameDBPROP_INIT_CATALOG: MASTERDBPROP_AUTH_INTEGRATED: SSPI
消息 3
事件类型: ErrorEvent 源: SQLWRITEREvent 类别: NoneEvent ID:24583Date: 4/30/2006Time:4:52: 34 PMUser: N/AComputer:计算机名说明: Sqllib 错误:调用 IDBInitialize:: Initialize 时遇到 OLEDB 错误。 hr = 0x80004005。 SQLSTATE: HYT00,本机错误:0Source: Microsoft SQL Native ClientError 消息:登录超时已过期 SQLSTATE:08001,本机错误:2Source: Microsoft SQL Native ClientError 消息:与服务器建立连接时发生错误。 连接到 SQL Server 2005 时,此故障可能是由默认设置 SQL Server 不允许远程连接的事实导致的。SQLSTATE:08001,本机错误:2错误状态:1,严重性:16Source: Microsoft SQL Native ClientError 消息:共享内存提供程序:无法打开到 SQL Server [2] 的连接。 DBPROP_INIT_DATASOURCE: ComputerNameDBPROP_INIT_CATALOG: MASTERDBPROP_AUTH_INTEGRATED: SSPI
消息 4
事件类型: ErrorEvent 源: VSSEvent 类别: NoneEvent ID:6013Date: 4/30/2006Time:12:11: 06 PMUser: N/AComputer:计算机名: Sqllib 错误:调用 IDBInitialize:: Initialize 时遇到 OLEDB 错误。 hr = 0x80004005。 SQLSTATE:08001,错误:17错误状态:1,严重性:16Source: Microsoft OLE DB Provider for SQL ServerError 消息: [DBNETLIB] [ConnectionOpen (Connect ())。]SQL Server 不存在或访问被拒绝。
在前面的错误消息中,请注意对编写器、用于连接的协议和返回的错误消息进行密切注意。 对于审核登录事件,这些错误不会记录在 SQL 事件探查器跟踪中。 以下原因可能导致以下类型的连接问题:
  • 计算机上的别名配置了不正确的信息。
  • 没有客户用来连接的通用协议,并且服务器正在侦听。
  • 计算机上的 Microsoft Data Access 组件(MDAC)配置或 SQL Native Access 客户端(SNAC)配置已更改。
  • 特定平台或 SQL Server 版本存在已知的协议问题。
有关连接 proglems 的详细信息,请访问以下网站:

隔离连接问题

如果出现这些问题中的任何一个,并且你希望获取详细信息,则无需重复运行备份应用程序。 你可以使用 VSS 管理命令行工具(Vssadmin)。 若要确保使用由 VSS 使用的相同凭据和设置,请按照以下步骤运行模拟练习。 注意 以下步骤可让你使用 NT AUTHORITY\SYSTEM 帐户的凭据打开命令提示符。 作者还将使用 NT AUTHORITY\SYSTEM 帐户。
  1. 请确保 "任务计划程序" 服务已启动。
  2. 如果您使用的是终端服务连接或远程桌面连接,请确保登录到控制台会话。
  3. 在命令提示符处,键入以下命令:
    在 14:05/interactive cmd.exe
    注意 请确保在此命令中指定的时间早于计算机上的当前系统时间。 当达到指定的时间时,将显示新的命令提示符。 它类似于以下内容:
    C:\Windows\System32\svchost.exe
  4. 在新的命令提示符处,键入以下内容:
    Vssadmin list 编写器
  5. 查看输出以确定列出了哪些编写器,以及这些编写器的状态,特别是 MSDEWriter 和 SqlServerWriter。注意 如果元数据枚举出现问题,将不会列出写入程序。 你必须确保正确的编写器在 Vssadmin 输出中列出且没有错误。 必须先出现此问题,备份应用程序才能在快照创建过程中使用写入程序。
对于 SQL Server 的每个实例,必须检查 SQL Server 错误日志以了解此 SQL Server 实例当前正在侦听的协议。 下面列出了你将注意的典型条目。
SQL Server 2005
2006-04-29 13:00: 59.31 spid4s Server name 是 "ComputerName"。 这只是一条信息性消息。 无需任何用户操作。2006年-04-29 13:01:00.57 服务器服务器正在侦听 ["any" <ipv4> 1433]。2006年-04-29 13:01: 00.59 Server Server 本地连接提供程序已准备好接受 [\\.\pipe\SQLLocal\MSSQLSERVER] 上的连接。 2006-04-29 13:01:00.59 服务器服务器本地连接提供程序已准备好接受连接 [\\.\pipe\sql\query]。 2006-04-29 13:01:正在侦听 [127.0.0.1 <ipv4> 1434]。2006年-04-29 13:01: 00.60 Server SQL Server 现在已准备好进行客户端连接。 这是一条信息性消息;无需用户操作。
SQL Server 2000
2006-04-30 11:23: 08.18 spid3 Server name 为 "ComputerName\SQL2000"。 2006-04-30 11:23: 08.18 server sql server 侦听172.30.137.50: 2012.2006-04-30 11:23: 08.18 server sql server 侦听127.0.0.1: 2012.2006-04-30 11:23: 08.37 Server sql server 已准备好进行客户端连接的准备工作的 sql server。
查看前面的示例时,你会注意到 SQL Server 实例正在侦听以下三种协议:
  •  TCP
  • 命名管道
  • 共享内存
配置特定的协议后,有时服务器无法侦听。 有时,即使已配置一组特定的协议以供服务器侦听,服务器可能无法侦听所有这些协议。 这可能是由于服务器上的环境问题造成的。 因此,你将需要查看已针对此特定 SQL Server 实例所配置的协议以进行侦听。 对于 SQL Server 2005,你将需要使用 SQL Server 配置管理器。 对于 SQL Server 2000,你将需要使用服务器网络实用工具。现在我们将移动到协议配置的客户端部分。 需要记住两个客户端配置点。 第一个是启用的客户端协议的列表。 另一个是用于连接的客户端协议的顺序。 默认设置在各种操作系统以及 SQL Server 的不同版本和版本不同。 有关默认设置的详细信息,请参阅相应的联机丛书主题。此处要了解的关键点是至少应启用一个与服务器协议匹配的客户端协议。 你可以强制来自编写器的连接完成特定协议的唯一方法是在服务器上配置别名。 VSS 框架和编写器都不具有任何配置设置,你可以在其中为客户端计算机提供任何特定于连接的或身份验证特定的信息。你可以运行以下简单测试来确定使用哪种协议连接到 SQL Server 特定实例的默认连接:
  1. 请确保 "任务计划程序" 服务已启动。
  2. 如果您使用的是终端服务连接或远程桌面连接,请确保已登录到控制台会话
  3. 在命令提示符处,键入以下命令:
    在 14:05/interactive cmd.exe
    请确保在此命令中指定的时间早于客户端计算机上的当前系统时间。
  4. 当达到指定的时间时,将打开一个新的命令提示符窗口,其名称如下所示:
    C:\Windows\System32\svchost.exe
    .
  5. 在此窗口中,运行 SQL Server 版本的查询:
    • 对于 SQL Server 2005,请运行以下查询:
      sqlcmd -E –S<server> -Q"SELECT net_transport FROM sys.dm_exec_connections WHERE session_id = @@spid"
    • 对于 SQL Server 2000,请运行以下查询:
      osql -E –S<server> -Q"SELECT net_library FROM sysprocesses WHERE spid = @@spid"
  6. 此查询的输出将为你提供有关客户端计算机上的哪些协议工作的信息。 第5步中的查询可能失败,并向您提供错误消息。 您需要对该错误进行故障排除并解决该错误,以确保本地计算机上的 SQL Server 的客户端实例可以成功连接到有问题的 SQL Server 实例。
  7. 当运行sqlcmd命令或osql命令时,可以通过使用特定协议强制连接,然后观察结果。 若要执行此操作,请在服务器名称前加上-S参数和你感兴趣的协议。 例如,这三种可能性为:
    • –Stcp:servername
    • –Snp:servername
    • –Slpc:servername
    注意 在这些示例中,"服务器名称" 是您的服务器的名称。
有关基于 Windows Server 2003 x64 的计算机上出现的问题的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
913100 修复:当你尝试使用 Vssadmin 工具列出订阅的卷影副本写入程序时,将不包括 MSDE 编写器
有关 SqlServerWriter 如何与 VSS 和 SQL Server 实例交互的详细信息,请访问下面的 Microsoft 网站: 有关 vss 和 VSS 体系结构的详细信息,请访问以下 Microsoft 开发人员网络(MSDN)网站:有关如何管理对 Windows 帐户和组的 SQL Server 的访问的详细信息,请参阅 SQL Server 2005 联机丛书中的以下主题:
  • 创建登录(Transact-sql)
  • sp_grantlogin (Transact-sql 参考(SQL Server))
有关如何在 SQL Server 2005 中管理 SQL Server 正在侦听的协议的详细信息,请访问以下 MSDN 网站: 有关如何在 SQL Server 2000 中管理 SQL Server 正在侦听的协议的详细信息,请访问以下 MSDN 网站: 有关如何管理协议顺序和可用于 SQL Server 2005 中的客户端连接的协议列表的详细信息,请访问以下 MSDN 网站: 有关如何管理协议顺序和可用于 SQL Server 2000 中的客户端连接的协议列表的详细信息,请访问以下 MSDN 网站: 有关连接问题的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
827422 如何解决 SQL Server 2000 中的连接问题
812817 支持网络广播: Microsoft SQL Server 2000:连接疑难解答
若要确保 MDAC 安装正常运行且网络库安装正确,请访问以下 Microsoft 网站下载组件检查器实用工具: 我想感谢 Suresh 对本文的工作。 他对多个 Microsoft Windows server 产品拥有深入的体验,并且喜欢支持客户和调试问题。 希望本月的主题满意! 谢谢您的阅读!正如往常一样,你可以在将来的专栏或知识库中使用 "请求 It " 窗体免费提交有关主题的观点。