SQL Server 備份到與 S3 相容物件儲存體的 URL最佳做法與疑難排解

適用於:SQL Server 2022 (16.x)

本文包含從 SQL Server 備份及還原至 S3 相容物件儲存體的最佳做法和疑難排解提示。

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

疑難排解和常見錯誤原因

以下是對備份至 S3 相容物件儲存體服務或從中還原時發生的錯誤,進行疑難排解的一些快速方法。 若要避免因不支援的選項或限制而發生的錯誤,請參閱使用 S3 相容物件儲存體進行 SQL 備份與還原

確定格式正確的 URL

以下是發出 T-SQL 備份查詢時格式正確的虛擬主機 URL 範例,如下所示:

BACKUP DATABASE AdventureWorks2022
TO URL = 's3://<bucketName>.<virtualHost>/<pathToBackup>/<backupFileName>' 

或者,針對 URL 路徑樣式:

BACKUP DATABASE AdventureWorks2022
TO URL = 's3://<domainName>/<bucketName>/<pathToBackup>/<backupFileName>';

在 URL 中檢閱:

  1. URL 的開頭為 s3:// 結構描述。

  2. S3 儲存體虛擬主機 <virtualHost> 或伺服器網域 <domainName> 存在,並使用 HTTPS 執行。 端點將會由安裝在 SQL Server OS 主機上的 CA 進行驗證。

  3. <bucketName> 是此貯體 (備份寫入之處) 的名稱。 這必須先建立,才能執行備份 T-SQL。 備份 T-SQL 不會為客戶建立貯體。 例如,如果使用者未事先建立貯體 'nonExistingBucket',並執行 T-SQL 陳述式,如下所示:

    BACKUP DATABASE AdventureWorks2022
    TO URL = 's3://<your-endpoint>/nonExistingBucket/AdventureWorks2022.bak';
    

    格式不正確的 URL 可能會傳回下列內容:

    Msg 3201, Level 16, State 1, Line 50
    Cannot open backup device 's3://<your-endpoint>/nonExistingBucket/AdventureWorks2022.bak'. Operating system error 50(The request is not supported.).
    Msg 3013, Level 16, State 1, Line 50
    BACKUP DATABASE is terminating abnormally.
    
  4. <pathToBackup> 執行備份 T-SQL 之前不需要存在。 這會自動在儲存體伺服器中建立。 例如,如果使用者事先建立貯體 'existingBucket',而不是路徑 'existingBucket/sqlbackups',則下列項目仍會成功執行:

BACKUP DATABASE AdventureWorks2022
TO URL =  's3://<your-endpoint>/existingBucket/sqlbackups/AdventureWorks2022.bak';

在執行備份/還原之前,請先建立伺服器層級認證

在執行備份/還原 Transact-SQL 查詢至 S3 相容儲存體之前,您必須建立伺服器層級認證。 此認證必須包含客戶在其 S3 相容物件儲存伺服器上設定的存取金鑰和祕密金鑰,才能發出備份/還原查詢。

需要針對 URL 建立的認證範例如下:s3://<your-endpoint>/myS3Bucket/sqlbackups/AdventureWorks2022.bak

