SQL Server 備份至 S3 相容物件儲存體的 URL

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

本文介紹使用 S3 相容物件儲存體作為備份目的地所需的概念、需求及元件。 備份和還原功能在概念上類似於使用 SQL Server 備份至作為備份裝置類型的 Azure Blob 儲存體 URL

如需支援平台的資訊,請參閱 S3 相容物件儲存體提供者

概觀

SQL Server 2022 (16.x) 為資料平台引進物件儲存體整合,讓您除了 Azure 儲存體之外,還可整合 SQL Server 與 S3 相容物件儲存體。 為提供這項整合,SQL Server 支援 S3 連接器,可使用 S3 REST API 來連接 S3 相容物件儲存體的任何供應商。 SQL Server 2022 (16.x) 使用 REST API 為新 S3 連接器新增支援,然後擴充現有的 BACKUP/RESTORE TO/FROM URL 語法。

指向 S3 相容資源的 URL 前面加上 s3:// 時,表示正在使用 S3 連接器。 開頭為 s3:// 的 URL 一律會假設基礎通訊協定是 https

組件數目和檔案大小限制

若要儲存資料,S3 相容物件儲存體提供者必須分割檔案為多個區塊 (稱為組件),類似 Azure Blob 儲存體中的 Blob 儲存體

每個檔案最多可分割為 10,000 個組件,每個組件大小範圍為 5 MB 到 20 MB,此範圍透過 T-SQL BACKUP 命令的 MAXTRANSFERSIZE 參數控制。 MAXTRANSFERSIZE 的預設值為 10 MB,所以每個組件預設的大小為 10 MB。

單一檔案支援大小上限的結果是 10,000 個組件 * MAXTRANSFERSIZE,如果需要備份較大的檔案,參數必須分割/等量最多 64 個 URL。 檔案最終支援的大小上限是 10,000 個組件 * MAXTRANSFERSIZE * URL

注意

您必須使用 COMPRESSION 才能變更 MAXTRANSFERSIZE 值。

S3 端點的必要條件

S3 端點必須設定如下:

  • 您必須設定 TLS。 假設所有連線會透過 HTTPS 而非 HTTP 安全傳輸。 端點將會由安裝在 SQL Server OS 主機上的憑證進行驗證。
  • S3 相容物件儲存體上建立的認證,包含適當的權限可執行作業。 儲存層上建立的使用者和密碼名為 Access Key IDSecret Key ID。 您需要這兩項資訊才能向 S3 端點進行驗證。
  • 至少已設定一個貯體。 您無法從 SQL Server 2022 (16.x) 建立或設定貯體。

安全性

備份權限

若要連線 SQL Server 與 S3 相容物件儲存體,您必須建立兩組權限,一組在 SQL Server 上,另一組在儲存層上。

SQL Server 上用來發行 BACKUP 或 RESTORE 命令的使用者帳戶應該在包含變更任何認證權限的 db_backupoperator 資料庫角色中。

在儲存體層上:

  • 在 AWS S3 中,建立自訂角色,並特別指出 S3 API 需要存取權。 備份和還原需要這些權限:ListBucket (瀏覽)、PutObject (寫入 - 用於備份)。
  • 在其他 S3 相容儲存體中,使用者 (Access Key ID) 必須同時具有 ListBucketWriteOnly 權限。

還原權限

如果還原的資料庫不存在,則使用者必須有 CREATE DATABASE 權限才能執行 RESTORE。 如果資料庫存在,則 RESTORE 權限預設為 sysadmindbcreator 固定伺服器角色的成員,以及資料庫的擁有者 (dbo)。

RESTORE 權限提供給伺服器隨時可以取得其成員資格資訊的角色。 由於資料庫必須是可存取且未損毀才能夠檢查固定資料庫角色成員資格,但執行 RESTORE 時未必如此;因此,db_owner 固定資料庫角色的成員並沒有 RESTORE 權限。

在儲存體層上:

  • 在 AWS S3 中,建立自訂角色,並特別指出 S3 API 需要存取權。 備份和還原需要這些權限:ListBucket (瀏覽)、GetObject (讀取 - 用於還原)。
  • 在其他 S3 相容儲存體中,使用者 (Access Key ID) 必須同時有 ListBucketReadOnly 權限。

支援的功能

