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 の範囲です。この範囲は、T-SQL BACKUP コマンドでパラメーター MAXTRANSFERSIZE を使って制御します。 MAXTRANSFERSIZE の既定値は 10 MB です。そのため、各パーツの既定サイズは 10 MB です。

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

Note

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 Server では、BACKUP コマンドまたは RESTORE コマンドの発行に使用するユーザー アカウントは、資格情報の変更アクセス許可を持つ db_backup operator データベース ロールに属している必要があります。

ストレージ レイヤーで次の手順を実行します。

  • AWS S3 で、カスタム役割を作成し、S3 API にアクセスが必要な状態を具体的に指定します。 バックアップと復元には、ListBucket (参照) 、PutObject (書き込み - バックアップ用) のアクセス許可が必要です。
  • その他の S3 互換ストレージでは、ユーザー (Access Key ID) に ListBucketWriteOnly の両方のアクセス許可が必要です。

アクセス許可の復元

復元するデータベースが存在しない場合、ユーザーは RESTORE を実行できる CREATE DATABASE 権限を持っている必要があります。 データベースが存在する場合、既定では、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. ミラーリングはサポートされていますが、URL 間でのみサポートされます。 URL と DISK の両方を使用したミラーリングはサポートされていません。
  4. 圧縮はサポートされ、推奨されています。
  5. 暗号化はサポートされています。
  6. S3 互換オブジェクト ストレージを使った URL からの復元にサイズの制限はありません。
  7. データベースを復元する場合、バックアップ フェーズ中に割り当てられた値によって MAXTRANSFERSIZE は決定されます。
  8. URL は、仮想ホストまたはパス スタイルの形式で指定できます。
  9. `SUSER_ID` はサポートされています。
  10. REGION がサポートされ、既定値は us-east-1 です。
  11. MAXTRANSFERSIZE は 5 MB から 20 MB の範囲です。S3 コネクタの既定値は 10 MB です。

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

WITH オプション S3 エンドポイント メモ
BLOCKSIZE MAXTRANSFERSIZE は、パーツ サイズを決定します。
BUFFERCOUNT
COMPRESSION
COPY_ONLY
CREDENTIAL
説明
DIFFERENTIAL
暗号化
FILE_SNAPSHOT N
MAXTRANSFERSIZE 5 MB (5,242,880 バイト) から 20 MB (20,971,520 バイト) まで、既定値は 10 MB (10,485,760 バイト)。
MEDIADESCRIPTION
MEDIANAME
MIRROR TO 別の URL でのみ機能し、URLDISK が混在する MIRROR はサポートされていません。
名前
NOFORMAT/FORMAT
NOINIT/INIT N 追加はサポートされていません。 バックアップを上書きするには、WITH FORMAT を使います。
NO_CHECKSUM/CHECKSUM
NO_TRUNCATE
リージョン 既定値は us-east-1BACKUP_OPTIONS で使用する必要があります。
[統計]

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

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

リージョン

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 Support

SQL Server では、WinHttp を使って、それが使う HTTP REST API のクライアントが実装されます。 http(s) エンドポイントによって提示される TLS 証明書の検証については、OS の証明書ストアが利用されます。 ただし、SQL Server on Linux の場合、/var/opt/mssql/security/ca-certificates に作成される定義済みの場所に CA を配置する必要があります。このフォルダーに格納し、サポートすることができるのは最初の 50 個の証明書のみです。

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

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

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

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

制限事項

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

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

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

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

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

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

資格情報の作成

  • 認証情報の名前はストレージ パスを提供する必要があり、ストレージ プラットフォームに応じて複数の標準があります。
  • S3 コネクタを使う場合、ID は常に '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 の MAXTRANSFERSIZE、圧縮を使って 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

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

次の例では、AdventureWorks2022 を使って 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