排查 SQL Server 托管备份至 Azure 的问题

本主题介绍了用于解决在将 SQL Server 管理备份到 Microsoft Azure 的操作过程中可能出现错误的任务和工具。

概述

SQL Server 托管备份到 Microsoft Azure 具有内置的检查和故障排除功能,因此在许多情况下,内部故障由 SQL Server 托管备份到 Microsoft Azure 过程本身处理。

例如,删除备份文件会导致日志链中断,从而影响可恢复性 - SQL Server 托管备份到 Microsoft Azure 将识别日志链中的中断,并计划立即进行备份。 但是,我们建议监视状态并解决需要手动干预的任何错误。

Microsoft Azure 的 SQL Server 托管备份使用系统存储过程、系统视图和扩展事件来记录事件和错误。 系统视图和存储过程提供有关 SQL Server 托管备份到 Microsoft Azure 的配置信息、备份计划的状态,以及通过扩展事件捕获的错误信息。 SQL Server 管理备份到 Microsoft Azure 使用扩展事件来捕获错误,以用于故障排除。 除了记录事件之外,SQL Server 智能管理员策略还提供一个运行状况状态,电子邮件通知作业使用该状态来提供通知或错误和问题。 有关详细信息,请参阅 监视到 Azure 的 SQL Server 托管备份

SQL Server 托管备份到 Microsoft Azure 使用的日志记录,与当手动备份到 Azure 存储时(SQL Server 备份到 URL)所使用的日志记录相同。 有关备份到 URL 相关问题的详细信息,请参阅 SQL Server 备份到 URL 最佳做法和故障排除中的故障排除部分

常规故障排除步骤

  1. 启用电子邮件通知以开始接收有关错误和警告的电子邮件。

    或者,您还可以定期运行 smart_admin.fn_get_health_status 以检查汇总的错误及其计数。 例如,智能备份尝试备份但遇到凭据无效错误的次数是 number_of_invalid_credential_errorsNumber_of_backup_loopsnumber_of_retention_loops 不是错误;但它们指示备份线程和保留线程扫描数据库列表的次数。 通常,当@begin_time和@end_time未提供时,函数会显示过去 30 分钟的信息,因此我们通常应该看到这两列的非零值。 如果它们为零,则表示系统过载,甚至系统未响应。 有关详细信息,请参阅本主题后面的 “系统问题” 部分。

  2. 查看扩展事件日志,了解有关错误和其他关联事件的更多详细信息。

  3. 使用日志中的信息来解决该问题。 如果系统出现问题或错误,可能需要重启服务或 SQL Server 代理。

错误的常见原因

下面是导致失败的常见原因列表:

  1. 对 SQL 凭据的更改: 如果用于 SQL Server 管理的备份以存储到 Microsoft Azure 的凭据名称被更改或删除,那么 SQL Server 管理的备份将无法成功进行备份。 更改应应用于 SQL Server 备份管理到 Microsoft Azure 的配置设置。

  2. 对存储访问密钥值的更改: 如果 Azure 帐户的存储密钥值已更改,但 SQL 凭据未使用新值更新,则向 Microsoft Azure 的 SQL Server 托管备份在对存储进行身份验证时将失败,并且无法备份配置为使用此帐户的数据库。

  3. 对 Azure 存储帐户的更改: 删除或重命名存储帐户而不对 SQL 凭据做出相应的更改将导致 SQL Server 托管备份Microsoft Azure 失败,不会进行备份。 如果删除存储帐户,请确保使用有效的存储帐户信息重新配置数据库。 如果重命名存储帐户或密钥值已更改,请确保这些更改反映在 SQL Server 托管备份用于Microsoft Azure 的 SQL 凭据中。

  4. 对数据库属性的更改: 对恢复模式的更改或更改名称可能会导致备份失败。

  5. 对恢复模式的更改: 如果数据库的恢复模式从完整或大容量日志记录更改为简单,备份将停止,SQL Server Managed Backup to Microsoft Azure 会跳过这些数据库。 有关详细信息,请参阅 SQL Server 托管备份到 Azure:互操作性和共存