BACKUPRESTORE 支援功能的高階概觀:

  1. 每個 URL 的單一備份檔案最多可達200,000 MiB (MAXTRANSFERSIZE 設為 20 MB 時)。
  2. 備份最多可等量跨 64 個 URL。
  3. 支援鏡像,但只在 URL。 不支援包含 URL 和磁碟的鏡像。
  4. 支援並建議壓縮。
  5. 支援加密。
  6. 從 S3 相容物件儲存體的 URL 還原沒有大小限制。
  7. 當您還原資料庫時,備份階段指派的值會決定 MAXTRANSFERSIZE
  8. 您可以在虛擬主機或路徑樣式格式中指定 URL。
  9. 支援 WITH CREDENTIAL
  10. 支援 REGION,且預設值為 us-east-1
  11. MAXTRANSFERSIZE 的範圍是 5 MB 到 20 MB。10 MB 是 S3 連接器的預設值。

支援的備份引數

WITH 選項 S3 端點 備註
BLOCKSIZE Y MAXTRANSFERSIZE 會決定組件大小。
BUFFERCOUNT Y
COMPRESSION Y
COPY_ONLY Y
CREDENTIAL Y
DESCRIPTION Y
DIFFERENTIAL Y
ENCRYPTION Y
FILE_SNAPSHOT N
MAXTRANSFERSIZE Y 從 5 MB (5,242,880 個位元組) 到 20 MB (20,971,520 個位元組),預設值是 10 MB (10,485,760 個位元組)。
MEDIADESCRIPTION Y
MEDIANAME Y
MIRROR TO Y 只能搭配另一個 URL 使用,不支援包含 URLDISKMIRROR
NAME Y
NOFORMAT/FORMAT Y
NOINIT/INIT N 不支援附加。 若要覆寫備份,請使用 WITH FORMAT
NO_CHECKSUM/CHECKSUM Y
NO_TRUNCATE Y
區域 Y 預設值為 us-east-1。 必須與 BACKUP_OPTIONS 搭配使用。
STATS Y

支援的還原引數

WITH 選項 S3 端點 備註
BLOCKSIZE Y MAXTRANSFERSIZE 會決定組件大小。
BUFFERCOUNT N
CHECKSUM | NO_CHECKSUM Y
CREDENTIAL Y
ENABLE_BROKER | ERROR_BROKER_CONVERSATIONS | NEW_BROKER Y
FILE RESTORE FROM URL 不支援邏輯名稱。
FILESTREAM Y
KEEP_CDC Y
KEEP_REPLICATION Y
LOADHISTORY Y
MAXTRANSFERSIZE Y
MEDIANAME Y
MEDIAPASSWORD 需要 SQL Server 2012 之前建立的部分備份。
MOVE Y
PARTIAL Y
PASSWORD 需要 SQL Server 2012 之前建立的部分備份。
RECOVERY | NORECOVERY | STANDBY Y
區域 Y 預設值為 us-east-1。 必須與 RESTORE_OPTIONS 搭配使用。
REPLACE Y
RESTART Y
RESTRICTED_USER Y
REWIND | NOREWIND N
STATS Y
STOP_ON_ERROR | CONTINUE_AFTER_ERROR Y
STOPAT | STOPATMARK | STOPBEFOREMARK Y
UNLOAD | NOUNLOAD N

區域

S3 相容物件儲存體提供者可以提供判斷貯體位置特定區域的能力。 使用此選用參數可指定特定貯體所屬區域,然後提供更多彈性。 此參數需要搭配 BACKUP_OPTIONSRESTORE_OPTIONS 使用 WITH。 這些選項需要以 JSON 格式宣告值。 這可讓 S3 相容儲存提供者可以有相同的通用 URL,但分散到數個區域的情況。 在此情況下,備份或還原命令點會指向指定的區域,而不需要變更 URL。

如果未宣告值,會指派 us-east-1 為預設值。

備份範例:

WITH BACKUP_OPTIONS = '{"s3": {"region":"us-west-1"}}'

還原範例:

WITH RESTORE_OPTIONS = '{"s3": {"region":"us-west-1"}}'

Linux 支援

SQL Server 使用 WinHttp 實作所用的 HTTP REST API 用戶端。 這依賴 OS 憑證存放區驗證 http(s) 端點呈現的 TLS 憑證。 但 Linux 上的 SQL Server CA 必須放置在預先定義位置上,才能在 /var/opt/mssql/security/ca-certificates 建立,在此資料夾中只能儲存並支援前 50 個憑證。

啟動期間,SQL Server 會從資料夾讀取憑證,並新增憑證至信任存放區。

建議僅限進階使用者可以在資料夾中寫入,而 mssql 使用者必須能夠讀取。

