Azure 中的 SQL Server 数据文件

SQL Server 数据文件在 Azure 中能够获得对存储为 Azure Blob 的 SQL Server 数据库文件的本地支持。 它允许你在运行于本地或 Azure 中虚拟机的 SQL Server 中创建数据库,并在 Azure Blob 存储中为你的数据设置专用存储位置。 这种增强功能特别简化了使用分离和附加操作在机器之间移动数据库的过程。 此外,它还提供数据库备份文件的另一存储选项,允许从 Azure 存储恢复或恢复到 Azure 存储。 因此,它通过为数据虚拟化、数据迁移、安全性和可用性提供多项优势,并在高可用性和弹性扩展方面提供简单的低成本和易于维护的解决方案,从而支持多种混合解决方案。

本主题介绍在 Azure 存储服务中存储 SQL Server 数据文件的核心概念和注意事项。

有关如何使用此新功能的实际实践体验,请参阅 教程:Azure 存储服务中的 SQL Server 数据文件

下图演示了此增强功能,无论服务器位于何处,都可以将 SQL Server 数据库文件存储为 Azure 存储中的 Azure Blob。

SQL Server 与 Azure 存储集成

在 Azure 中使用 SQL Server 数据文件的好处

  • 轻松快速的迁移优势: 此功能通过在本地计算机和本地环境和云环境之间一次移动一个数据库来简化迁移过程,而无需进行任何应用程序更改。 因此,它支持增量迁移,同时维护现有的本地基础结构。 此外,当应用程序需要在本地环境中的多个位置运行时,访问集中式数据存储可以简化应用程序逻辑。 在某些情况下,可能需要在地理位置分散的位置快速设置计算机中心,以便从许多不同的源收集数据。 通过使用这种新的增强功能,可以将许多数据库存储为 Azure Blob,然后运行 Transact-SQL 脚本,在本地计算机或虚拟机上创建数据库,而不是将数据从一个位置移到另一个位置。

  • 成本和无限存储优势: 利用此功能,可以在 Azure 中使用无限的场外存储,同时利用本地计算资源。 使用 Azure 作为存储位置时,可以轻松专注于应用程序逻辑,而无需硬件管理开销。 如果在本地丢失计算节点,则可以设置一个新节点,而无需任何数据移动。

  • 高可用性和灾难恢复优势: 在 Azure 中使用 SQL Server 数据文件功能可以简化高可用性和灾难恢复解决方案。 例如,如果 Azure 中的虚拟机或 SQL Server 实例崩溃,只需重新建立指向 Azure Blob 的链接即可在新计算机中重新创建数据库。

  • 安全优势: 通过此新的增强功能,可以将计算实例与存储实例分开。 您可以拥有一个完全加密的数据库,解密处理只在计算实例中进行,而不会在存储实例中进行。 换句话说,使用此新的增强功能,可以使用透明数据加密(TDE)证书加密公有云中的所有数据,这些证书在物理上与数据分离。 TDE 密钥可以存储在 master 数据库中,该数据库存储在物理上安全的本地计算机中,并在本地备份。 可以使用这些本地密钥来加密驻留在 Azure 存储中的数据。 如果云存储帐户凭据被盗,数据仍保持安全,因为 TDE 证书始终驻留在本地。

概念和要求

Azure 存储概念

使用 Azure 中的 SQL Server 数据文件功能时,需要在 Azure 中创建存储帐户和容器。 然后,需要创建 SQL Server 凭据,其中包括有关容器策略的信息以及访问容器所需的共享访问签名。

在 Azure 中,存储帐户表示用于访问 Blob 的最高级别的命名空间。 只要其总大小低于 500 TB,存储帐户就可以包含无限数量的容器。 有关存储限制的最新信息,请参阅 Azure 订阅和服务限制、配额和约束。 容器用于对一组 Blob 进行分组。 所有 Blob 都必须位于容器中。 帐户可以包含无限数量的容器。 同样,容器也可以存储无限数量的 Blob。 有两种类型的 Blob 可以存储在 Azure 存储中:块 Blob 和页 Blob。 此新功能使用页 Blob,最大容量可达 1TB,当频繁修改文件中的字节范围时,它的效率更高。 可以使用以下 URL 格式访问 Blob: http://storageaccount.blob.core.windows.net/<container>/<blob>

