SQL Server 备份到 Microsoft Azure Blob 存储 URL 的最佳做法和故障排除

适用于:SQL ServerAzure SQL 托管实例

本文包括 SQL Server 备份和还原到 Microsoft Azure Blob 存储的最佳做法和故障排除提示。

有关将 Azure Blob 存储用于 SQL Server 备份或还原操作的详细信息,请参阅:

管理备份

下表列出了管理备份的一般建议:

  • 建议为每个备份使用唯一文件名以防止意外覆盖 blob。

  • 创建容器时,应将访问级别设置为 “私有”,这样只有可以提供所需的身份验证信息的用户或帐户可以在容器中读取或写入 blob。

  • 对于在 Azure 虚拟机中运行的 SQL Server 实例上的 SQL Server 数据库,请使用虚拟机所在区域中的存储帐户,以免产生区域间数据传输成本。 使用同一区域还可以确保备份和还原操作具有最佳性能。

  • 失败的备份活动可能导致无效的备份文件。 我们建议定期标识失败的备份和删除 blob 文件。 有关详细信息,请参阅 删除包含活动租赁的备份 Blob 文件

  • 在备份期间使用 WITH COMPRESSION 选项可以最大程度降低存储成本和存储事务成本。 它也会减少完成备份过程所需的时间。

  • 按照从 SQL Server 备份到 URL 中的建议,设置 MAXTRANSFERSIZEBLOCKSIZE 参数。

  • SQL Server 对于使用的存储冗余类型不可知。 每种存储冗余(LRS/ZRS/GRS/RA-GRS/RA-GZRS 等)都支持备份到页 blob 和块 blob。

处理大型文件

SQL Server 备份操作使用多个线程来优化与 Azure Blob 存储的数据传输。 但是性能取决于各种因素,如 ISV 带宽和数据库的大小。 如果您计划从内部 SQL Server 数据库备份大型数据库或文件组,应先执行某些吞吐量测试。 Azure SLA for Storage 限制了 blob 的最大处理时间,你需要考虑这个限制。

按照管理备份部分的建议使用 WITH COMPRESSION 选项,在备份大型文件时,这一点非常重要。

备份到 URL 或从 URL 还原疑难解答

以下内容提供了在备份到 Azure Blob 存储或从中还原时出现问题的一些快速解决方法。

为了避免因不受支持的选项或限制而导致错误,以及为了查看限制列表和对 BACKUPRESTORE 命令的支持,请参阅使用 Microsoft Azure Blob 存储进行 SQL Server 备份和还原一文。

初始化失败

并行备份到同一 blob 导致一个备份失败,发生 “初始化失败” 错误。

  • 在 SQL Server 2016 (13.x) 及更高版本中,块 blob 是备份到 URL 的首选。

  • 如果使用包含 BACKUP TO URL 的页 blob,则可以使用跟踪标志 3051 打开特定错误日志的日志记录,日志记录格式如下:BackupToUrl-\<instname>-\<dbname>-action-\<PID>.log,其中 \<action> 为以下选项之一:

    • DB
    • FILELISTONLY
    • LABELONLY
    • HEADERONLY
    • VERIFYONLY

还可以通过查看 Windows 事件查看器,在名为 SQLBackupToUrl应用程序日志下查找信息。

由于 I/O 设备错误,无法执行请求。

在备份大型数据库时,请考虑 COMPRESSIONMAXTRANSFERSIZEBLOCKSIZE 和多个 URL 参数。 请参阅 Backing up a VLDB to Azure Blob Storage(将 VLDB 备份到 Azure Blob 存储)。

错误:

Msg 3202, Level 16, State 1, Line 1
Write on "https://mystorage.blob.core.windows.net/mycontainer/TestDbBackupSetNumber2_0.bak" failed:
1117(The request could not be performed because of an I/O device error.)
Msg 3013, Level 16, State 1, Line 1
BACKUP DATABASE is terminating abnormally.

示例解析:

BACKUP DATABASE TestDb
TO URL = 'https://mystorage.blob.core.windows.net/mycontainer/TestDbBackupSetNumber2_0.bak',
URL = 'https://mystorage.blob.core.windows.net/mycontainer/TestDbBackupSetNumber2_1.bak',
URL = 'https://mystorage.blob.core.windows.net/mycontainer/TestDbBackupSetNumber2_2.bak'
WITH COMPRESSION, MAXTRANSFERSIZE = 4194304, BLOCKSIZE = 65536;

设备上的消息文件标记未对齐

从压缩备份中还原时,您可能看到以下错误:

SqlException 3284 occurred. Severity: 16 State: 5
Message Filemark on device 'https://mystorage.blob.core.windows.net/mycontainer/TestDbBackupSetNumber2_0.bak' is not aligned.
Reissue the Restore statement with the same block size used to create the backupset: '65536' looks like a possible value.

要修复此错误,请重新发布指定了 RESTOREBLOCKSIZE = 65536 语句。