不支援的功能

  • 不支援使用不安全的 http URL 備份至 S3 相容物件儲存體。 客戶需負責使用 https URL 設定 S3 主機,然後 SQL Server OS 主機上安裝的憑證會驗證此端點。
  • SQL Server Express 與進階服務版本 SQL Server Express 不支援備份至 S3 相容物件儲存體。

限制

以下是使用 S3 相容物件儲存體備份與還原的目前限制:

  1. 基於 S3 標準 REST API 目前的限制,執行 BACKUP T-SQL 命令時,在客戶的 S3 相容物件存放區中建立的暫存未提交資料檔案 (因為進行多組件上傳作業) 失敗時不會移除。 如果 BACKUP T-SQL 命令失敗或取消,這些未提交的資料區塊會繼續保存在 S3 相容物件儲存體。 如果備份成功,物件存放區會自動移除這些暫存檔案,並形成最終的備份檔案。 部分 S3 相容儲存體提供者會透過記憶體回收行程系統處理此動作。
  2. URL 總長度限制為 259 個字元。 此限制會計算完整字串,包括 s3:// 連接器名稱。 因此,可用限制為 254 個字元。 但考慮到可能採用查詢參數,我們建議遵守 200 個字元的限制。
  3. 在 UTF-16 格式中,SQL 認證名稱限制在 128 個字元。
  4. 祕密金鑰 ID 不得具有 : 個字元。

路徑樣式和虛擬主機樣式

備份至 S3 支援以路徑樣式或虛擬主機樣式編寫 URL。

路徑樣式範例:s3://<endpoint>:<port>/<bucket>/<backup_file_name>

虛擬主機範例:s3://<bucket>.<domain>/<backup_file_name>

範例

建立認證

  • 認證的名稱應該提供儲存體路徑,根據儲存體平台,可能會有多種標準。
  • 使用 S3 連接器時,IDENTITY 應一律為 'S3 Access Key'
  • 存取金鑰識別碼和祕密金鑰識別碼不得包含冒號。 存取金鑰識別碼和祕密金鑰識別碼是在 S3 相容物件儲存體上建立的使用者和密碼。
  • 僅允許英數字元值。
  • 存取金鑰識別碼必須有 S3 相容物件儲存體的適當許可權。

使用 CREATE CREDENTIAL 建立伺服器層級認證,以使用 S3 相容的物件儲存體端點進行驗證。

