排查SQL Server备份和还原操作问题

本文提供了 Microsoft SQL Server备份和还原操作期间可能会遇到的常见问题的解决方案,并提供了有关这些操作的详细信息的参考。

原始产品版本:SQL Server
原始 KB 编号: 224071

备份和还原操作需要很长时间

备份和还原操作需要大量 I/O。 备份/还原吞吐量取决于优化基础 I/O 子系统以处理 I/O 卷的能力。 如果怀疑备份操作已停止或完成时间过长,可以使用以下一种或多种方法来估计完成时间或跟踪备份或还原操作的进度:

  • SQL Server错误日志包含有关以前的备份和还原操作的信息。 可以使用这些详细信息来估计备份和还原处于当前状态的数据库所需的时间。 下面是错误日志的示例输出:

    RESTORE DATABASE successfully processed 315 pages in 0.372 seconds (6.604 MB/sec)
    
  • 在 SQL Server 2016 及更高版本中,可以使用 XEvent backup_restore_progress_trace跟踪备份和还原操作的进度。

  • 可以使用 percent_completesys.dm_exec_requests 列跟踪正在进行的备份和还原操作的进度。

  • 可以使用 和 性能监视器计数器来测量备份和Backup/Restore throughput/sec还原吞吐量信息Device throughput Bytes/sec。 有关详细信息,请参阅 SQL Server备份设备对象

  • 使用 estimate_backup_restore 脚本获取备份时间的估计值。

  • 请参阅 它的工作原理:什么是还原/备份操作?。 此博客文章介绍了备份或还原操作的当前阶段。

要检查的事项

  1. 检查是否遇到下表中列出的任何已知问题。 考虑是应实施更改,还是应用相应文章中讨论的修补程序和最佳做法。

    知识库或联机丛书链接 说明和建议的操作
    优化SQL Server中的备份和还原性能 联机丛书主题介绍了可用于提高备份/还原操作性能的各种最佳做法。 例如,可以将特殊权限分配给SE_MANAGE_VOLUME_NAME运行 SQL Server 的 Windows 帐户,以启用数据文件的即时初始化。 这会产生显著的性能提升。
    2920151针对基于 R2 的Windows Server 2012故障转移群集的建议修补程序和更新

    2822241 Windows 8和Windows Server 2012更新汇总:2013 年 4 月
    当前系统汇总可以包括针对系统级别已知问题的修补程序,这些问题可能会降低SQL Server等程序的性能。 安装这些更新有助于防止此类问题。
    2878182 FIX:应用程序中的用户模式进程在运行的服务器上无响应Windows Server 2012

    备份操作是 I/O 密集型操作,可能会受到此 bug 的影响。 应用此修补程序来帮助防止这些问题。
    配置防病毒软件以使用 SQL Server 防病毒软件可能会锁定.bak文件。 这可能会影响备份和还原操作的性能。 按照本文中的指南从病毒扫描中排除备份文件。
    2820470尝试访问 Windows 中不再存在的共享文件夹时出现延迟错误消息 讨论尝试访问 Windows 2012 及更高版本中不再存在的共享文件夹时出现的问题。
    967351 NTFS 卷中碎片严重的文件可能不会超过特定大小 讨论 NTFS 文件系统碎片严重时出现的问题。
    304101备份大型系统卷时备份程序不成功
    2455009修复:如果在 SQL Server 2005 年、SQL Server 2008 年或 SQL Server 2008 R2 的事务日志中存在许多 VLF,则恢复数据库时性能会降低 存在许多虚拟日志文件可能会影响还原数据库所需的时间。 在还原操作的恢复阶段尤其如此。 有关存在许多 VLF 而导致的其他可能问题的信息,请参阅 数据库操作需要很长时间才能完成,或者在事务日志包含大量虚拟日志文件时触发错误
    网络位置的备份或还原操作速度较慢 通过尝试将大小相近的文件从运行SQL Server的服务器复制到网络位置,将问题隔离到网络。 验证性能。
  2. 检查SQL Server错误日志和 Windows 事件日志中的错误消息,了解有关问题原因的更多指针。

  3. 如果使用第三方软件或数据库维护计划执行同步备份,请考虑是否应更改计划,以尽量减少备份写入到的驱动器上的争用。

  4. 请与 Windows 管理员协作,检查硬件的固件更新。

