MSSQL 如何從 Azure Blob Storage 還原資料庫:避開 SSMS Azure 登入與 MFA 問題

將 SQL Server 備份存放在 Azure Blob Storage,確實可以減少本機備份空間的壓力,也能利用雲端儲存容易擴充的特性,將正式資料與備份資料適度分離。對於已經將 SQL Server 部署在 Azure VM 的環境來說,搭配 Automated Backup,也能降低日常維護備份排程的負擔。

既然備份檔已經放在 Azure Blob Storage,那麼直接透過 SQL Server Management Studio(SSMS) 的 Restore Database 功能,選擇 Azure 上的備份檔進行還原即可。

但當你真正需要把備份拿來還原時,可能會遇到 SSMS 要求先登入 Azure 訂閱。

但問題也往往出現在這裡,這時就會進入 Microsoft Entra ID 的互動式驗證流程,過程中可能涉及 MFA、Microsoft Authenticator 甚至密碼強制變更等驗證機制。

真正麻煩的是 Azure 登入

在實際操作過程中,我遇過登入頁面突然要求變更密碼,也遇過 Microsoft Authenticator 驗證沒有正常反應的情況。

如果只是偶爾發生,重新登入或處理 MFA 或許就能解決。但真正發生事故必須緊急復原資料時,最不希望遇到的就是備份明明存在,還原作業卻卡在身分驗證上。

不要依賴 SSMS 的 Azure 登入

我們遇到的被要求變更密碼或 Microsoft Authenticator 沒有反應等問題,其實是 SSMS 為了讓使用者瀏覽 Azure 訂閱中的 Storage Account,需要先完成 Azure 帳號的互動式登入與身分驗證,因此才會碰到這些登入與 MFA 相關問題。

目前 SQL Server 在透過 Azure Blob Storage 進行備份與還原時,支援使用 Shared Access Signature 共用存取簽章與 Storage Account Key 儲存體帳戶金鑰,這兩種方式進行身分驗證。

比較好的做法是到該 Storage Account 的容器去簽發 SAS Token,還可以只授予特定 Container、限定 Read/List、設定有效期限,不需要把 Storage Account Key 交給 SQL Server。

Microsoft 也建議 SQL Server 2016+ 使用 SAS 搭配 Block Blob。

我們可以到該儲存體帳戶的容器底下,點選 Settings 的 Shared Access Token。

  • Signing Method:選擇 Account Key
  • Signing Key:選擇任一把 Storage Account Key
  • Stored Access Policy:可以選擇事先定義好的 Access Policy
  • Permissions:手動指派權限,已還原備份來說需要 Read 與 List 權限。
  • Start and Expiry Date/Time:設定 Token 的有效期限
  • Allowed IP Addresses:設定 Token 特定 IP 才能使用
  • Allowed Protocols:HTTPS only

點選 Generate SAS Token and URL,需要將 Blob SAS Token 複製下來。

回到 Restore Database,選擇 Device 與 URL 備份類型,點選 Add。

點選 OK

我們就可以瀏覽容器內的資料庫備份檔案,接下來就按照一般 Restore Database 的步驟執行就可以了。

也可以使用 T-SQL 直接進行還原

先建立 SQL Server Credential

USE master;
GO

CREATE CREDENTIAL [https://your_storage.blob.core.windows.net/backup]
WITH
    IDENTITY = 'SHARED ACCESS SIGNATURE',
    SECRET = 'sv=...&sp=rl&...';
GO

使用 T-SQL 測試是否能讀取 .bak 備份檔的 Header 資訊,不會真的執行還原。

RESTORE HEADERONLY
FROM URL =
'https://mystorage.blob.core.windows.net/sqlbackup/MyDatabase.bak';

在確認備份檔沒問題後,就可以直接從 Azure Blob Storage 執行資料庫還原。

RESTORE DATABASE MyDatabase
FROM URL =
'https://mystorage.blob.core.windows.net/sqlbackup/MyDatabase.bak'
WITH
    MOVE 'MyDatabase'
        TO 'D:\MSSQL\Data\MyDatabase.mdf',
    MOVE 'MyDatabase_log'
        TO 'D:\MSSQL\Log\MyDatabase_log.ldf',
    STATS = 5;

今天的分享就到這邊,感謝收看。

參考文件

https://learn.microsoft.com/zh-tw/sql/relational-databases/backup-restore/sql-server-backup-to-url?view=sql-server-ver17