最常见的错误消息和解决方案

  1. 启用或配置 SQL Server 到 Microsoft Azure 的托管备份时出错:

    错误:“无法访问存储 URL。...提供有效的 SQL 凭据...“:你可能会看到此错误和引用 SQL 凭据的其他类似错误。 在这种情况下,请查看你提供的 SQL 凭据的名称,以及存储在 SQL 凭据中的信息-存储帐户名称和存储访问密钥,并确保它们是最新的和有效的。

    错误:“...无法配置数据库。...因为它是系统数据库“:如果尝试为系统数据库启用 SQL Server 托管备份以Microsoft Azure,将看到此错误。 SQL Server 托管备份到 Microsoft Azure 不支持系统数据库的备份。 若要为系统数据库配置备份,请使用其他 SQL Server 备份技术,例如维护计划。

    错误:“ ...提供保留期。...“:如果在首次配置这些值时未为数据库或实例指定保留期,则可能会看到有关保留期的错误。 如果提供一个介于 1 和 30 之间的数字以外的值,则可能还会看到错误。 保留期的允许值为介于 1 和 30 之间的数字。

  2. 电子邮件通知错误:

    错误:“数据库邮件未启用...”- 如果启用电子邮件通知,但未在实例上配置数据库邮件,则会出现此错误。 您必须在实例上配置数据库邮件,以便能够接收关于 SQL Server 托管备份到 Microsoft Azure 的运行状况通知。 有关如何启用数据库邮件的信息,请参阅 “配置数据库邮件”。 还必须启用 SQL Server 代理才能使用数据库邮件进行通知。 有关详细信息,请参阅 “开始之前”。

    下面是可能与电子邮件通知关联的错误号列表:

    • ErrorNumber:45209

    • ErrorNumber:45210

    • ErrorNumber:45211

  3. 连接错误:

    • 与 SQL 连接相关的错误: 当连接到 SQL Server 实例时遇到问题时,会发生这些错误。 扩展事件通过管理通道暴露这些类型的错误。 下面是两个扩展事件,你可能会看到与此类连接问题相关的错误:

      FileRetentionAdminXEvent(事件类型 = SqlError) 有关此错误的详细信息,请查看该事件的error_code、error_message和stack_trace。 error_code是 SqlException 的错误号。

      SmartBackupAdminXevent 具有以下消息/消息前缀:

      “将 SQL Server 托管备份配置为 Azure 默认设置(例如)时出现内部错误。 错误可能是暂时性的。”

      “SQL Server 可能遇到连接问题。 在当前迭代中跳过数据库。

      “查询日志使用情况信息失败。 故障可能是暂时性的。 跳过当前迭代中的数据库。”

      “加载 SSMBackup2WA 代理元数据时遇到的 SQL 异常。 故障可能是暂时性的。 操作将被重试。

      “SSMBackup2WA 在 ... 时遇到 SQL 异常..."

    • 连接到存储帐户时出错:

      FileRetentionAdminXEvent 中报告存储异常,event_type = XstoreError。 有关错误的详细信息,请查看事件的错误信息(error_message)和堆栈跟踪(stack_trace)。

      由于 SQL Server 托管备份使用基础备份到 URL 技术,因此与存储连接相关的错误适用于这两种功能。 有关故障排除步骤的详细信息,请参阅 SQL Server 备份到 URL 最佳做法和故障排除文章的故障排除部分

排查系统问题

当系统(SQL Server、SQL Server 代理)出现问题时以及其对 SQL Server 托管备份到 Microsoft Azure 的影响,会出现以下几种情况:

  • 当 SQL Server 托管备份到 Microsoft Azure 运行时,Sqlservr.exe 停止响应或停止工作: 如果 SQL Server 停止工作,SQL 代理将正常关闭,SQL Server 托管备份到 Microsoft Azure 也会停止,并且事件记录在 SQL Agent.out 文件中。

    如果 SQL Server 停止响应,则事件将记录在管理通道中。 事件日志示例:

    Sql 错误(引擎未响应或获取 SQLException:SQLException:
    错误代码、消息和堆栈跟踪将显示在管理通道 xevent 中,以及一些额外的信息,例如:
    “SQL Server 可能遇到连接问题。 跳过当前迭代中的数据库”

  • 当 SQL Server 托管备份到 Microsoft Azure 运行时,SQL 代理停止响应或停止工作:

    如果 SQL 代理停止工作,则 SQL Server 托管备份到 Microsoft Azure 也会停止,并在管理通道中记录事件。 这类似于 SQL Server 停止响应的情况。

    如果 SQL 代理停止响应,则 SQL Server 托管备份到 Microsoft Azure 将无法继续执行备份作,并且事件会记录在管理通道中。 事件日志示例:

    作业挂起:请参阅管理员频道 xevents
    “进度更新尚未从 SQL Server 接收的时间超过”+ Constants.DBBackupInfoMsgMaxWaitTime + “数据库备份的小时数。 SSM 云备份将继续等待。

如果已启用电子邮件通知,将收到一条通知,其中包括 备份循环数保留循环数。 如果这两列的一列或两列的通知中返回的值为零,则可能表示系统未响应。

警告

为报告生成结果的内部进程假定引擎诊断日志位于 SQL 代理错误日志所在的同一位置,该日志默认与 SQL Server 实例的错误日志位于同一文件夹中。 如果引擎诊断日志移动到 SQL 代理错误日志位置以外的位置,则系统找不到智能备份诊断日志,因此电子邮件通知中的报告可能不正确。 例如,你可能会在报告的所有字段中看到值 0 ,包括备份循环数和保留循环数。 在这种情况下,如果诊断日志移动到其他位置,这可能并不意味着系统未响应,但系统无法找到日志。 确保诊断日志和 SQL 代理错误日志的位置首先位于同一位置。 若要验证诊断日志的当前位置,可以使用 sys.dm_os_server_diagnostics_log_configurations。 该 path 列返回引擎诊断日志的当前位置。 它应与 SQL 代理错误日志位于同一文件夹中。 可以使用dbo.sp_get_sqlagent_properties存储过程获取SQL代理错误日志路径。

检查扩展事件日志以查看错误的详细信息。 修复错误,或重启 SQL Server 代理以更正这种情况。