簡體   English   中英

使用共享訪問簽名將 SQL Server 數據庫備份到 Azure Blob 時出現“解碼存儲密鑰時出錯”

[英]“Error while decoding the storage key” when backing up SQL Server database to Azure Blob using Shared Access Signature

目標:我正在嘗試將我們的本地 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 設備錯誤:解碼存儲密鑰時出錯。

消息 3013,級別 16,狀態 1,第 11 行
BACKUP DATABASE 異常終止。

任何人都可以從中看出什么是錯的,或建議下一步嘗試什么。

根據您的描述,我按照此處使用 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 nameaccount access key 創建 SQL Server 憑據,您可以參考第 2 課:創建 SQL Server 憑據第 3 課:將完整數據庫備份寫入 Windows Azure Blob 存儲服務

如果您使用的是 SQL Server 2014 或更早版本,簡短的回答是使用訪問密鑰而不是 SAS。

我在使用 SAS(共享訪問簽名)時遇到了同樣的錯誤。我的理解是使用 SAS 是首選方法,即使在較舊的 SQL Server 版本上也可以使用。 SAS 在 SQL Server 2014 上不起作用,我不得不使用 Access Key 方法,然后我不再收到此錯誤消息。

我還修改了腳本,因此當我再次運行它時,如果密鑰發生變化,我可以更新它。 (這對 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 

在創建對共享訪問簽名類型連接的訪問​​權限時, "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>' 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM