SQL Server 備份至 Microsoft Azure Blob 儲存體 URL 的最佳做法與疑難排解

適用於:SQL ServerAzure SQL 受控執行個體

本文包含從 SQL Server 備份及還原至 Microsoft Azure Blob 儲存體的最佳做法和疑難排解提示。

如需有關使用 Azure Blob 儲存體進行 SQL Server 備份或還原作業的詳細資訊,請參閱:

管理備份

下列清單包含管理備份的一般建議:

  • 建議針對每個備份使用唯一的檔案名稱,避免不小心覆寫 Blob。

  • 建立容器時,您應該將存取層級設定為私人,如此只有能夠提供必要驗證資訊的使用者或帳戶才能讀取或寫入容器中的 Blob。

  • 如果 SQL Server 資料庫位於 Azure 虛擬機器中執行的 SQL Server 執行個體上,請使用與虛擬機器位於相同地區的儲存體帳戶,避免產生不同地區之間的資料傳輸成本。 使用相同的地區也可以確保備份與還原作業達到最佳效能。

  • 失敗的備份活動可能會產生無效的備份檔案。 我們建議您定期識別失敗的備份並刪除 Blob 檔案。 如需詳細資訊,請參閱刪除擁有使用中租用的備份 Blob 檔案

  • 在備份期間使用 WITH COMPRESSION 選項可以將您的儲存體成本和儲存體交易成本降到最低程度。 它也可以減少完成備份程序所需的時間。

  • SQL Server 備份至 URL 中的建議設定 MAXTRANSFERSIZEBLOCKSIZE 引數。

  • SQL Server 與使用的儲存體備援類型無關。 每個儲存體備援 (LRS/ZRS/GRS/RA-GRS/RA-GZRS⋯⋯等) 均支援備份至分頁 Blob 和區塊 Blob。

處理大型檔案

SQL Server 備份作業會使用多個執行緒來最佳化 Azure Blob 儲存體的資料傳輸。 不過,其效能取決於各種因素,例如 ISV 頻寬和資料庫的大小。 如果您計畫要備份內部部署 SQL Server 資料庫中的大型資料庫或檔案群組,您應先進行一些輸送量測試。 Azure 儲存體 SLA 具有最大的 Blob 處理時間,您可以參考使用。

備份大型檔案時,請務必使用管理備份一節中所建議的 WITH COMPRESSION 選項。

疑難排解備份至 URL 或從 URL 還原

以下是對備份至 Azure Blob 儲存體或從中還原時發生的錯誤,進行疑難排解的一些快速方法。

若要避免由於不支援的選項或限制而發生的錯誤,請檢閱使用 Azure Blob 儲存體進行 SQL Server 備份與還原文章中的限制清單,以及支援 BACKUPRESTORE 命令的資訊。

初始化失敗

相同 Blob 的平行備份會導致其中一個備份失敗並出現 [初始化失敗] 錯誤。

  • 在 SQL Server 2016 (13.x) 和更新版本中,建議使用區塊 Blob 備份至 URL。

  • 如果您使用具有 BACKUP TO URL 的分頁 Blob,則可使用追蹤旗標 3051 開啟特定錯誤記錄檔的記錄功能,格式如下:BackupToUrl-\<instname>-\<dbname>-action-\<PID>.log,而 \<action> 是下列其中一項:

    • DB
    • FILELISTONLY
    • LABELONLY
    • HEADERONLY
    • VERIFYONLY

您也可以透過檢閱 Windows 事件檢視器 (在名為 SQLBackupToUrl應用程式記錄底下),尋找相關資訊。

因為 I/O 裝置錯誤,所以無法執行要求。

備份大型資料庫時,請考慮 COMPRESSIONMAXTRANSFERSIZEBLOCKSIZE 與多個 URL 引數。 請參閱將 VLDB 備份至 Azure Blob 儲存體

錯誤:

Msg 3202, Level 16, State 1, Line 1
Write on "https://mystorage.blob.core.windows.net/mycontainer/TestDbBackupSetNumber2_0.bak" failed:
1117(The request could not be performed because of an I/O device error.)
Msg 3013, Level 16, State 1, Line 1
BACKUP DATABASE is terminating abnormally.

