无法打开备份设备 - SQL 服务器本地备份数据库到 Azure 存储

Cannot open backup device - SQL Server on-premise backup database to Azure storage

我在本地 SQL 服务器实例上有一个数据库 运行。我设置了一个 SQL 代理来每晚备份数据库并存储在 Azure 的一个容器中。但是,我在作业运行后看到以下错误:

Message
Executed as user: NT SERVICE\SQLSERVERAGENT. Cannot open backup device 'https://mystorageaccount.blob.core.windows.net/mystoragecontainer/20200102/MYDATABASE_0.bak'. Operating system error 50(The request is not supported.). [SQLSTATE 42000] (Error 3201)  BACKUP DATABASE is terminating abnormally. [SQLSTATE 42000] (Error 3013)

A​​zure 存储帐户是存储(通用 v1)。

SQL 服务器 13.0.5233.0 微软 SQL 服务器管理工​​作室 14.0.17213.0 Microsoft Analysis Services 客户端工具 14.0.1016.232 Microsoft 数据访问组件 (MDAC) 10.0.14393.0 微软 MSXML 3.0 6.0 微软 Internet Explorer 9.11.14393.0 微软 .NET 框架 4.0.30319.42000 操作系统 6.3.14393

是否有配置 NT SERVICE\SQLSERVERAGENT 以连接到 Azure 存储容器的方法?

这似乎与访问相关 issue.To 能够备份到 Azure Blob 存储,您的备份命令必须具有有权访问 blob 存储的有效凭据。这可以通过两种方式完成:

检查您的凭据,确保您的访问密钥正确,如果您使用的是 SAS,请确保定义了访问策略并且您指向它有权访问的正确容器。有关 URL 备份和脚本示例的更多信息,请参阅:

https://docs.microsoft.com/en-us/sql/relational-databases/backup-restore/sql-server-backup-to-url?view=sql-server-2017

  • 共享访问签名

  • 身份和访问密钥

附加参考:

https://blog.pythian.com/how-to-fix-sql-backup-to-url-failure-operating-system-error-50/

希望对您有所帮助。

所有评论都在一定程度上有效。我终于修复了(松散使用的术语)使用 SAS(共享访问签名)凭据将我的 SQL 服务器数据库备份到 Azure 存储容器。

  1. 删除了 SQL 服务器中的现有凭据(在安全 > 凭据下)
  2. 在 Azure 中,在存储帐户 > 容器下创建了一个访问策略。定义开始和到期时间 dates/times、时区以及读取、写入级别非常重要。
  3. 在 Azure 中,为容器生成一个 SAS 令牌。确保设置适当的开始和到期时间 dates/times 以及时区。不要只依赖 UTC。
  4. 上传一个文件到容器,确保一切正常。
  5. 在 SQL 服务器中,创建凭据。秘密应该是没有前面 ? 的 SAS 令牌,所以只是 "sv=...." .
IF NOT EXISTS  
(SELECT * FROM sys.credentials   
WHERE name = 'https://mystorageaccount.blob.core.windows.net/mycontainer')  
CREATE CREDENTIAL [https://mystorageaccount.blob.core.windows.net/mycontainer] 
   WITH IDENTITY = 'SHARED ACCESS SIGNATURE',  
   SECRET = 'sv=_my_sas_key_without_?'; 
  1. 备份数据库。 URL 和容器必须与凭据匹配 - 在本例中为 https://mystorageaccount.blob.core.windows.net/mycontainer .
BACKUP DATABASE [mydatabase]   
TO URL = 'https://mystorageaccount.blob.core.windows.net/mycontainer/mydatabase_03012020120400.bak' 
WITH FORMAT,  
COMPRESSION,
STATS=5,
BLOCKSIZE=65536,
MAXTRANSFERSIZE=4194304;
GO