Azure 计费注意事项

估算使用 Azure 服务的成本是决策和规划过程中的一个重要事项。 在 Azure 存储中存储 SQL Server 数据文件时,需要支付与存储和事务相关的成本。 此外,在 Azure 存储功能中实现 SQL Server 数据文件需要隐式续订 Blob 租约,每 45 到 60 秒。 这也会导致每个数据库文件(例如 .mdf 或 .ldf)的事务成本增加。 根据我们的估计,根据目前的定价模型,两个数据库文件(.mdf和 .ldf)续订租约的成本约为每月2美分。 建议使用 Azure 定价 页上的信息来帮助估算与使用 Azure 存储和 Azure 虚拟机相关的每月成本。

SQL Server 概念

使用此新增强功能时,需要执行以下作:

  • 必须在容器上创建策略,并生成共享访问签名(SAS)密钥。

  • 对于数据或日志文件使用的每个容器,必须创建一个名称与容器路径匹配的 SQL Server 凭据。

  • 必须在 SQL Server 凭据存储中存储有关 Azure 存储容器、其关联策略名称和 SAS 密钥的信息。

以下示例假定已创建 Azure 存储容器,并且已创建一个包含读取、写入和列出权限的策略。 在容器上创建策略会生成一个 SAS 密钥,该密钥可以安全地在内存中保持未加密,并且 SQL Server 需要该密钥才能访问容器中的 Blob 文件。 请在以下代码片段中,将'your SAS key'替换为类似于'sr=c&si=<MYPOLICYNAME>&sig=<THESHAREDACCESSSIGNATURE>'的条目。 有关详细信息,请参阅 创建和使用共享访问签名