範例解決方案:

BACKUP DATABASE TestDb
TO URL = 'https://mystorage.blob.core.windows.net/mycontainer/TestDbBackupSetNumber2_0.bak',
URL = 'https://mystorage.blob.core.windows.net/mycontainer/TestDbBackupSetNumber2_1.bak',
URL = 'https://mystorage.blob.core.windows.net/mycontainer/TestDbBackupSetNumber2_2.bak'
WITH COMPRESSION, MAXTRANSFERSIZE = 4194304, BLOCKSIZE = 65536;

尚未調準裝置上的訊息檔案標記。

從壓縮備份還原時,您可能會看見下列錯誤:

SqlException 3284 occurred. Severity: 16 State: 5
Message Filemark on device 'https://mystorage.blob.core.windows.net/mycontainer/TestDbBackupSetNumber2_0.bak' is not aligned.
Reissue the Restore statement with the same block size used to create the backupset: '65536' looks like a possible value.

若要解決此錯誤,請重新發出指定 RESTOREBLOCKSIZE = 65536 陳述式。

失敗的備份活動可能會產生含有使用中租用的 Blob

因為 Blob 具有使用中的租用而導致備份期間發生錯誤:Failed backup activity can result in blobs with active leases.

如果重新嘗試執行 Backup 陳述式,備份作業可能會失敗並出現類似下列輸出的錯誤:

Backup to URL received an exception from the remote endpoint. Exception Message:
The remote server returned an error: (412) There is currently a lease on the blob and no lease ID was specified in the request.

如果針對擁有使用中租用的備份 Blob 檔案執行 Restore 陳述式,還原作業會失敗並出現類似以下的錯誤:

Exception Message: The remote server returned an error: (409) Conflict..

發生這類錯誤時,您必須刪除 Blob 檔案。 如需有關此案例以及如何更正這個問題的詳細資訊,請參閱 刪除擁有使用中租用的備份 Blob 檔案

OS 錯誤 50:不支援此要求

備份資料庫時,您可能會因為下列原因而看到錯誤 Operating system error 50(The request is not supported)

  • 指定的儲存體帳戶不是一般用途 V1/V2。
  • 建立認證時,SAS 權杖的權杖開頭具有 ? 符號。 如果是,則將其移除。
  • 目前的連線無法使用儲存體總管或 SQL Server Management Studio (SSMS),從目前的機器連線到儲存體帳戶。
  • 指派給 SAS 權杖的原則已過期。 請使用 Azure 儲存體總管建立新原則,並使用該原則建立新的 SAS 權杖,或改變認證,然後再次嘗試備份。
  • 受信任的根憑證存放區中遺漏根憑證。 如需詳細資訊,請參閱 Azure 根憑證授權單位

驗證錯誤

WITH CREDENTIAL 是新的選項,而且在備份至 Azure Blob 儲存體或從中還原時是必要的。

與認證有關的失敗可能為:The credential specified in the **BACKUP** or **RESTORE** command does not exist.

若要避免此問題,您可以在 backup 陳述式中加入 T-SQL 陳述式來建立認證 (如果認證不存在的話)。 以下是您可以使用的範例:

IF NOT EXISTS (
   SELECT *
   FROM sys.credentials
   WHERE credential_identity = 'mycredential'
)
CREATE CREDENTIAL [<credential name>]
   WITH IDENTITY = 'mystorageaccount',
      SECRET = '<storage access key>';

認證存在,但是用來執行 backup 命令的登入沒有存取認證的權限。 請使用具備更改任何認證權限的 db_backupoperator 角色中的帳戶。

確認儲存體帳戶名稱與金鑰值。 儲存在認證中的資訊必須符合您在備份與還原作業中使用之 Azure 儲存體帳戶的屬性值。

400 (不正確的要求) 錯誤

使用 SQL Server 2012 (11.x) 時,您可能會在執行類似下列輸出的備份時遇到錯誤:

Backup to URL received an exception from the remote endpoint. Exception Message:
The remote server returned an error: (400) Bad Request.

這是由 Azure 儲存體帳戶支援的 TLS 版本所造成。 變更支援的 TLS 版本,或使用 KB4017023 中列出的因應措施。

Proxy 錯誤

如果您使用 Proxy 伺服器存取網際網路,可能會看見下列問題:

Proxy 伺服器進行連線節流

Proxy 伺服器可能有限制每分鐘連線數目的設定。 備份至 URL 處理序是一個多執行緒處理序,因此可能會超出此限制。 如果發生這種情況,Proxy 伺服器會清除該連接。 若要解決這個問題,請變更 Proxy 設定,讓 SQL Server 不使用 Proxy。 以下是您可能在錯誤記錄檔中看到的類型或錯誤訊息的部分範例:

Write on "https://storageaccount.blob.core.windows.net/container/BackupAzurefile.bak" failed: Backup to URL received an exception from the remote endpoint. Exception Message: Unable to read data from the transport connection: The connection was closed.
A nonrecoverable I/O error occurred on file "https://storageaccount.blob.core.windows.net/container/BackupAzurefile.bak:" Error could not be gathered from Remote Endpoint.

Msg 3013, Level 16, State 1, Line 2

BACKUP DATABASE is terminating abnormally.
BackupIoRequest::ReportIoError: write failure on backup device https://storageaccount.blob.core.windows.net/container/BackupAzurefile.bak'. Operating system error Backup to URL received an exception from the remote endpoint. Exception Message: Unable to read data from the transport connection: The connection was closed.

如果使用分頁 Blob,則使用追蹤旗標 3051 開啟詳細資訊記錄,可能也會在記錄檔中看到下列資訊:HTTP status code 502, HTTP Status Message Proxy Error (The number of HTTP requests per minute exceeded the configured limit. Contact your ISA Server administrator.)

預設 Proxy 設定未收取

有時預設設定未收取會導致 Proxy 驗證錯誤,例如:

A nonrecoverable I/O error occurred on file "https://storageaccount.blob.core.windows.net/container/BackupAzurefile.bak:" Backup to URL received an exception from the remote endpoint. Exception Message: The remote server returned an error: (407)* **Proxy Authentication Required.

若要解決這個問題,使用下列步驟建立組態檔,讓備份至 URL 處理序可以使用預設 Proxy 設定:

  1. 建立具有下列 XML 內容的設定檔,名稱為 BackuptoURL.exe.config

    <?xml version ="1.0"?>
    <configuration>
        <system.net>
            <defaultProxy enabled="true" useDefaultCredentials="true">
                <proxy usesystemdefault="true" />
            </defaultProxy>
        </system.net>
    </configuration>
    
  2. 將組態檔放在 SQL Server 執行個體的 Binn 資料夾。 例如,如果 SQL Server 安裝在電腦的 C 磁碟機上,請將組態檔放置在 C:\Program Files\Microsoft SQL Server\MSSQL13.\<InstanceName>\MSSQL\Binn

  3. 使用 SAS 金鑰時不會呼叫 BackuptoURL.exe,但在使用存取金鑰時則會觸發。 請確定您使用存取金鑰,否則您會收到下列錯誤:

    作業系統錯誤 50 (不支援要求。)

常見錯誤和解決方案

問題 解決方法
錯誤 3063: 寫入備份區塊 Blob 裝置 https://storageaccount/container/name.bak 失敗。 裝置已達到其允許的區塊限制。 若要修正此問題,請使用多個檔案來分割您的備份目標,並務必在備份命令中使用下列參數:COMPRESSION, MAXTRANSFERSIZE = 4194304, BLOCKSIZE = 65536
錯誤 3035: 一或多個資料庫的差異備份失敗。 如果您已設定 Azure 備份服務以備份 SQL 資料庫或虛擬機器 (VM) 快照集,這不會建立僅複本備份,因而導致您的維護計畫或 SQL 代理程式工作隨選備份失敗。 若要修正此問題,請在裝載 SQL Server 執行個體的 VM 上於 [HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\BCDRAGENT] 登錄機碼處新增這些登錄機碼,然後新增 "USEVSSCOPYBACKUP"="TRUE"
錯誤 3201: 備份失敗,並出現:作業系統錯誤 50 (不支援此要求)。 使用儲存體總管重新產生共用存取簽章 (SAS) 權杖:您可以使用 Azure 儲存體總管建立新的原則,並使用該原則從 Azure 儲存體總管建立新的 SAS 權杖。 使用從 Azure 儲存體產生的這個新 SAS 權杖重新建立認證,然後再次嘗試備份。 如需詳細資訊,請參閱備份至 URL 的已知問題。 請確定網路安全性群組 (NSG) 和/或防火牆允許對連接埠 1433 和 443 的輸入和輸出連線。
錯誤 3271: 備份因 TLS 而失敗,並出現錯誤:備份至 URL 時收到來自遠端端點的例外狀況。 這種情況可能會在 SQL Server 版本 2012、2014 和 2016 中發生。 備份至 Microsoft Azure Blob 儲存體服務 URL 與 TLS 1.2 不相容,您可以依照 KB4017023 中的指示來予以修正。
錯誤 3271: 備份至 URL 收到來自遠端端點的例外狀況。 例外狀況訊息:無法解析遠端名稱。 如果使用不正確的認證、祕密或 SAS 金鑰來設定備份,則您將會看到此訊息。 卸除認證,並重新建立認證。 若為 SQL Server 2012/2014,請使用儲存體帳戶身分識別與存取金鑰;若為 SQL Server 2016 和更新版本,請使用 SAS
錯誤 18210: 例外狀況:遠端伺服器傳回錯誤:(400) 錯誤要求。 若要解決,請將儲存體帳戶上的最小 TLS 版本變更為 1.0 (儲存體帳戶>組態>最小 TLS 版本),或者啟用 KB4017023 中所述的強式加密
例外狀況訊息: 遠端伺服器傳回錯誤:(412) Blob 目前存在租用,而且要求中未指定任何租用識別碼。 在 Azure 儲存體總管中識別大小為 1 TB 的 Blob,並中斷租用、刪除 Blob,然後重試備份作業。
錯誤: 遠端伺服器傳回錯誤:(403) 已禁止。 重新建立儲存體帳戶、認證和 SAS 權杖來解決問題。
SQL Server 2012/2014 上的 1 TB 資料庫備份失敗。 1 TB 備份是 SQL Server 2016 (13.x) 之前分頁 Blob 的已知限制。 將 'WITH COMPRESSION' 子句新增至 T-SQL 備份陳述句,或將 SQL Server 執行個體升級至 SQL Server 2016 (13.x) 和更新版本,以使用備份壓縮。
錯誤: 備份至 URL 收到來自遠端端點的例外狀況。 例外狀況訊息:遠端伺服器傳回錯誤:(416) 指定的頁面範圍無效。 如果您位於 SQL Server 2012 (11.x) 和 SQL Server 2014 (12.x),且備份大小會增加到 1 TB,您可能會看到此訊息。 等量分割您的備份檔案及/或使用備份壓縮來解析。
使用維護計畫時備份失敗。 維護計畫有些錯誤。 請嘗試使用 T-SQL 來執行備份。 如果 T-SQL 能夠運作,您可以建立 SQL Agent 工作來執行以備份資料庫。
備份因達到 VM 限制而失敗。 如果您收到達到磁碟 IOPS/VM 限制的錯誤,則備份可能會變慢或失敗。 若要監視 IOPS/VM 限制,請使用 Azure 監視器計量並調整 VM/磁碟大小 (如有需要) 來修正問題。
遠端伺服器傳回錯誤:(409) SQL Server 2012/2014 的 衝突" 具有階層命名空間的儲存體帳戶均可用於區塊 Blob,而非分頁 Blob。 沒有此功能的儲存體帳戶不應該用於 SQL Server 2014 (12.x) 中的 BACKUP TO URL。