失败的备份活动可能导致 blob 产生活动租约

由于 blob 具有活动租约,备份期间出错:Failed backup activity can result in blobs with active leases.

如果重新尝试执行备份语句,备份操作可能失败,出现类似于以下输出的错误:

Backup to URL received an exception from the remote endpoint. Exception Message:
The remote server returned an error: (412) There is currently a lease on the blob and no lease ID was specified in the request.

如果尝试对具有活动租约的备份 blob 文件执行还原语句,则还原操作失败,出现类似于以下的错误:

Exception Message: The remote server returned an error: (409) Conflict..

发生这种错误时,需要删除 blob 文件。 有关此情形和如何更正此问题的详细信息,请参阅删除具有活动租约的备份 Blob 文件

操作系统错误 50:不支持该请求

备份数据库时,可能会由于以下原因而出现错误 Operating system error 50(The request is not supported)

  • 指定的存储帐户不是常规用途 V1/V2。
  • 创建凭据时,SAS 令牌的令牌开头有一个 ? 符号。 如果是,请删除它。
  • 当前连接无法使用存储资源管理器或 SQL Server Management Studio (SSMS) 从当前计算机连接到存储帐户。
  • 分配给 SAS 令牌的策略已过期。 使用 Azure 存储资源管理器创建新策略,并使用该策略创建新的 SAS 令牌,或者更改凭据并再次尝试备份。
  • 受信任的根证书存储中缺少根证书。 有关详细信息,请参阅 Azure 根证书颁发机构

身份验证错误

WITH CREDENTIAL 是一个新选项,在备份到 Azure Blob 存储或从中还原时需要该选项。

与凭据有关的失败可能包括:The credential specified in the **BACKUP** or **RESTORE** command does not exist.

若要避免此问题,如果备份语句中没有指定凭据,可以使用 T-SQL 语句来创建凭据。 以下是您可以使用的一个示例:

IF NOT EXISTS (
   SELECT *
   FROM sys.credentials
   WHERE credential_identity = 'mycredential'
)
CREATE CREDENTIAL [<credential name>]
   WITH IDENTITY = 'mystorageaccount',
      SECRET = '<storage access key>';

凭据存在,但是用于运行备份命令的登录帐户没有访问凭据的权限。 使用 db_backupoperator 角色且拥有“更改任意凭据”权限的帐户。

验证存储帐户名称和密钥值。 在凭据中存储的信息必须与你在备份和还原操作中使用的 Azure 存储帐户的属性值匹配。

400(错误的请求)错误

使用 SQL Server 2012 (11.x),执行类似于如下输出的备份时可能会遇到错误:

Backup to URL received an exception from the remote endpoint. Exception Message:
The remote server returned an error: (400) Bad Request.

这是由 Azure 存储帐户支持的 TLS 版本引起的。 更改支持的 TLS 版本或使用 KB4017023 中列出的解决方法。

代理错误

如果您使用代理服务器访问 Internet,可能会发现以下问题:

代理服务器限制连接

代理服务器可能具有限制每分钟连接次数的设置。 “备份到 URL”进程是一个多线程进程,因此可能超过此限制。 如果出现此情况,代理服务器将终止连接。 若要解决此问题,请更改代理设置,使 SQL Server 不使用该代理。 下面是一些您可能在错误日志中看到的类型或错误消息的示例:

Write on "https://storageaccount.blob.core.windows.net/container/BackupAzurefile.bak" failed: Backup to URL received an exception from the remote endpoint. Exception Message: Unable to read data from the transport connection: The connection was closed.
A nonrecoverable I/O error occurred on file "https://storageaccount.blob.core.windows.net/container/BackupAzurefile.bak:" Error could not be gathered from Remote Endpoint.

Msg 3013, Level 16, State 1, Line 2

BACKUP DATABASE is terminating abnormally.
BackupIoRequest::ReportIoError: write failure on backup device https://storageaccount.blob.core.windows.net/container/BackupAzurefile.bak'. Operating system error Backup to URL received an exception from the remote endpoint. Exception Message: Unable to read data from the transport connection: The connection was closed.

如果使用页 blob,则使用跟踪标志 3051 打开详细日志记录,还可能在日志中看到以下消息:HTTP status code 502, HTTP Status Message Proxy Error (The number of HTTP requests per minute exceeded the configured limit. Contact your ISA Server administrator.)

未选择默认代理设置

有时,未采用默认设置会导致代理身份验证错误,例如:

A nonrecoverable I/O error occurred on file "https://storageaccount.blob.core.windows.net/container/BackupAzurefile.bak:" Backup to URL received an exception from the remote endpoint. Exception Message: The remote server returned an error: (407)* **Proxy Authentication Required.

