S3 互換オブジェクト ストレージの URL への SQL Server のバックアップ

適用対象: SQL Server 2022 (16.x) 以降のバージョン

この記事では、S3 互換オブジェクト ストレージをバックアップ先として使用するために必要な概念、要件、コンポーネントを紹介します。 バックアップと復元の機能は、概念的には、バックアップ デバイスの種類として Azure Blob Storage 用 SQL Server Backup to URL を使う場合と似ています。

サポートされているプラットフォームの詳細については、「S3 と互換性のあるオブジェクト ストレージのプロバイダー」を参照してください。

概要

SQL Server 2022 (16.x) では、データ プラットフォームにオブジェクト ストレージ統合が導入され、Azure Storage に加えて、SQL Server と S3 互換オブジェクト ストレージを統合できます。 この統合 SQL Server を提供するために、S3 REST API を使用して S3 互換オブジェクト ストレージの任意のプロバイダーに接続する新しい S3 コネクタがサポートされます。 SQL Server 2022 (16.x) は、REST API を使用して新しい S3 コネクタのサポートを追加することで、既存の BACKUP/RESTORE TO/FROM URL 構文を拡張します。

S3 互換リソースを指す URL には、S3 コネクタが使われていることを示すために s3:// がプレフィックスとして付いています。 s3:// で始まる URL は、基となるプロトコルが https であることを常に想定しています。

パーツ番号とファイル サイズの制限

データを格納するには、Azure Blob Storage を使うときのブロック BLOB と同様に、S3 互換オブジェクト ストレージ プロバイダーがファイルをパーツという複数のブロックに分割する必要があります。

各ファイルは最大 10,000 個の部分に分割できます。各パーツ サイズは 5 MB から 20 MB の範囲です。この範囲は、BACKUP を使用して T-SQL コマンドによって制御されます。 MAXTRANSFERSIZE の既定値は 10 MB です。そのため、各パーツの既定サイズは 10 MB です。 この値は 最大 転送サイズを指定しますが、送信された各パーツが 10 MB であることを保証するものではありません。 パーツのサイズは、データの隣接性によって影響されます。 たとえば、2 MB のデータに隣接する 4 MB のデータがある場合、5 MB の最小サイズ部分に達した後、6 MB が送信されます。 または、隣接する dat が 12 MB の場合は、最大サイズ (10 MB) までのデータが送信され、残りの 2 MB が次の部分で送信されます。 S3 コネクタは常に可能な最大サイズのデータを送信しようとしますが、 MAXTRANSFERSIZE 値を超えることはありません。

1 つのファイルでサポートされる最大サイズは 、10,000 個のパーツ * MAXTRANSFERSIZEの結果です。より大きなファイルをバックアップする必要がある場合は、最大 64 個の URL を分割またはストライピングする必要があります。 最終的にサポートされるファイルの最大サイズは "10,000 パーツ * MAXTRANSFERSIZE * URL 数" です。

MAXTRANSFERSIZE 値を変更するには、COMPRESSION を使う必要があります。

S3 エンドポイントの前提条件

S3 エンドポイントは、次のように構成されている必要があります。

  • TLS を構成する必要があります。 すべての接続が HTTP ではなく HTTPS 経由で安全に送信されることを前提としています。 エンドポイントは、SQL Server OS ホストにインストールされている証明書によって検証されます。
  • 操作を実行するための適切なアクセス許可を持つ S3 互換オブジェクト ストレージに作成された資格情報。 ストレージ層で作成されたユーザーとパスワードの名前は、Access Key IDSecret Key ID です。 両方を S3 エンドポイントに対して認証する必要があります。
  • 少なくとも 1 つのバケットが構成されています。 バケットは、SQL Server 2022 (16.x) から作成または構成することはできません。

セキュリティ

アクセス許可のバックアップ

SQL Server を S3 と互換性のあるオブジェクト ストレージに接続するには、2 つのアクセス許可セットを確立する必要があります。1 つは SQL Server 上とストレージ レイヤー上にあります。

