"Error while decoding the storage key" 使用共享访问签名将 SQL 服务器数据库备份到 Azure Blob 时
"Error while decoding the storage key" when backing up SQL Server database to Azure Blob using Shared Access Signature
Objective:我正在尝试将我们的本地 SSMS 数据库备份到我们的 Azure 云存储。
我有一个 blob 容器 https://zutosqlbackupslive.blob.core.windows.net/dw1/
这是设置为私有的。
我创建了一个具有完全权限(允许所有资源类型,允许所有权限)的共享访问签名,开始日期为昨天,到期日期为明年。
它被设置为允许 HTTPS 和 HTTP,使用密钥 1。
使用此 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
Backup/Restore to URL device error: Error while decoding the storage key.
Msg 3013, Level 16, State 1, Line 11
BACKUP DATABASE is terminating abnormally.
任何人都可以从中看出问题所在,或者建议下一步尝试什么。
根据您的描述,我按照 here 使用 SAS URL 创建了 SQL 凭证。这是我的测试,你可以参考一下:
为 SAS URL 和备份数据库创建 SQL 凭据
--Create a SQL Credential for the SAS URL
CREATE CREDENTIAL [https://{storage-account-name}.blob.core.windows.net/dbbackups] WITH IDENTITY = 'Shared Access Signature'
,SECRET = 'st=2017-04-22T03%3A55%3A00Z&se=2017-07-29T03%3A55%3A00Z&sp=rwdl&sv=2015-12-11&sr=c&sig=Txv%2FWrStGYb6ax1dzb47WbBjO7iNCbwohl02jodhuNw%3D'
--backup the database
BACKUP DATABASE [{your-database-name}]
TO URL = 'https://{storage-account-name}.blob.core.windows.net/dbbackups/brucedb_20160623114800.bak'
注意:您需要从您的 SAS 令牌中删除第一个 ?
。
结果:
此外,要使用 storage account name
和 account access key
创建 SQL 服务器凭据,您可以参考 Lesson 2: Create a SQL Server Credential and Lesson 3: Write a Full Database Backup to the Windows Azure Blob Storage Service.
创建对共享访问签名类型连接的访问时,此 - "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>'
如果您使用 SQL Server 2014 或更早版本,简短的回答是使用访问密钥而不是 SAS。
我在使用 SAS(共享访问签名)时遇到了同样的错误。我的理解是使用 SAS 是首选方法,即使在较旧的 SQL 服务器版本上也可以使用。 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
Objective:我正在尝试将我们的本地 SSMS 数据库备份到我们的 Azure 云存储。
我有一个 blob 容器 https://zutosqlbackupslive.blob.core.windows.net/dw1/ 这是设置为私有的。
我创建了一个具有完全权限(允许所有资源类型,允许所有权限)的共享访问签名,开始日期为昨天,到期日期为明年。
它被设置为允许 HTTPS 和 HTTP,使用密钥 1。
使用此 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
Backup/Restore to URL device error: Error while decoding the storage key.Msg 3013, Level 16, State 1, Line 11
BACKUP DATABASE is terminating abnormally.
任何人都可以从中看出问题所在,或者建议下一步尝试什么。
根据您的描述,我按照 here 使用 SAS URL 创建了 SQL 凭证。这是我的测试,你可以参考一下:
为 SAS URL 和备份数据库创建 SQL 凭据
--Create a SQL Credential for the SAS URL
CREATE CREDENTIAL [https://{storage-account-name}.blob.core.windows.net/dbbackups] WITH IDENTITY = 'Shared Access Signature'
,SECRET = 'st=2017-04-22T03%3A55%3A00Z&se=2017-07-29T03%3A55%3A00Z&sp=rwdl&sv=2015-12-11&sr=c&sig=Txv%2FWrStGYb6ax1dzb47WbBjO7iNCbwohl02jodhuNw%3D'
--backup the database
BACKUP DATABASE [{your-database-name}]
TO URL = 'https://{storage-account-name}.blob.core.windows.net/dbbackups/brucedb_20160623114800.bak'
注意:您需要从您的 SAS 令牌中删除第一个 ?
。
结果:
此外,要使用 storage account name
和 account access key
创建 SQL 服务器凭据,您可以参考 Lesson 2: Create a SQL Server Credential and Lesson 3: Write a Full Database Backup to the Windows Azure Blob Storage Service.
创建对共享访问签名类型连接的访问时,此 - "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>'
如果您使用 SQL Server 2014 或更早版本,简短的回答是使用访问密钥而不是 SAS。
我在使用 SAS(共享访问签名)时遇到了同样的错误。我的理解是使用 SAS 是首选方法,即使在较旧的 SQL 服务器版本上也可以使用。 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