影响不同SQL Server版本之间的数据库还原的问题

SQL Server备份不能还原到SQL Server的早期版本,而不是创建备份的版本。 例如,无法将SQL Server 2019 实例上的备份还原到 SQL Server 2017 实例。 否则,将显示以下错误消息:

错误 3169:数据库在运行版本 %ls 的服务器上备份。 该版本与运行版本 %ls 的此服务器不兼容。 在支持备份的服务器上还原数据库,或使用与此服务器兼容的备份。

使用以下方法将托管在更高版本的 SQL Server 上的数据库复制到早期版本的 SQL Server。

注意

以下过程假定你有两个SQL Server实例,它们SQL_A (更高版本) ,SQL_B (较低版本) 。

  1. 在 SQL_A 和 SQL_B 上下载并安装最新版本的 SQL Server Management Studio (SSMS ) 。
  2. 在SQL_A上,请执行以下步骤:
    1. 右键单击“ <YourDatabase>任务>生成脚本”,然后选择用于编写整个数据库和所有数据库对象的脚本的选项。
    2. “设置脚本选项”屏幕上,选择“高级”,然后在“SQL Server版本的常规>脚本”下选择SQL_B的版本。 此外,选择最适合保存生成的脚本的选项。 然后,继续该向导。
    3. 使用 大容量复制程序实用工具 (bcp) 从不同的表复制数据。
  3. 在SQL_B上,请执行以下步骤:
    1. 使用在 SQL_A 服务器上生成的脚本创建数据库架构。
    2. 在每个表上,禁用任何外键约束和触发器。 如果表具有任何标识列,请启用标识插入。
    3. 使用 bcp 将上一步中导出的数据导入到相应的表中。
    4. 数据导入完成后,启用外键约束和触发器,并禁用步骤 c 中受影响的每个表的标识插入。

此过程通常适用于中小型数据库。 对于较大的数据库,SSMS 和其他工具中可能会出现内存不足问题。 应考虑使用 SQL Server Integration Services (SSIS) 、复制或其他选项来创建从更高版本到早期版本的 SQL Server 的数据库副本。

有关如何为数据库生成脚本的详细信息,请参阅 使用“生成脚本”选项编写数据库脚本

Always On环境中的备份作业问题

如果在Always On环境中遇到影响备份作业或维护计划的问题,请注意以下事项:

  • 默认情况下,自动备份首选项设置为 “首选辅助备份”。 这指定应在辅助副本 (replica) 上进行备份 - 主副本 (replica) 是唯一联机副本 (replica) 除外。 不能使用此设置对数据库执行差异备份。 若要更改此设置,请在当前主副本 (replica) 上使用 SSMS,然后导航到可用性组的“属性”下的“备份首选项”页。
  • 如果使用维护计划或计划的作业来生成数据库的备份,请确保在承载可用性组可用性副本 (replica) 的每个服务器实例上为每个可用性数据库创建作业。

有关Always On环境中的备份的详细信息,请参阅以下主题:

如果收到指示文件问题的错误消息,则这是备份文件损坏的一种症状。 下面是备份集损坏时可能遇到的一些错误示例:

  • 3241:设备 '%ls' 上的媒体系列格式不正确。 SQL Server无法处理此媒体系列。

  • 3242:设备 '%ls' 上的文件不是有效的 Microsoft 磁带格式备份集。

  • 3243:设备 '%ls' 上的媒体系列是使用 Microsoft 磁带格式版本 %d.%d 创建的。 SQL Server支持版本 %d.%d。

注意

可以使用 Restore Header 语句检查备份。