SQL ServerBACKUPまたは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. 1 つのバックアップ ファイルの最大サイズは、1 つの URL あたり 200,000 MiB です (MAXTRANSFERSIZE が 20 MB に設定されている場合)。
  2. バックアップは最大 64 個の URL までストライピングすることができます。
  3. ミラーリングはサポートされていますが、S3 URL 間でのみサポートされます。 URL と DISK、S3、Azure Storageの両方を使用したミラーリングはサポートされていません。
  4. 圧縮はサポートされ、推奨されています。
  5. 暗号化はサポートされています。
  6. S3 互換オブジェクト ストレージを使った URL からの復元にサイズの制限はありません。
  7. データベースを復元する場合、 MAXTRANSFERSIZE はバックアップ フェーズ中に割り当てられた値によって決まります。
  8. URL は、仮想ホストまたはパス スタイルの形式で指定できます。
  9. はサポートされています。
  10. REGION がサポートされ、既定値は us-east-1 です。
  11. MAXTRANSFERSIZE は 5 MB から 20 MB の範囲です。S3 コネクタの既定値は 10 MB です。

サポートされているバックアップと復元のステートメント

ステートメント S3 エンドポイント メモ
BACKUP イエス
RESTORE イエス
RESTORE FILELISTONLY イエス
RESTORE HEADERONLY イエス
RESTORE LABELONLY イエス
RESTORE VERIFYONLY イエス
RESTORE REWINDONLY いいえ

バックアップでサポートされる引数

WITH オプション S3 エンドポイント メモ
BLOCKSIZE イエス MAXTRANSFERSIZE は、パーツ サイズを決定します。
BUFFERCOUNT イエス
COMPRESSION イエス
COPY_ONLY イエス
CREDENTIAL イエス
DESCRIPTION イエス
DIFFERENTIAL イエス
ENCRYPTION イエス
FILE_SNAPSHOT いいえ
MAXTRANSFERSIZE イエス 5 MB (5,242,880 バイト) から 20 MB (20,971,520 バイト) まで、既定値は 10 MB (10,485,760 バイト)。
MEDIADESCRIPTION イエス
MEDIANAME イエス
MIRROR TO イエス 別の URL でのみ機能します。MIRRORURLを使用したDISKはサポートされていません。
NAME イエス
NOFORMAT / FORMAT イエス
NOINIT / INIT いいえ 追加はサポートされていません。 バックアップを上書きするには、WITH FORMAT を使います。
NO_CHECKSUM / CHECKSUM イエス
NO_TRUNCATE イエス
REGION イエス 既定値は us-east-1 です。 BACKUP_OPTIONS で使用する必要があります。
STATS イエス

復元でサポートされる引数

WITH オプション S3 エンドポイント メモ
BLOCKSIZE イエス MAXTRANSFERSIZE は、パーツ サイズを決定します。
BUFFERCOUNT いいえ
CHECKSUM / NO_CHECKSUM イエス
CREDENTIAL イエス
ENABLE_BROKER / ERROR_BROKER_CONVERSATIONS / NEW_BROKER イエス
FILE いいえ RESTORE FROM URL でサポートされない論理名。
FILESTREAM イエス
KEEP_CDC イエス
KEEP_REPLICATION イエス
LOADHISTORY イエス
MAXTRANSFERSIZE いいえ
MEDIANAME イエス
MEDIAPASSWORD いいえ SQL Server 2012 より前のバージョンで作成された一部のバックアップに必要です。
MOVE イエス
PARTIAL イエス
PASSWORD いいえ SQL Server 2012 より前のバージョンで作成された一部のバックアップに必要です。
RECOVERY / NORECOVERY / STANDBY イエス
REGION イエス 既定値は us-east-1 です。 RESTORE_OPTIONS で使用する必要があります。
REPLACE イエス
RESTART イエス
RESTRICTED_USER イエス
REWIND / NOREWIND いいえ
STATS イエス
STOP_ON_ERROR / CONTINUE_AFTER_ERROR イエス
STOPAT / STOPATMARK / STOPBEFOREMARK イエス
UNLOAD / NOUNLOAD いいえ

リージョン

