“使用共享访问签名将SQL Server数据库备份到Azure Blob时”解码存储密钥时出错“

时间:2017-06-21 14:17:54

标签: sql-server azure azure-storage-blobs database-backups

目标:我正在尝试将我们的本地SSMS数据库备份到我们的Azure云存储。

我有一个blob容器https://zutosqlbackupslive.blob.core.windows.net/dw1/ 这是私人的。

我创建了一个具有完全权限的共享访问签名(允许所有资源类型,允许所有权限),开始日期为昨天,到期日期为明年。

使用密钥1设置为allo HTTPS和HTTP。

使用此SAS,我可以通过将其添加到图像文件的URL末尾来访问blob中的测试图像。所以我的SAS工作。

enter image description here

SQL脚本

CREATE CREDENTIAL [AzureDWBackup]
        WITH IDENTITY = 'Shared Access Signature',
        SECRET = '<<SAS key>>' -- this the key taken from the highlighted section of the screenshot
GO

BACKUP DATABASE Maintenance
TO URL = 'https://zutosqlbackupslive.blob.core.windows.net/dw1/Maintenance_DW1_FullBackup_20062017T1518.bak'
WITH INIT, NOFORMAT, NAME = N'Maintenance_DW1_FullBackup_20062017T1518', STATS = 10
, CREDENTIAL = N'AzureDWBackup'

产生的错误是:

  

Msg 3298,Level 16,State 2,Line 11
  备份/还原到URL设备错误:解码存储密钥时出错。

     

Msg 3013,Level 16,State 1,Line 11
  BACKUP DATABASE异常终止。

任何人都可以从中看出错误,或建议接下来要尝试什么。

2 个答案:

答案 0 :(得分:2)

简单的答案是,如果您使用的是SQL Server 2014或更早版本,则使用访问密钥而不是SAS。

使用SAS(共享访问签名)时遇到相同的错误。我的理解是,使用SAS是首选方法,即使在较旧的SQL Server版本上也可以使用。 SAS在SQL Server 2014上不起作用,我不得不使用访问密钥方法,然后我不再收到此错误消息。

我还修改了脚本,因此当我再次运行该脚本时,如果密钥更改,我可以对其进行更新。 (这对于SAS来说更有意义,因为它们会过期)

IF EXISTS  
(SELECT * FROM sys.credentials   
WHERE [name] = '<mycredentialname>')  
BEGIN
  CREATE CREDENTIAL [<mycredentialname>] WITH IDENTITY = '<mystorageaccountname>'  
,SECRET = '<Access Key>';
END
ELSE
BEGIN
CREATE CREDENTIAL [<mycredentialname>] WITH IDENTITY = '<mystorageaccountname>'  
,SECRET = '<Access Key>';
END

BACKUP DATABASE <database name>
TO URL = 'https://<mystorageaccountname>.blob.core.windows.net/<mycontainername>/<mybackupfilename>'
WITH CREDENTIAL = '<mycredentialname>'   
     ,COMPRESSION  
     ,STATS = 1
     ,CHECKSUM ;
GO 

答案 1 :(得分:0)

此-"CREATE CREDENTIAL [AzureDWBackup]"是创建对共享访问签名类型连接的访问​​时的访问URL。

您使用的是cust0m名称,而不是

CREATE CREDENTIAL [https://zutosqlbackupslive.blob.core.windows.net/dw1]

示例模板:

CREATE CREDENTIAL [https://<storage_account_name>.blob.core.windows.net/<container>] 

   WITH IDENTITY = 'SHARED ACCESS SIGNATURE' 

   , SECRET = '<shared_access_signature_key_with_removed_first_?_symbol>'