-- Create a credential  
CREATE CREDENTIAL [https://testdb.blob.core.windows.net/data]  
WITH IDENTITY='SHARED ACCESS SIGNATURE',  
SECRET = 'your SAS key'  
  
-- Create database with data and log files in Azure container.  
CREATE DATABASE testdb   
ON  
( NAME = testdb_dat,  
    FILENAME = 'https://testdb.blob.core.windows.net/data/TestData.mdf' )  
 LOG ON  
( NAME = testdb_log,  
    FILENAME =  'https://testdb.blob.core.windows.net/data/TestLog.ldf')

重要

如果容器中有任何对数据文件的活动引用,则尝试删除相应的 SQL Server 凭据会失败。

安全

以下是在 Azure 存储中存储 SQL Server 数据文件时的安全注意事项和要求。

  • 为 Azure Blob 存储服务创建容器时,建议将访问权限设置为专用。 设置对专用访问权限时,只能由 Azure 帐户所有者读取容器和 Blob 数据。

  • 在 Azure 存储中存储 SQL Server 数据库文件时,需要使用共享访问签名、授予对容器、blob、队列和表的受限访问权限的 URI。 通过使用共享访问签名,可以启用 SQL Server 访问存储帐户中的资源,而无需共享 Azure 存储帐户密钥。

  • 此外,我们建议你继续为数据库实施传统的本地安全做法。

安装先决条件

以下是在 Azuree 中存储 SQL Server 数据文件时的安装先决条件。

  • 本地 SQL Server: SQL Server 2014 版本包含此功能。 若要了解如何下载 SQL Server 2014,请参阅 SQL Server 2014

  • 在 Azure 虚拟机中运行的 SQL Server:如果要在 Azure 虚拟机上安装 SQL Server,请安装 SQL Server 2014 或更新现有实例。 同样,还可以使用 SQL Server 2014 平台映像在 Azure 中创建新的虚拟机。 若要了解如何下载 SQL Server 2014,请参阅 SQL Server 2014

局限性

  • 在此功能的当前版本中,不支持将数据存储在 FileStream Azure 存储中。 可以在 Azure 存储集成的本地数据库中存储 Filestream 数据,但不能使用 Azure 存储在计算机之间移动 Filestream 数据。 对于 FileStream 数据,建议继续使用传统技术在不同计算机之间移动与 Filestream 关联的文件(.mdf,.ldf)。

  • 目前,此新的增强功能不支持多个 SQL Server 实例同时访问 Azure 存储中的同一数据库文件。 如果 ServerA 与活动数据库文件联机且 ServerB 意外启动,并且它还具有指向同一数据文件的数据库,则第二台服务器将无法启动数据库,错误代码为 5120 无法打开物理文件“%.*ls”。作系统错误 %d:“%ls”。

  • 只有 .mdf、.ldf 和 .ndf 文件可以使用 Azure 中的 SQL Server 数据文件功能存储在 Azure 存储中。

  • 在 Azure 功能中使用 SQL Server 数据文件时,不支持对存储帐户进行异地复制。 如果存储帐户是异地复制的,并且发生异地故障转移,可能会发生数据库损坏。

  • 每个 Blob 的大小最大为 1 TB。 这会对可存储在 Azure 存储中的单个数据库数据和日志文件创建上限。

  • 无法使用 Azure 存储中的 SQL Server 数据文件功能将 In-Memory OLTP 数据存储在 Azure Blob 中。 这是因为 In-Memory OLTP 依赖于 FileStream,并且在此功能的当前版本中,不支持将 FileStream 数据存储在 Azure 存储中。

  • 在 Azure 功能中使用 SQL Server 数据文件时,SQL Server 使用数据库中的排序规则集 master 执行所有 URL 或文件路径比较。

  • AlwaysOn Availability Groups 是支持的,只要不向主数据库中添加新的数据库文件。 如果数据库作需要在主数据库中创建新文件,请先在辅助节点中禁用 AlwaysOn 可用性组。 然后,对主数据库执行数据库操作,并在主节点备份数据库。 接下来,将数据库还原到辅助节点,并在辅助节点中启用 AlwaysOn 可用性组。 请注意,使用 Azure 中的 SQL Server 数据文件功能时,不支持 AlwaysOn 故障转移群集实例。

  • 在正常作期间,SQL Server 使用临时租约来为存储保留 Blob,每 45 到 60 秒续订一次 Blob 租约。 如果服务器发生故障,并启用了配置为使用相同 Blob 的另一个 SQL Server 实例,则新实例最多将等待 60 秒,直到 Blob 上的现有租约过期。 如果要将数据库附加到另一个实例,并且无法等待租约在 60 秒内过期,则可以在 Blob 上显式中断租约,以避免附加操作出现任何故障。

工具和编程参考支持

本部分介绍在 Azure 存储中存储 SQL Server 数据文件时可以使用哪些工具和编程参考库。

PowerShell 支持

在 SQL Server 2014 中,可以通过引用 Blob 存储 URL 路径而不是文件路径,使用 PowerShell cmdlet 将 SQL Server 数据文件存储在 Azure Blob 存储服务中。 可以使用以下 URL 格式: http://storageaccount.blob.core.windows.net/<container>/<blob> 访问 Blob。

SQL Server 对象和性能计数器支持

从 SQL Server 2014 开始,添加了一个新的 SQL Server 对象,用于 Azure 存储中的 SQL Server 数据文件功能。 新的 SQL Server 对象称为 SQL Server,HTTP_STORAGE_OBJECT ,系统监视器可以在使用 Azure 存储运行 SQL Server 时监视活动。

SQL Server Management Studio 支持

SQL Server Management Studio 允许通过多个对话框窗口使用此功能。 例如,可以键入存储容器的 URL 路径,例如https://teststorageaccnt.blob.core.windows.net/testcontainer/多个对话框窗口中的路径,例如“新建数据库”、“附加数据库”和“还原数据库”。 有关详细信息,请参阅 教程:Azure 存储服务中的 SQL Server 数据文件

SQL Server 管理对象支持

在 Azure 功能中使用 SQL Server 数据文件时,支持所有 SQL Server 管理对象(SMO)。 如果 SMO 对象需要文件路径,请使用 BLOB URL 格式而不是本地文件路径,例如 https://teststorageaccnt.blob.core.windows.net/testcontainer/。 有关 SQL Server 管理对象(SMO)的详细信息,请参阅 SQL Server 联机丛书中的 SQL Server 管理对象(SMO)编程指南

Transact-SQL 支持

此新功能在 Transact-SQL 表面积上引入了以下更改:

  • 在系统视图sys.master_files中添加了一个名为credential_id的新int列。 credential_id列用于使已启用 Azure 存储的数据文件能够交叉引用回为其创建的凭据的 sys.credentials。 可以使用它进行故障排除,例如,当有数据库文件正在使用该凭据时,无法删除该凭据。

Azure 中 SQL Server 数据文件故障排除

若要避免由于不支持的功能或限制而导致的错误,请先查看“限制”。

使用 Azure 存储中的 SQL Server 数据文件功能时可能会得到的错误列表如下所示。

身份验证错误

  • 无法删除凭据“%.*ls”,因为该凭据由活动数据库文件使用。
    解决方法:尝试删除 Azure 存储中活动数据库文件仍在使用的凭据时,可能会看到此错误。 若要删除凭据,首先必须删除与此数据库文件关联的数据块。 若要删除具有活动租约的 Blob,必须先中断租约。

  • 尚未正确在容器上创建共享访问签名。
    解决方法:请确保已在容器上正确创建了共享访问签名。 查看教程第 2 课中提供的说明 :Azure 存储服务中的 SQL Server 数据文件

  • SQL Server 凭据尚未正确创建。
    解决方法:确保已对 “标识 ”字段使用了“共享访问签名”,并正确创建了机密。 查看教程第 3 课中提供的说明 :Azure 存储服务中的 SQL Server 数据文件

租约 Blob 错误:

  • 另一个实例崩溃后,尝试启动使用相同 blob 文件的 SQL Server 时发生错误。 解决方法:在正常作期间,SQL Server 使用临时租约来保留 Blob 进行存储,每 45 到 60 秒续订一次每个 Blob 租约。 如果服务器宕机,并且启动了配置为使用相同 Blob 的另一个 SQL Server 实例,则新的实例将最多等待 60 秒,以便现有 Blob 的许可协议过期。 如果想将数据库附加到另一个实例,并且无法等待租约在 60 秒内过期,则可以在 Blob 上显式中断租约,以避免附加过程中出现故障。

数据库错误

  1. 创建数据库时出错
    解决方法:查看教程第 4 课中提供的说明 :Azure 存储服务中的 SQL Server 数据文件

  2. 运行 Alter 语句时出错
    解决方法:请确保在数据库处于联机状态时执行 Alter Database 语句。 将数据文件复制到 Azure 存储时,始终创建页 Blob 而不是块 Blob。 否则,ALTER Database 将失败。 查看教程第 7 课中的说明 :Azure 存储服务中的 SQL Server 数据文件

  3. 错误代码 5120 无法打开物理文件“%.*ls”。 操作系统错误 %d:“%ls”
    解决方法:目前,此新增强功能不支持多个 SQL Server 实例同时访问 Azure 存储中的同一数据库文件。 如果 ServerA 已联机并具备活动数据库文件,而 ServerB 无意中启动,并且它也有一个指向同一数据文件的数据库,那么第二台服务器将无法启动数据库,错误代码 5120:无法打开物理文件“%.*ls”。操作系统错误 %d:“%ls”。

    若要解决此问题,请先确定是否需要 ServerA 访问 Azure 存储中的数据库文件。 否则,只需删除 ServerA 与 Azure 存储中的数据库文件之间的任何连接。 为此,请执行以下步骤:

    1. 使用 ALTER Database 语句将服务器 A 的文件路径设置为本地文件夹。

    2. 在服务器 A 中脱机设置数据库。

    3. 然后,将数据库文件从 Azure 存储复制到服务器 A 中的本地文件夹。这可确保 ServerA 仍在本地具有数据库的副本。

    4. 联机设置数据库。

另请参阅

教程:Azure 存储服务中的 SQL Server 数据文件