CREATE CREDENTIAL [https://testdb.blob.core.windows.net/data]
WITH IDENTITY='SHARED ACCESS SIGNATURE',
SECRET = '<your SAS key>'
CREATE DATABASE testdb
( 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 存储资源的访问权限
以下是在 Azure 存储中存储 SQL Server 数据文件时的安全注意事项和要求。
为 Azure Blob 存储创建容器时,建议将访问权限设置为“私有”。 将访问权限设置为“私有”后,只有 Azure 帐户所有者才可读取容器和 Blob 数据。
在 Azure 存储中存储 SQL Server 数据库文件时,需要使用共享访问签名,它是授予对容器、Blob、队列和表的受限访问权限的 URI。 通过使用共享访问签名,可以让 SQL Server 在不共享 Azure 存储帐户密钥的情况下访问存储帐户中的资源。
此外,建议对数据库继续实施传统的本地安全做法。
安装的先决条件
以下是在 Azure 中存储 SQL Server 数据文件时的安装先决条件。
本地 SQL Server: SQL Server 2016 及更高版本包括此功能。 若要了解如何下载最新版本的 SQL Server,请参阅 SQL Server。
在 Azure 虚拟机中运行的 SQL Server:如果要在 Azure 虚拟机上安装 SQL Server,请安装 SQL Server 2016,或更新现有实例。 同样,也可以使用 SQL Server 2016 平台映像在 Azure 中创建新虚拟机。
由于 SQL Server 工作负载的性能特征,SQL Server 数据文件实现为 Azure Blob 存储中的页 blob。 不支持其他类型的 blob 存储,如块 blob 或 Azure Data Lake Storage。
在此功能的最新版本中,不支持在 Azure 存储中存储 FileStream 数据。 可以在数据库中存储 FileStream 文件,该数据库还包含存储在 Azure 存储中的数据文件,但所有 FileStream 数据文件都必须存储在本地存储中。 由于 FileStream 数据必须驻留在本地存储中,不能使用 Azure 存储在计算机之间移动它,我们建议继续使用传统技术在不同的计算机之间移动与 FileStream 关联的数据。
目前,一次只能有一个 SQL Server 实例可以访问 Azure 存储中的给定数据库文件。 如果 InstanceA 使用活动数据库文件联机,并且 InstanceB 意外启动,并且它还具有指向同一数据文件的数据库,则第二个实例将无法启动数据库并显示错误代码 5120 Unable to open the physical file "%.\*ls". Operating system error %d: "%ls"
。
只有 .mdf、.ldf 和 .ndf 文件才可以通过使用 Azure 功能中的 SQL Server 数据文件存储在 Azure 存储中。
使用“Azure 中的 SQL Server 数据文件”功能时,存储帐户不支持异地复制。 如果对存储帐户进行地理复制并发生地理故障转移,则可能出现数据库损坏。
有关容量限制,请参阅 Blob 存储简介。
无法使用“Azure 存储中的 SQL Server 数据文件”功能在 blob 存储中存储内存中 OLTP 数据。 这是因为内存 OLTP 依赖于 FileStream ,并且,在此功能的最新版本中,不支持在 Azure 存储中存储 FileStream 数据。
使用 Azure 中的SQL Server数据文件功能时,SQL Server使用数据库中master
设置的排序规则执行所有 URL 或文件路径比较。
只要不向主要副本上的数据库中添加新的数据库文件,就支持 AlwaysOn 可用性组。 如果某个数据库操作需要在主要副本上的数据库中新建文件,那么首先要禁用次要节点中的可用性组。 然后,对数据库执行此数据库操作,并备份主要副本中的数据库。 接下来,将数据库还原到次要副本。 完成后,重新启用次要节点中的 Alwys On 可用性组。
使用“Azure 中的 SQL Server 数据文件”功能时,不支持 Always On 故障转移群集实例。
在正常操作期间,SQL Server 使用临时租约来保留用于存储的 blob,并且每 45 到 60 秒续租每个 blob。 如果服务器崩溃,并启动另一个配置为使用相同 blob 的 SQL Server 实例,则新实例将等待 60 秒,以待现有 blob 租约过期。 如果要将数据库附加到另一个实例,又无法在 60 秒内等待租约过期,则可显式释放 blob 租约。
本节介绍在 Azure 存储中存储 SQL Server 数据文件时可使用的工具和编程参考库。
PowerShell 支持
通过引用 blob 存储 URL 路径而不是文件路径,可以使用 PowerShell cmdlet 将 SQL Server 数据文件存储在 blob 存储服务中。 使用以下 URL 格式访问 Blob: https://storageaccount.blob.core.windows.net/<container>/<blob>
。
从 SQL Server 2014 起,增加了一个与“Azure 存储中的 SQL Server 数据文件”功能结合使用的新 SQL Server 对象。 这个新的 SQL Server 对象称为 SQL Server, HTTP_STORAGE_OBJECT。系统监视器可使用它在用 Azure 存储运行 SQL Server 时监视活动。
SQL Server Management Studio 支持
使用 SQL Server Management Studio 时,您可通过多个对话框窗口使用此功能。 例如,https://teststorageaccnt.blob.core.windows.net/testcontainer/
表示存储容器的 URL 路径。 可以在多个对话框窗口中看到此 路径 ,例如 “新建数据库”、“ 附加数据库”和 “还原数据库”。 有关详细信息,请参阅教程:对 SQL Server 数据库使用 Azure Blob 存储。
SQL Server 管理对象 (SMO) 支持
使用“Azure 中的 SQL Server 数据文件”功能时,支持所有 SQL Server 管理对象 (SMO)。 如果 SMO 对象需要文件路径,请使用 BLOB URL 格式而不是本地文件路径,如 https://teststorageaccnt.blob.core.windows.net/testcontainer/
。 有关SQL Server管理对象 (SMO) 的详细信息,请参阅 SQL Server Books Online 中的 SQL Server 管理对象 (SMO) 编程指南。
Transact-SQL 支持
此新增功能在 Transact-SQL 外围应用中引入了以下更改:
系统视图中的新 int 列 credential_id
。sys.master_files
列 credential_id
用于将 Azure 存储数据文件交叉引用回 sys.credentials
为其创建的凭据。 你可以使用它来排除故障,例如,当有数据库文件使用凭据时无法删除凭据。
Microsoft Azure 中SQL Server数据文件疑难解答
为避免不受支持的功能或限制造成的错误,首先请查看 Limitations。
下面列出了使用“Azure 存储中的 SQL Server 数据文件”功能时可能遇到的错误。
身份验证错误
无法删除凭据 '%.*ls',因为它由活动数据库文件使用。
解决方法:尝试删除 Azure 存储中活动数据库文件仍在使用的凭据时,可能会看到此错误。 要删除凭据,必须先删除拥有此数据库文件的关联 Blob。 要删除具有活动租约的 blob,必须先释放租约。
未在容器上正确创建共享访问签名。
解决方法:确保已在容器上正确创建了共享访问签名。 查看教程:将Azure Blob 存储与SQL Server数据库配合使用的第 2 课中提供的说明。
尚未正确创建 SQL Server 凭据。
解决方法:确保已对“标识”字段使用了“共享访问签名”,并正确创建了机密。 查看教程:将Azure Blob 存储与SQL Server数据库配合使用的第 3 课中提供的说明。
租赁 Blob 错误:
在使用相同 Blob 文件的 SQL Server 实例崩溃之后,尝试启动另一个 SQL Server 时发生错误。 解决方法:在正常操作期间,SQL Server 使用临时租约来保留用于存储的 blob,并且每 45 到 60 秒续租每个 blob。 如果服务器崩溃,并启动另一个配置为使用相同 blob 的 SQL Server 实例,则新实例将等待 60 秒,以待现有 blob 租约过期。 如果要将数据库附加到另一个实例,又无法在 60 秒内等待租约过期,则可显式释放 blob 租约,以免执行附加操作时发生任何故障。
数据库错误
创建数据库时出错解决方法:查看教程:将 Microsoft Azure Blob 存储 与 SQL Server 数据库配合使用的第 4 课中提供的说明。
运行 Alter 语句时出错 解决方案:确保在数据库联机时执行 Alter Database 语句。 将数据文件复制到 Azure 存储时,始终创建页 Blob 而不是块 Blob。 否则,ALTER Database 将失败。 查看教程:将 Microsoft Azure Blob 存储 与 SQL Server 数据库配合使用的第 7 课中提供的说明。
错误代码 - 5120 无法打开物理文件 “%.*ls”。 操作系统错误 %d:“%ls"”
解决方案:此新功能不支持多个 SQL Server 实例同时访问 Azure 存储中的相同数据库文件。 如果 InstanceA 使用活动数据库文件联机,并且 InstanceB 已启动,并且它还具有指向同一数据文件的数据库,则第二个实例将无法启动数据库并显示错误代码 5120 Unable to open the physical file "%.\*ls". Operating system error %d: "%ls"
。
要解决此问题,首先需要确定是否需要 ServerA 访问 Azure 存储中的数据库文件。 如果不需要,请断开 InstanceA 与 Azure 存储中数据库文件之间的任何连接。 为此,请执行以下步骤:
使用 ALTER Database 语句将 InstanceA 的文件路径设置为本地文件夹。
在 InstanceA 中将数据库设置为脱机状态。
然后,将数据库文件从 Azure 存储复制到 InstanceA 中的本地文件夹。 这样可确保 InstanceA 在本地仍有数据库副本。
将数据库设置为联机状态。
错误代码 833 - I/O 请求完成所用的时间超过 15 秒
此错误表示存储系统无法满足 SQL Server 工作负荷的需求。 要么减少应用程序层的 IO 活动,要么提高存储层的吞吐能力。 若要了解更多信息,请参阅错误 833。 如果性能问题仍然存在,请考虑将文件移到其他存储层,如 Premium 或 UltraSSD。 有关 Azure VM 上的 SQL Server,请参阅优化存储性能。
创建数据库