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

时间:2020-01-02 17:26:33

标签: sql sql-server azure azure-storage database-administration

我有一个在本地SQL Server实例上运行的数据库。我已经设置了一个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)

Azure存储帐户是“存储”(通用v1)。

SQL Server 13.0.5233.0 Microsoft SQL Server管理Studio 14.0.17213.0 Microsoft Analysis Services客户端工具14.0.1016.232 Microsoft数据访问组件(MDAC)10.0.14393.0 Microsoft MSXML 3.0 6.0 Microsoft Internet Explorer 9.11.14393.0 Microsoft .NET Framework 4.0.30319.42000 操作系统6.3.14393

是否可以配置NT SERVICE \ SQLSERVERAGENT连接到Azure存储容器?

2 个答案:

答案 0 :(得分:0)

这似乎是与访问相关的问题。要备份到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/

希望有帮助。

答案 1 :(得分:0)

所有评论在一定程度上有效。最后,我修复了使用SAS(共享访问签名)凭据将SQL Server数据库备份到Azure存储容器的问题(松散地用语)。

  1. 删除SQL Server中的现有凭据(在“安全性”>“凭据”下)
  2. 在Azure中,在“存储帐户”>“容器”下创建了一个访问策略。定义开始和到期日期/时间以及时区以及读取,写入级别非常重要。
  3. 在Azure中,为容器生成SAS令牌。确保您设置适当的开始和到期日期/时间以及时区。不要仅仅依靠UTC。
  4. 将文件上传到容器以确保一切正常。
  5. 在SQL Server中,创建凭据。机密应该是不带?的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