gpt4 book ai didi

sql-server - 使用 AD DS 切换到 Azure 存储 Gen2 后,SSMS 备份和还原 SQL 数据库到 Blob 停止工作

转载 作者:行者123 更新时间:2023-12-02 06:39:40 29 4
gpt4 key购买 nike

几个月前,我们的团队关注了这个 Microsoft Tutorial将数据库备份和恢复到 Blob 存储容器,使我们能够将大型数据库附加到 SQL Server 实例,但由 Blob 而不是昂贵的磁盘支持。

RESTORE DATABASE SomeDatabase
FROM URL = 'https://azeusanblbstranonimized.blob.core.windows.net/sql-storage/SomeDatabase.bak'
WITH
MOVE 'some_database_data' TO 'https://azeusanblbstranonimized.blob.core.windows.net/sql-storage/SomeDatabase.mdf',
MOVE 'some_database_log' TO 'https://azeusanblbstranonimized.blob.core.windows.net/sql-storage/SomeDatabase.ldf'
, REPLACE

我们取得了成功,并通过这种方式连接了大约 20 个数据库。就在上周,我们配置了一个启用了“分层命名空间”的新 Azure 存储 Gen2 帐户,复制了所有旧存储帐户配置和数据,并将所有内容都切换到了该帐户。唯一被破坏的是这个脚本。现在,当它运行时,我们收到以下错误(为了便于阅读而格式化):

Operation on target Move Database to Blob failed: Execution fail against sql server. Sql error number: 3634. Error Message:

The operating system returned the error '13(The data is invalid.)' while attempting 'RestoreContainer::ValidateTargetForCreation' on 'https://azeusanblbstranonimized.blob.core.windows.net/sql-storage/SomeDatabase.mdf'. File 'some_database_data' cannot be restored to 'https://azeusanblbstranonimized.blob.core.windows.net/sql-storage/SomeDatabase.mdf'. Use WITH MOVE to identify a valid location for the file.

The operating system returned the error '13(The data is invalid.)' while attempting 'RestoreContainer::ValidateTargetForCreation' on 'https://azeusanblbstranonimized.blob.core.windows.net/sql-storage/SomeDatabase.ldf'. File 'some_database_log' cannot be restored to 'https://azeusanblbstranonimized.blob.core.windows.net/sql-storage/SomeDatabase.ldf'. Use WITH MOVE to identify a valid location for the file.

在规划 RESTORE 语句时发现了问题。之前的消息提供了详细信息。 RESTORE DATABASE 异常终止。已处理数据库“SomeDatabase”、文件 1 上的文件“some_database”的 816 页。已处理数据库“SomeDatabase”、文件 1 上的文件“some_database_log”的 2 页。BACKUP DATABASE 在 0.431 秒内成功处理了 818 页(14.827 MB/秒)。不合格的交易正在回滚。预计回滚完成:0%。不合格的交易正在回滚。预计回滚完成:100%。无法将数据库“SomeDatabase”中的文件“2”缩小到 1280 页,因为它仅包含 352 页。 DBCC 执行完成。如果 DBCC 打印错误消息,请联系您的系统管理员。

我的猜测是引用的错误 13(The data is invalid.)有点转移注意力。作为健全性检查,我们尝试将备份(仍在 blob 上)恢复到 SQL 服务器的本地磁盘,效果很好(RESTORE VERIFYONLY FROM URL = 'https://azeusanblbstranonimized.blob.core.windows.net/sql-storage/SomeDatabase.bak' 也是如此) - 所以 .bak 没有任何问题。文件本身,并且从 blob 中读取它没有问题,只是 SSMS 将 .mdf 突然出现问题。/.ldf在 Blob 上。

我希望利用此功能的其他人能够意识到 Gen2 blob 存储的一些细微差别,可能需要调整脚本才能继续工作。

一些可能很重要的细节:

  • 我们的 SSMS/SQL Server 在 Azure 虚拟机上运行
  • 我们在这两种情况下都使用 SAS token - 并授予所有相同的访问权限。
  • 这两个存储帐户都没有配置任何类型的虚拟网络设置防火墙。正在使用 Microsoft 网络路由。
  • 在两个存储帐户上:禁止 Blob 公共(public)访问、启用需要安全传输、启用允许共享 key 访问、禁用 NFS v3。
  • 据我所知,两个存储帐户的配置相同,但新帐户在创建时启用了“Azure Active Directory 域服务 (Azure AD DS) amd 分层命名空间”。也就是说,我们还没有实际上尚未使用此功能,并且仍在使用 SAS token 进行访问。
<小时/>

值得注意的是,我什至无法遵循在 Blob 存储上创建新数据库的最基本教程。当目标 Blob 服务器是 Azure Data Lake Gen2 存储容器时,会发生相同的错误:

CREATE DATABASE testdb   
ON ( NAME = testdb_dat, FILENAME = 'https://azeusanblbstranonimized.blob.core.windows.net/sql-storagee/TestData.mdf' )
LOG ON ( NAME = testdb_log, FILENAME = 'https://azeusanblbstranonimized.blob.core.windows.net/sql-storage/TestLog.ldf')

Msg 5120, Level 16, State 156, Line 1Unable to open the physical file "https://azeusanblbstranonimized.blob.core.windows.net/sql-storage/TestData.mdf". Operating system error 13: "13(The data is invalid.)".Msg 1802, Level 16, State 4, Line 1CREATE DATABASE failed. Some file names listed could not be created. Check related errors.

最佳答案

得到了付费微软支持对此的回复。

Hello Alain,

We were able to complete the investigation and confirm we cannot use ADLS to store SQL Server datafiles because it uses Block Blob. We only use Page Blobs for storing data on Azure Storage due to requirement for Random writes.

We are working on updating the document to explicitly document the same about the supportability of ADLS Gen2.

Thank you once again for bring this to us and we hope to have this feature in future.

简而言之,Gen2 的 Blob 存储为 known issue它(还?)不支持 PUT PageGET Page Ranges 的 Blob REST API。 SQL 在幕后使用这些 API,因此当指向 Gen2 容器时该功能会中断。

<小时/>

不幸的是,tutorial 上没有披露这一细节。用于将数据库放置在 blob 上。事实上,上面的文章声称页面和 block blob 都可以使用,其中 block blob 是首选 - 但这已被证明是错误的。即使按照步骤使用 block blob,页面 blob API 也会在幕后使用,因此会引发上述错误。

我在 Microsoft 上发现的唯一一个教程提到了在 blob 上存储 SQL 文件的功能:SQL Server data files in Microsoft Azure

在这种情况下,文档中实际上有一个提示,说明事情可能会向南发展:

This new feature uses Page blobs, which are more efficient when ranges of bytes in a file are modified frequently.

关于sql-server - 使用 AD DS 切换到 Azure 存储 Gen2 后,SSMS 备份和还原 SQL 数据库到 Blob 停止工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65813313/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com