出现这些问题的原因可能是影响底层硬件 (硬盘、网络存储等) 或与病毒或恶意软件相关的问题。 查看 Windows 系统事件日志和硬件日志中报告的错误,并采取适当的措施 (例如升级固件或修复) 的网络问题。

若要防止这些错误,请在运行备份时启用 “备份 CHECKSUM ”选项,以避免备份损坏的数据库。 有关详细信息,请参阅备份和还原期间可能存在的媒体错误 (SQL Server)

还可以在使用备份工具运行备份时启用跟踪标志 3023 以启用校验和。 有关详细信息,请参阅 如果备份实用工具未公开 选项,请参阅如何启用 CHECKSUM 选项

若要解决这些问题,必须找到另一个可用备份文件或创建新的备份集。 Microsoft 不提供任何可帮助从损坏的备份集检索数据的解决方案。

注意

如果备份文件在一台服务器上成功还原,但在另一台服务器上未成功还原,请尝试以其他方式在服务器之间复制该文件。 例如,请尝试 robocopy 而不是常规复制操作。

由于权限问题,备份失败

尝试运行数据库备份操作时,会发生以下错误之一。

  • 方案 1:从 SQL Server Management Studio 运行备份时,备份失败并返回以下错误消息:

    服务器 <名称>的备份失败。 (Microsoft.SqlServer.SmoExtended)
    System.Data.SqlClient.SqlError:无法打开备份设备“<设备名称>”。 操作系统错误 5 (访问被拒绝。) 。 (Microsoft.SqlServer.Smo)

  • 方案 2:计划的备份失败,并生成一条错误消息,该消息记录在失败作业的作业历史记录中,如下所示:

    Executed as user: <Owner of the job>. ....2 for 64-bit  Copyright (C) 2019 Microsoft. All rights reserved.    
    Started:  5:49:14 PM  Progress: 2021-08-16 17:49:15.47    
    Source: {GUID}      Executing query "DECLARE @Guid UNIQUEIDENTIFIER      EXECUTE msdb..sp...".: 100% complete  End Progress  
    Error: 2021-08-16 17:49:15.74     
    Code: 0xC002F210     
    Source: Back Up Database (Full) Execute SQL Task     
    Description: Executing the query "EXECUTE master.dbo.xp_create_subdir N'C:\backups\D..." failed with the following error: "xp_create_subdir() returned error 5, 'Access is denied.'". 
    Possible failure reasons: Problems with the query, "ResultSet" property not set correctly, parameters not set correctly, or connection not established correctly.
    

如果SQL Server服务帐户对要写入备份的文件夹没有读取和写入权限,则可能会出现上述任一情况。 备份语句可以作为作业步骤的一部分运行,也可以从SQL Server Management Studio手动运行。 在任一情况下,它们始终在 SQL Server 服务启动帐户的上下文中运行。 因此,如果服务帐户不具有必要的特权,则会收到前面记下的错误消息。

有关详细信息,请参阅 备份设备

注意

可以通过导航到相应文件夹属性中的“安全性”选项卡,选择“高级”按钮,然后使用“有效访问”选项卡,来检查 SQL Service 帐户对文件夹的当前权限。

使用第三方备份应用程序的备份或还原操作失败

SQL Server提供了虚拟备份设备接口 (VDI) 工具。 此 API 使独立软件供应商能够将SQL Server集成到其产品中,为备份和还原操作提供支持。 这些 API 旨在提供最大的可靠性和性能,并支持各种SQL Server备份和还原功能。 这包括各种快照和热备份功能。

常见故障排除步骤

更多资源

工作原理:可以同时备份多少个数据库?

其他问题

症状/方案 修正操作或其他信息
如果在数据库上启用了更改跟踪并返回类似于以下内容的错误,则备份可能会失败:

“错误:3999,严重性:17,状态:1。

<时间戳> spid <spid> 由于错误 2601,未能将提交表刷新到 dbid 8 中的磁盘。 有关详细信息,请查看错误日志。”


