你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

使用托管标识备份和还原到 URL

适用于:Azure VM 上的 SQL Server(仅限 Windows)

本文介绍如何使用 Microsoft Entra 托管标识,从 URL 备份和还原 Azure 虚拟机 (VM) 上的 SQL Server 数据库。

概述

从 SQL Server 2022 累积更新 17 (CU17) 开始,可以使用托管标识和 SQL Server 凭据从 Azure Blob 存储备份和还原 Azure VM 上的 SQL Server 数据库。 托管标识为应用程序提供一个标识,可以在连接到支持 Microsoft Entra 身份验证的资源时使用。

仅 Azure VM 上的 SQL Server 支持在 BACKUP TO URLRESTORE FROM URL T-SQL 操作的凭据中使用托管标识。 不支持在 BACKUP TO URLRESTORE FROM URL 中将托管标识与本地 SQL Server 结合使用。

先决条件

  • 具有 SQL Server 2022 CU17 或更高版本且配置了 Microsoft Entra 身份验证的 Azure VM 上的 SQL Server。
  • Azure Blob 存储帐户
  • 需要对 Azure Blob 存储进行有效的网络访问、在主机上配置 Windows 防火墙权限以允许出站连接,以及配置有效的存储帐户服务终结点。
  • Azure VM 上的 SQL Server 的主要托管标识需要:
    • 分配有用户分配的托管标识或系统分配的托管标识。 有关详细信息,请参阅 在 Azure 虚拟机(VM)配置托管标识。
    • 具有分配给存储帐户的主要托管标识的 Storage Blob Data Contributor 角色。

使用托管标识创建服务器凭证

若要将 T-SQL 命令 BACKUP DATABASE <database name> TO URLRESTORE <database name> FROM URL 与托管标识配合使用,需要创建使用托管标识的服务器凭据。 凭据名称表示 Azure 存储 URL,并指示将存储数据库备份的位置。

以下示例展示如何为托管标识创建凭据:

CREATE CREDENTIAL [https://<storage-account-name>.blob.core.windows.net/<container-name>] 
    WITH IDENTITY = 'Managed Identity'

WITH IDENTITY = 'Managed Identity' 子句需要分配给 Azure VM 上的 SQL Server 的主要托管标识。

有关未分配主托管标识或授予适当权限时可能发生的错误消息的详细信息,请参阅 错误消息 部分。

使用托管标识 BACKUP(备份)到 URL

创建凭据后,可以使用它将数据库备份和还原到 Azure Blob 存储。 确保 Azure VM 上的 SQL Server 的主要托管标识具有分配给存储帐户的 Storage Blob Data Contributor 角色。

以下示例演示如何使用托管标识凭据将数据库备份到 Azure Blob 存储:

BACKUP DATABASE [AdventureWorks] 
    TO URL = 'https://<storage-account-name>.blob.core.windows.net/<container-name>/AdventureWorks.bak' 

使用托管标识从 URL RESTORE(还原)

以下示例演示如何使用托管标识凭据从 Azure Blob 存储还原数据库:

RESTORE DATABASE [AdventureWorks] 
    FROM URL = 'https://<storage-account-name>.blob.core.windows.net/<container-name>/AdventureWorks.bak' 

错误消息

跟踪标志 4675 可用于检查使用托管标识创建的凭据。 如果在未启用跟踪标志 4675 的情况下执行 CREATE CREDENTIAL 语句,如果未为服务器设置主托管标识,则不会发出错误消息。 若要对这种情况进行故障排除,必须在启用跟踪标志后删除并重新创建凭据。

未分配主要托管标识

如果未将主托管标识分配到 Azure VM 上的 SQL Server,则备份和还原操作将失败,并显示一条错误消息,指示未选择托管标识。

Msg 37563, Level 16, State 2, Line 14
The primary managed identity is not selected for this server. Enable the primary managed identity for Microsoft Entra authentication for this server. For more information see (https://aka.ms/sql-server-managed-identity-doc).`

未分配 Storage Blob Data Contributor 角色

如果 Azure VM 上的 SQL Server 的主托管标识未向存储帐户提供 Storage Blob Data Contributor 角色,则 BACKUP 操作将失败,并显示一条错误消息,指示拒绝访问。

Msg 3201, Level 16, State 1, Line 31
Cannot open backup device 'https://<storage-account-name>.blob.core.windows.net/<container-name>/AdventureWorks.bak'. Operating system error 5(Access is denied.).
Msg 3013, Level 16, State 1, Line 31
BACKUP DATABASE is terminating abnormally. 

如果 Azure VM 上的 SQL Server 托管标识未向存储帐户提供 Storage Blob Data Contributor 角色,则 RESTORE 操作将失败,并显示一条错误消息,指示拒绝访问。

Msg 3201, Level 16, State 1, Line 31
Cannot open backup device 'https://<storage-account-name>.blob.core.windows.net/<container-name>/AdventureWorks.bak'. Operating system error 5(Access is denied.).
Msg 3013, Level 16, State 1, Line 31
RESTORE DATABASE is terminating abnormally. 

重复的数据库名称

当存储中存在同名的原始数据库时,将新数据库备份到同一存储路径将失败,并出现以下错误:

Msg 1834, Level 16, State 1, Line 35
RESTORE DATABASE AdventureWorks 
from URL = 'https://<storage-account-name>.blob.core.windows.net/<container-name>/AdventureWorks.bak' 
Msg 1834, Level 16, State 1, Line 35 
The file 'C:\Server\sqlservr\data\AdventureWorks.mdf' cannot be overwritten.  It is being used by the database 'AdventureWorks'. 
Msg 3156, Level 16, State 4, Line 35 
File 'AdventureWorks' cannot be restored to 'C:\Server\sqlservr\data\AdventureWorks.mdf'. Use WITH MOVE to identify a valid location for the file.

若要解决此问题,请在还原数据库之前删除原始数据库或将已使用的文件移动到其他位置。 有关详细信息,请参阅 将数据库还原到新位置(SQL Server)

局限性

  • 服务器级托管标识仅适用于 Azure VM 上的 SQL Server,而不支持本地 SQL Server。 Linux 不支持服务器级托管标识。

  • 只有 Azure VM 上的 SQL Server 才支持具有托管标识的 BACKUP TO URLRESTORE FROM URL。 本地 SQL Server 不支持 BACKUP TO URLRESTORE FROM URL

  • 故障转移群集实例 (FCI) 不支持托管标识。

  • BACKUP TO URL 只能使用用于 Azure VM 上的 SQL Server 的同一托管标识来执行,无论服务器在 VM 上有一个或多个 SQL Server 实例。