若要解决此问题,请使用以下步骤创建一个配置文件,以允许“备份到 URL”进程使用默认代理设置:

  1. 使用以下 xml 内容创建一个名为 BackuptoURL.exe.config 的配置文件:

    <?xml version ="1.0"?>
    <configuration>
        <system.net>
            <defaultProxy enabled="true" useDefaultCredentials="true">
                <proxy usesystemdefault="true" />
            </defaultProxy>
        </system.net>
    </configuration>
    
  2. 将该配置文件置于 SQL Server 实例的 Binn 文件夹中。 例如,如果我的 SQL Server 安装在计算机的 C 盘,则可将配置文件置于 C:\Program Files\Microsoft SQL Server\MSSQL13.\<InstanceName>\MSSQL\Binn

  3. BackuptoURL.exe 在使用 SAS 密钥时未调用,但在使用访问密钥时触发。 请确保使用访问密钥,否则会收到以下错误:

    操作系统错误 50 (请求不受支持。)

常见错误和解决方法

问题 解决方案
错误 3063:写入备份块 blob 设备 https://storageaccount/container/name.bak 失败。 设备已达到允许的块限制。 若要解决此问题,请将备份目标条带化为多个文件,并确保在 backup 命令中使用以下参数:COMPRESSION, MAXTRANSFERSIZE = 4194304, BLOCKSIZE = 65536
错误 3035:一个或多个数据库的差异备份失败。 如果你已配置 Azure 备份服务来备份 SQL 数据库或虚拟机 (VM) 快照,而快照不创建仅复制备份,导致维护计划或 SQL 代理作业按需备份失败,则会发生这种情况。 若要解决此问题,请在注册表项 [HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\BCDRAGENT] 中向托管 SQL Server 实例的 VM 添加这些注册表项,然后添加 "USEVSSCOPYBACKUP"="TRUE"
错误 3201:备份失败并出现“操作系统错误 50 (不支持该请求)”。 使用存储资源管理器重新生成共享访问签名 (SAS) 令牌:可使用 Azure 存储资源管理器创建新策略,并从 Azure 存储资源管理器中使用该策略创建新的 SAS 令牌。 使用从 Azure 存储生成的新 SAS 令牌重新创建凭据,并再次尝试备份。 有关详细信息,请参阅备份到 URL 的已知问题。 确保网络安全组 (NSG) 和/或防火墙允许在端口 1433 和 443 上建立入站和出站连接。
错误 3271:由于 TLS,备份失败,并出现错误“备份到 URL 时从远程端点收到异常”。 SQL Server 版本 2012、2014 和 2016 可能会发生这种情况。 到 Microsoft Azure Blob 存储服务 URL 的备份与 TLS 1.2 不兼容,可按照 KB4017023 中的说明解决此问题。
错误 3271:备份到 URL 时从远程终结点收到异常。 异常消息:无法解析远程名称。 如果使用了不正确的凭据、机密或 SAS 密钥配置备份,则会显示此消息。 删除并重新创建凭据。 对于 SQL Server 2012/2014,请使用存储帐户标识和访问密钥,而对于 SQL 2016 及更高版本,请使用 SAS
错误 18210:异常: 远程服务器返回错误: (400)错误的请求。 若要解决此问题,请将存储帐户的最低 TLS 版本更改为 1.0(“存储帐户”>“配置”>“最低 TLS 版本”),或启用强加密,如 KB4017023 中所述
异常消息:远程服务器返回错误: (412) blob 上当前有租约,请求中未指定租约 ID 。 在 Azure 存储资源管理器中找出大小为 1 TB 的 blob,中断租约,删除 blob,然后重试备份操作。
错误:远程服务器返回错误: (403)已禁止。 重新创建存储帐户、凭据和 SAS 令牌以解决该问题。
在 SQL Server 2012/2014 上备份 1 TB 数据库失败。 1 TB 备份是 SQL Server 2016 (13.x) 之前的页 blob 的已知限制。 通过将“WITH COMPRESSION”子句添加到 T-SQL 备份语句,或者将 SQL Server 实例升级到 SQL Server 2016 (13.x) 或更高版本来使用备份压缩。
错误:备份到 URL 时从远程终结点收到异常。 异常消息:远程服务器返回错误: (416)指定的页面范围无效。 如果你使用的是 SQL Server 2012 (11.x) 和 SQL Server 2014 (12.x),并且备份大小增加到了 1 TB,则可能会显示此消息。 条带化备份文件和/或使用备份压缩来解决此问题。
使用维护计划时备份失败。 维护计划存在一些 bug。 尝试使用 T-SQL 执行备份。 如果 T-SQL 有效,则可以创建一个 SQL 代理作业来运行以备份数据库。
由于达到 VM 限制,备份失败。 如果收到“达到磁盘 IOPS/VM 限制”的错误,则备份可能会变慢或失败。 若要监视 IOPS/VM 限制,请使用 Azure Monitor 指标并根据需要调整 VM/磁盘大小,以解决该问题。
远程服务器返回错误:(409) SQL Server 2012/2014 冲突 具有分层命名空间的存储帐户适用于块 blob,而不适用于页 blob。 没有此功能的存储帐户不应用于 SQL Server 2014 (12.x) 中的备份到 URL。