S3 互換オブジェクト ストレージ プロバイダーは、バケットの場所の特定のリージョンを決定する機能を提供できます。 このオプション パラメーターを使用すると、特定のバケットが属するリージョンを指定することで、柔軟性を高めることができます。 このパラメーターは、 WITHBACKUP_OPTIONS または RESTORE_OPTIONS のいずれかと合わせて使用する必要があります。 これらのオプションでは、値を 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 のクライアントが実装されます。 http(s) エンドポイントによって提示される TLS 証明書の検証については、OS の証明書ストアが利用されます。 ただし、SQL Server on Linux の場合、/var/opt/mssql/security/ca-certificates に作成される定義済みの場所に CA を配置する必要があります。このフォルダーに格納し、サポートすることができるのは最初の 50 個の証明書のみです。 SQL Server プロセスを開始する前に、CA を配置する必要があります。

SQL Server は起動時にこのフォルダーから証明書を読み取り、信頼ストアに追加します。

このフォルダーに書き込むことができるのはスーパー ユーザーのみにするようにします。一方、mssql ユーザーには読み取りのみを許可する必要があります。

サポートされていない機能

  • セキュリティで保護されていない http URL を使用した S3 互換オブジェクト ストレージへのバックアップはサポートされていません。 お客様には、S3 ホストに https URL を設定する責任があります。また、このエンドポイントは SQL Server OS ホストにインストールされた証明書によって検証されます。
  • S3 互換オブジェクト ストレージへのバックアップは、SQL Server Express および SQL Server Express と Advanced Services エディションではサポートされていません。

制限事項

S3 互換オブジェクト ストレージを使ったバックアップと復元には、現在、次のような制限があります。

  • S3 Standard REST API の現在の制限により、 BACKUP T-SQL コマンドの実行中に顧客の S3 互換オブジェクト ストアに作成される一時的なコミットされていないデータ ファイル (マルチパート アップロード操作が進行中のため) は、バックアップ エラーが発生しても削除されません。 これらのコミットされていないデータ ブロックは、 BACKUP T-SQL コマンドが失敗または取り消された場合に、S3 互換オブジェクト ストレージに保持され続けます。 バックアップが成功すると、これらの一時ファイルはオブジェクト ストアによって自動的に削除され、最終的なバックアップ ファイルが形成されます。 一部の S3 互換ストレージ プロバイダーは、ガベージ コレクター システムを介して一時ファイルを処理します。
  • URL の長さは 259 文字に制限されます。 この制限では、s3:// コネクタ名を含む完全な文字列がカウントされます。 そのため、使用できる上限は 254 文字です。 ただし、クエリ パラメーターを導入できるように、200 文字の制限を守ることをお勧めします。
  • SQL 資格情報名は、UTF-16 形式では 128 文字までに制限されています。
  • シークレット キー ID には : 文字を含めてはなりません。

パス スタイルと仮想ホスト スタイル

S3 にバックアップすると、パス スタイルと仮想ホスト スタイルの両方で書き込まれる URL がサポートされます。

パス スタイルの例: s3://<endpoint>:<port>/<bucket>/<backup_file_name>

仮想ホストの例: s3://<bucket>.<domain>/<backup_file_name>

資格情報の作成

  • 認証情報の名前はストレージ パスを提供する必要があり、ストレージ プラットフォームに応じて複数の標準があります。
  • S3 コネクタを使用する場合、 IDENTITY は常に 'S3 Access Key' する必要があります。
  • アクセス キー ID と秘密鍵 ID にコロンを含めることはできません。 アクセス キー ID とシークレット キー ID は、S3 互換オブジェクト ストレージに作成されたユーザーとパスワードです。
  • 英数字の値のみを使用できます。
  • アクセス キー ID には、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 では、2 つの異なる 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;

暗号化と圧縮のオプション

次の例では、暗号化、20 MB の AdventureWorks2025、圧縮を使って MAXTRANSFERSIZE データベースのバックアップと復元を行う方法を示しています。

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

バックアップと復元のためのリージョンの使用

次の例では、AdventureWorks2025 を使って REGION_OPTIONS データベースのバックアップと復元を行う方法を示しています。

BACKUP / RESTORE コマンド内でリージョンをパラメーター化できます。 BACKUP_OPTIONS および RESTORE_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