CREATE CREDENTIAL [s3://<your-endpoint>/myS3Bucket/sqlbackups/AdventureWorks2022.bak]
WITH IDENTITY = 'S3 Access Key',
SECRET = '<AccessKeyID>:<SecretKeyID>';

在此陳述式 <AccessKeyID> 中,不允許包含 : 字元。 如果在執行備份/還原查詢之前未建立認證,使用者會看到下列錯誤訊息:

Msg 3201, Level 16, State 1, Line 50
Cannot open backup device 's3://<your-endpoint>/myS3Bucket/sqlbackups/AdventureWorks2022.bak'. Operating system error 50(The request is not supported.).
Msg 3013, Level 16, State 1, Line 50
BACKUP DATABASE is terminating abnormally.

不需要認證名稱,即可符合確切的 URL 路徑。 以下是認證查閱如何運作的範例。 如果需要查詢路徑 s3://10.193.16.183:9000/myS3Bucket/sqlbackups/AdventureWorks2022.bak,會嘗試下列認證名稱:

  1. s3://10.193.16.183:8787/myS3Bucket/sqlbackups/AdventureWorks2022.bak
  2. s3://10.193.16.183:8787/myS3Bucket/sqlbackups
  3. s3://10.193.16.183:8787/myS3Bucket

如果有多個認證比對搜尋,例如更特定的 s3://10.193.16.183:8787/myS3Bucket/sqlbackups 和更一般的 s3://10.193.16.183:8787/myS3Bucket,我們會選擇最特定的認證。 這可讓您對於可從 SQL Server 存取的資料夾在目錄層級設定更細微的存取控制。

不支援的選項 FILE_SNAPSHOT

目前,S3 相容物件儲存體不支援 BACKUP TSQL 選項 FILE_SNAPSHOT。 這是 Azure Blob 儲存體特定選項。

如果使用者執行下列 Transact-SQL,例如:

BACKUP DATABASE AdventureWorks2022
TO URL = 's3://<your-endpoint>/myS3Bucket/sqlbackups/AdventureWorks2022.bak'
WITH FILE_SNAPSHOT;

系統傳回下列錯誤訊息:

Msg 3073, Level 16, State 1, Line 62
The option WITH FILE_SNAPSHOT is only permitted if all database files are in Azure Storage.
Msg 3013, Level 16, State 1, Line 62
BACKUP DATABASE is terminating abnormally.

備份等量超過 100 GB

目前,在備份期間,客戶在 S3 相容物件儲存體中建立的單一備份檔案大小不能超過每個檔案 100 GB,使用預設 MAXTRANSFERSIZE。 如果備份等量超過 100 GB,備份 T-SQL 語法陳述式將會擲回下列錯誤訊息:

Msg 3202, Level 16, State 1, Line 161
Write on 's3://<endpoint>:<port>/<bucket>/<path>/<db_name>.bak' failed: 87(The parameter is incorrect.)
Msg 3013, Level 16, State 1, Line 161
BACKUP DATABASE is terminating abnormally.

使用者備份大型資料庫的目前指導方針是針對資料庫備份使用多個等量,每個允許的大小小於或等於 100 GB。 BACKUP T-SQL 支援最多 64 個 URL 等量,例如:

BACKUP DATABASE AdventureWorks2022
TO URL = 's3://<endpoint>:<port>/<bucket>/<path>/<db_file>_1.bak',
URL = 's3://<endpoint>:<port>/<bucket>/<path>/<db_file>_2.bak';

使用者的替代選項是使用 [壓縮] 選項:

BACKUP DATABASE AdventureWorks2022
TO URL = 's3://<your-endpoint>/myS3Bucket/sqlbackups/AdventureWorks2022.bak'
WITH COMPRESSION;

URL 最大長度

備份和還原引擎的 URL 長度總計限制為 259 個位元組。 這表示 s3://hostname/objectkey 不應超過 259 個字元。 除了 s3://,使用者可以輸入路徑長度 (主機名稱 +物件索引鍵) 為 259 – 5 = 254 個字元。 請參閱 SQL Server 備份至 URL - SQL Server。 備份 T-SQL 語法陳述式會擲回下列錯誤訊息:

SQL Server has a maximum limit of 259 characters for a backup device name. The BACKUP TO URL consumes 36 characters for the required elements used to specify the URL - 'https://.blob.core.windows.net//.bak', leaving 223 characters for account, container, and blob names put together'

時鐘誤差修正

每當 SQL 主機與 S3 伺服器之間的時間差異大於 15 分鐘時,S3 儲存體可能會拒絕連線,讓「InvalidSignatureException」錯誤回到 SQL Server。 在 SQL Server 會顯示為:

Msg 3201, Level 16, State 1, Line 28
Cannot open backup device '<path>'. Operating system error 5(Access is denied.).
Msg 3013, Level 16, State 1, Line 28
BACKUP DATABASE is terminating abnormally.

Linux 上的 SQL Server 支援

SQL Server 會使用 WinHttp 實作所用的 HTTP REST API 用戶端。 這依賴 OS 憑證存放區驗證 HTTP 端點呈現的 TLS 憑證。 不過,Linux 上的 SQL Server會將憑證驗證委派給 SQLPAL,這會使用 PAL 提供的憑證來驗證端點的 HTTPS 憑證。 因此,客戶提供的自我簽署憑證無法在 Linux 上用來進行 HTTPS 驗證。

在備份/還原期間,客戶會在 Linux 上收到下列錯誤訊息:

Msg 3201, Level 16, State 1, Line 20
Cannot open backup device 's3://<endpoint>/<bucket>/testingDB.bak'. Operating system error 12175(failed to retrieve text for this error. Reason: 15105).
Msg 3013, Level 16, State 1, Line 20
BACKUP DATABASE is terminating abnormally.

若要解決此問題,必須建立下列預先定義的位置:/var/opt/mssql/security/ca-certificates。 將自我簽署憑證或未隨附於 PAL 的憑證放在此位置。 SQL Server 會在啟動期間讀取資料夾中的憑證,並予以新增至 PAL 信任存放區。

最多 50 個檔案可以儲存在此位置,如果未建立資料夾,則啟動 SQL Server 時,就會顯示 SQL Server 錯誤記錄檔:

2022-02-05 00:32:10.86 Server      Installing Client TLS certificates to the store.
2022-02-05 00:32:10.88 Server      Error searching first file in /var/opt/mssql/security/ca-certificates: 3(The system cannot find the path specified.)

物件鎖定 - 不支援刪除保留

SQL Server 備份至 S3 相容的物件儲存體功能不支援物件鎖定,也稱為刪除保留功能。 物件鎖定可防止檔案在保留期間期間遭刪除或覆寫。

備份作業鎖定的貯體和資料夾位置,不得啟用物件鎖定。 如果在 S3 相容的物件儲存體中啟用並設定此功能,備份作業會失敗,並顯示下列訊息:

Msg 3202, Level 16, State 1, Line 13
Write on 's3://<your-endpoint>/nonExistingBucket/AdventureWorks2022.bak' failed: 87 (The parameter is incorrect).
Msg 3013, Level 16, State 1, Line 13
BACKUP DATABASE is terminating abnormally.