Restore

SQL Server 從 Azure 儲存 Blob 容器上的備份文件還原(使用 SAS 令牌)

  • November 30, 2021

我已經在 azure blob 儲存容器中設置了一個 SAS 令牌。它目前是有效的,正如 windows cmd.exe 中的此命令有效的事實所證明的那樣:

azcopy list "https://<mystorageaccountname>.blob.core.windows.net/<mystorageaccountcontainername>/path/to/file.BAK?<SAS token>"

並作為輸出返回:

INFO: ;  Content Length: 7.58 GiB

現在,如果我通過 SSMS 在 SQL Server 中發出以下命令(伺服器在發出 azcopy 命令的同一台機器上本地執行,並且 <>-brackets 中的值與上面相同。請注意,我最後沒有“/”容器名稱和令牌中沒有“?”,遵循 Microsoft 文件的建議):

CREATE CREDENTIAL [https://&lt;mystorageaccountname&gt;.blob.core.windows.net/&lt;mystorageaccountcontainername&gt;] 
 -- this name must match the container path, start with https and must not contain a forward slash at the end
WITH IDENTITY='SHARED ACCESS SIGNATURE' 
 -- this is a mandatory string and should not be changed   
, SECRET = '&lt;SAS token&gt;';
GO

RESTORE HEADERONLY FROM
URL = N'https://&lt;mystorageaccountname&gt;.blob.core.windows.net/&lt;mystorageaccountcontainername&gt;/path/to/file.BAK';

RESTORE 命令後出現錯誤:

Msg 3201, Level 16, State 2, Line 28
Cannot open backup device 'https://&lt;mystorageaccountname&gt;.blob.core.windows.net/&lt;mystorageaccountcontainername&gt;/path/to/file.BAK'. Operating system error 3(The system cannot find the path specified.).
Msg 3013, Level 16, State 1, Line 28
RESTORE HEADERONLY is terminating abnormally.

我檢查並仔細檢查了路徑中沒有錯字,並且標記是相同的。&lt;SAS token&gt;是格式

sv=&lt;date&gt;&st=&lt;datetime&gt;&se=&lt;datetime&gt;&sr=c&sp=rl&sig=&lt;sig_token&gt;

最後一點,如果我在 RESTORE 之前 DROP 憑證,我會收到不同的錯誤消息

Operating system error 86(The specified network password is not correct.).

所以看起來令牌有效……

我會很感激一些關於這裡可能出現問題的建議,或者我如何解決它的行為與 azcopy 實用程序不同的原因。

編輯 1:已對儲存文件路徑的區分大小寫進行了評論。

&lt;mystorageaccountname&gt;並且&lt;mystorageaccountcontainername&gt;在 Microsoft Azure 儲存資源管理器以及 azcopy 和 SQL 命令中都是小寫。

path/to/file.BAK是混合大小寫,在 Microsoft Azure 儲存資源管理器以及 azcopy 和 SQL 命令中也是相同的。

我找到了問題的原因。

要使用 azcopy 列出文件,只需在 SAS 設置中分配讀取權限即可。

但是,為了執行諸如 之類的命令RESTORE HEADERONLY,您需要在 SAS 設置中同時具有讀取寫入權限。

在創建具有讀寫屬性的新 SAS 令牌後,它工作了。

引用自:https://dba.stackexchange.com/questions/303154