目标:我正在尝试将我们的本地SSMS数据库备份到我们的Azure云存储。
我有一个blob容器https://zutosqlbackupslive.blob.core.windows.net/dw1/ 这是私人的。
我创建了一个具有完全权限的共享访问签名(允许所有资源类型,允许所有权限),开始日期为昨天,到期日期为明年。
使用密钥1设置为allo HTTPS和HTTP。
使用此SAS,我可以通过将其添加到图像文件的URL末尾来访问blob中的测试图像。所以我的SAS工作。
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异常终止。
任何人都可以从中看出错误,或建议接下来要尝试什么。
答案 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>'