请参阅以下 Microsoft 知识库文章:
还原加密数据库的备份时出现问题 将 TDE 保护的数据库移到另一个SQL Server
在标准版上,尝试从 Enterprise 版本还原 CRM 备份失败 还原Microsoft Dynamics CRM数据库时,2567984“无法在此版本的 SQL Server 中启动数据库”错误

有关SQL Server备份和还原操作的常见问题解答

如何检查备份操作的状态?

使用 estimate_backup_restore 脚本获取备份时间的估计值。

如果SQL Server在备份期间进行故障转移,该怎么办?

按重启 中断的还原操作 (Transact-SQL) 重启还原 或备份操作。

是否可以在较新版本上从较旧的程序版本还原数据库备份,反之亦然?

SQL Server无法使用高于创建备份的版本SQL Server还原备份。 有关详细信息,请参阅 兼容性支持

如何实现验证SQL Server数据库备份?

请参阅 RESTORE 语句 - VERIFYONLY (Transact-SQL) 中所述的过程。

如何在 SQL Server 中获取数据库的备份历史记录?

请参阅如何在 SQL Server 中获取数据库的备份历史记录

是否可以在 64 位服务器上还原 32 位备份,反之亦然?

是。 SQL Server磁盘存储格式在 64 位和 32 位环境中相同。 因此,备份和还原操作适用于 64 位和 32 位环境。

常规疑难解答提示

  • 确保对要写入备份的文件夹的 SQL Server 服务帐户设置读取和写入权限。 有关详细信息,请参阅 备份权限
  • 确保正在写入备份的文件夹有足够的空间来容纳数据库备份。 可以使用 sp_spaceused 存储过程来大致估计特定数据库的备份大小。
  • 始终使用最新版本的 SSMS,以确保不会遇到与作业和维护计划配置相关的任何已知问题。
  • 对作业执行测试运行,以确保成功创建备份。 始终添加逻辑来 验证备份
  • 如果计划将系统数据库从一台服务器移到另一台服务器,请查看 移动系统数据库
  • 如果发现间歇性备份失败,检查SQL Server版本的最新更新中是否遇到了已修复的问题。 有关详细信息,请参阅 SQL Server 版本和更新
  • 若要计划和自动执行 SQL Express 版本的备份,请参阅在 SQL Server Express 中计划和自动备份SQL Server数据库

SQL Server备份和还原操作的参考主题

  • 有关备份和还原操作的详细信息,请参阅联机丛书中的以下主题:

    “备份和还原SQL Server数据库”:本主题介绍SQL Server数据库的备份和还原操作的概念,提供了指向其他主题的链接,并提供了运行各种备份或还原任务的详细过程, (例如验证备份,以及使用 T-SQL 或 SSMS) 进行备份。 这是SQL Server文档中有关此主题的父主题。

  • 下表列出了你可能希望查看与备份和还原操作相关的特定任务的其他主题。

    参考 说明
    BACKUP (Transact-SQL) 提供与备份相关的基本问题的答案。 提供不同类型的备份和还原操作的示例。
    备份设备 (SQL Server) 为了解各种备份设备、备份到网络共享、Azure Blob 存储和相关任务提供了很好的参考。
    恢复模式 (SQL Server) 详细介绍了各种恢复模式:简单、完整和大容量日志。 提供有关恢复模式如何影响备份的信息。
    备份 & 还原:系统数据库 (SQL Server) 涵盖策略,并讨论在处理系统数据库的备份和还原操作时必须注意的内容。
    还原和恢复概述 (SQL Server) 介绍恢复模式如何影响还原操作。 如果对数据库的恢复模式如何影响还原过程有疑问,则应查看此内容。
    使数据库在另一台服务器上可用时管理元数据 移动数据库或遇到影响登录名、加密、复制、权限等的任何问题时,应注意的各种注意事项。
    使用事务日志备份 介绍了如何备份和还原 (在完整恢复模式和大容量日志恢复模型中应用) 事务日志的概念。 说明如何执行事务日志的例行备份 (日志备份) 恢复数据。
    SQL Server托管备份到 Microsoft Azure 介绍托管备份和关联的过程。