USE [master];
CREATE CREDENTIAL [s3://<endpoint>:<port>/<bucket>]
WITH
        IDENTITY    = 'S3 Access Key',
        SECRET      = '<AccessKeyID>:<SecretKeyID>';
GO

BACKUP DATABASE [SQLTestDB]
TO      URL = 's3://<endpoint>:<port>/<bucket>/SQLTestDB.bak'
WITH    FORMAT /* overwrite any existing backup sets */
,       STATS = 10
,       COMPRESSION;

不過,AWS S3 支援兩種不同的 URL 標準。

  • S3://<BUCKET_NAME>.S3.<REGION>.AMAZONAWS.COM/<FOLDER> (預設值)
  • S3://S3.<REGION>.AMAZONAWS.COM/<BUCKET_NAME>/<FOLDER>

有多種方式可成功建立 AWS S3 的認證。

-- S3 bucket name: datavirtualizationsample
-- S3 bucket region: us-west-2
-- S3 bucket folder: backup

CREATE CREDENTIAL [s3://datavirtualizationsample.s3.us-west-2.amazonaws.com/backup]
WITH    
        IDENTITY    = 'S3 Access Key'
,       SECRET      = 'accesskey:secretkey';
GO

BACKUP DATABASE [AdventureWorks2022]
TO URL  = 's3://datavirtualizationsample.s3.us-west-2.amazonaws.com/backup/AdventureWorks2022.bak'
WITH COMPRESSION, FORMAT, MAXTRANSFERSIZE = 20971520;
GO

或者,

CREATE CREDENTIAL [s3://s3.us-west-2.amazonaws.com/datavirtualizationsample/backup]
WITH    
        IDENTITY    = 'S3 Access Key'
,       SECRET      = 'accesskey:secretkey';
GO

BACKUP DATABASE [AdventureWorks2022]
TO URL  = 's3://s3.us-west-2.amazonaws.com/datavirtualizationsample/backup/AdventureWorks2022.bak'
WITH COMPRESSION, FORMAT, MAXTRANSFERSIZE = 20971520;
GO

備份至 URL

下列範例會等量跨多個檔案,執行完整資料庫備份至物件儲存體端點:

BACKUP DATABASE <db_name>
TO      URL = 's3://<endpoint>:<port>/<bucket>/<database>_01.bak'
,       URL = 's3://<endpoint>:<port>/<bucket>/<database>_02.bak'
,       URL = 's3://<endpoint>:<port>/<bucket>/<database>_03.bak'
--
,       URL = 's3://<endpoint>:<port>/<bucket>/<database>_64.bak'
WITH    FORMAT -- overwrite
,       STATS               = 10
,       COMPRESSION;

從 URL 還原

下列範例會從物件儲存體端點位置執行資料庫還原:

RESTORE DATABASE <db_name>
FROM    URL = 's3://<endpoint>:<port>/<bucket>/<database>_01.bak'
,       URL = 's3://<endpoint>:<port>/<bucket>/<database>_02.bak'
,       URL = 's3://<endpoint>:<port>/<bucket>/<database>_03.bak'
--
,       URL = 's3://<endpoint>:<port>/<bucket>/<database>_64.bak'
WITH    REPLACE -- overwrite
,       STATS  = 10;

加密與壓縮選項

下列範例示範如何備份和還原加密、MAXTRANSFERSIZE 為 20 MB 並壓縮的 AdventureWorks2022 資料庫:

CREATE MASTER KEY ENCRYPTION BY PASSWORD = <password>;
GO

CREATE CERTIFICATE AdventureWorks2022Cert
    WITH SUBJECT = 'AdventureWorks2022 Backup Certificate';
GO
-- Backup database
BACKUP DATABASE AdventureWorks2022
TO URL = 's3://<endpoint>:<port>/<bucket>/AdventureWorks2022_Encrypt.bak'
WITH FORMAT, MAXTRANSFERSIZE = 20971520, COMPRESSION,
ENCRYPTION (ALGORITHM = AES_256, SERVER CERTIFICATE = AdventureWorks2022Cert)
GO

-- Restore database
RESTORE DATABASE AdventureWorks2022
FROM URL = 's3://<endpoint>:<port>/<bucket>/AdventureWorks2022_Encrypt.bak'
WITH REPLACE

使用區域備份和還原

下列範例示範如何使用 REGION_OPTIONS 備份和還原 AdventureWorks2022 資料庫:

您可以將每個 BACKUP/RESTORE 命令中的區域參數化。 留意 BACKUP_OPTIONSRESTORE_OPTIONS 中的 S3 特定區域字串,例如:'{"s3": {"region":"us-west-2"}}'。 預設區域是 us-east-1。 以下是簡單的範例:

-- Backup Database
BACKUP DATABASE AdventureWorks2022
TO URL = 's3://<endpoint>:<port>/<bucket>/AdventureWorks2022.bak'
WITH BACKUP_OPTIONS = '{"s3": {"region":"us-west-2"}}'

-- Restore Database
RESTORE DATABASE AdventureWorks2022
FROM URL = 's3://<endpoint>:<port>/<bucket>/AdventureWorks2022.bak'
WITH 
  MOVE 'AdventureWorks2022' 
  TO 'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\AdventureWorks2022.mdf'
, MOVE 'AdventureWorks2022_log' 
  TO 'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\AdventureWorks2022.ldf'
, RESTORE_OPTIONS = '{"s3": {"region":"us-west-2"}}'

例如:

-- S3 bucket name: datavirtualizationsample
-- S3 bucket region: us-west-2
-- S3 bucket folder: backup

CREATE CREDENTIAL   [s3://datavirtualizationsample.s3.amazonaws.com/backup]
WITH    
        IDENTITY    = 'S3 Access Key'
,       SECRET      = 'accesskey:secretkey';
GO

BACKUP DATABASE [AdventureWorks2022]
TO URL  = 's3://datavirtualizationsample.s3.amazonaws.com/backup/AdventureWorks2022.bak'
WITH
    BACKUP_OPTIONS = '{"s3": {"region":"us-west-2"}}' -- REGION AS PARAMETER)
, COMPRESSION, FORMAT, MAXTRANSFERSIZE = 20971520;
GO

RESTORE DATABASE AdventureWorks2022_1 
FROM URL = 's3://datavirtualizationsample.s3.amazonaws.com/backup/AdventureWorks2022.bak'
WITH 
  MOVE 'AdventureWorks2022' 
  TO 'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\AdventureWorks2022_1.mdf'
, MOVE 'AdventureWorks2022_log' 
  TO 'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\AdventureWorks2022_1.ldf'
, STATS = 10, RECOVERY
, REPLACE, RESTORE_OPTIONS = '{"s3": {"region":"us-west-2"}}'; -- REGION AS PARAMETER)
GO