S3 互換オブジェクト ストレージでの URL への SQL Server のバックアップに関するベスト プラクティスとトラブルシューティング

適用対象: SQL Server 2022 (16.x)

この記事では、S3 互換オブジェクト ストレージへの SQL Server のバックアップと復元に関するベスト プラクティスとトラブルシューティングのヒントについて説明します。

SQL Server のバックアップまたは復元操作に Azure Blob Storage を使用する方法の詳細については、次を参照してください。

トラブルシューティングと一般的なエラーの原因

以下では、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

現在、BACKUP T-SQL のオプション FILE_SNAPSHOT は、S3 互換オブジェクト ストレージではサポートされていません。 これは、Azure Blob Storage 固有のオプションです。

たとえば、ユーザーが次の 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 互換オブジェクト ストレージに作成する 1 つのバックアップ ファイルのサイズは、既定の MAXTRANSFERSIZE を使用すると、ファイルあたり 100 GB を超えることはできません。 バックアップ ストライプが 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 以下です。 バックアップ 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';

ユーザーのための代替オプションは、"COMPRESSION" オプションを使うことです。

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 文字までです。 「URL への SQL Server のバックアップ - 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.

SQL Server on Linux のサポート

SQL Server では、WinHttp を使って、それが使う HTTP REST API のクライアントが実装されます。 HTTP(s) エンドポイントによって提示される TLS 証明書の検証については、OS の証明書ストアが利用されます。 ただし、SQL Server on Linux では、証明書の検証が 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.)

オブジェクト ロック - 削除の保持はサポートされていません

S3 互換オブジェクト ストレージ機能の SQL Server バックアップでは、「オブジェクト ロック」 (「保持の削除機能」とも呼ばれます) はサポートされていません。 オブジェクト ロックを使用している保持期間の間は、ファイルが削除または上書きされません。

バックアップ操作を行う対象のバケットおよびフォルダーが置かれた場所でオブジェクト ロックが有効にされていないことが必要となります。 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.