Microsoft Azure Blob Storage に対する SQL Server Backup to URL のベスト プラクティスおよびトラブルシューティング

適用対象: SQL ServerAzure SQL Managed Instance

この記事では、Microsoft Azure Blob Storage に対する SQL Server のバックアップと復元に関するベスト プラクティスとトラブルシューティングのヒントを示します。

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

バックアップの管理

バックアップを管理するための一般的な推奨事項を次に示します。

  • BLOB を誤って上書きしないように、各バックアップに一意なファイル名を付けることをお勧めします。

  • コンテナーを作成する際は、アクセス レベルを privateに設定し、必要な認証情報を指定できるユーザーまたはアカウントだけがコンテナー内の BLOB の読み取りや書き込みを実行できるようにする必要があります。

  • Azure Virtual Machine で実行している SQL Server インスタンス上の SQL Server データベースでは、バーチャル マシンと同じ地域のストレージ アカウントを使用して、地域間のデータ転送コストを回避してください。 また、同じ地域を使用すると、バックアップ操作と復元操作で最適なパフォーマンスを得ることができます。

  • バックアップ処理に失敗すると、無効なバックアップ ファイルが生成されます。 失敗したバックアップを定期的に確認し、BLOB ファイルを削除することをお勧めします。 詳細については、「Deleting Backup Blob Files with Active Leases」をご覧ください。

  • バックアップ中に WITH COMPRESSION オプションを使用すると、ストレージ コストとストレージのトランザクション コストを最小限に抑えることができます。 また、バックアップ プロセスが完了するまでにかかる時間を短縮することもできます。

  • SQL Server Backup to URL」で推奨されているように、MAXTRANSFERSIZE 引数と BLOCKSIZE 引数を設定します。

  • SQL Server は、使用されるストレージの冗長性の種類に依存しません。 ページ BLOB とブロック BLOB へのバックアップは、すべてのストレージ冗長性 (LRS/ZRS/GRS/RA-GRS/RA-GZRS, etc.) でサポートされています。

大きなファイルを処理する

SQL Server のバックアップ操作では、複数のスレッドを使用して、Azure Blob Storage へのデータ転送を最適化します。 ただし、パフォーマンスは ISV の帯域幅やデータベースのサイズなどのさまざまな要因によって異なります。 オンプレミスの SQL Server データベースから大きなデータベースまたはファイル グループをバックアップする場合は、最初にスループットのテストを行う必要があります。 SLA for Storage には BLOB の最大処理時間が示されているため、考慮に入れておくことができます。

バックアップの管理」セクションで推奨されているように WITH COMPRESSION オプションを使用することは、大きなファイルをバックアップするときに非常に重要です。

BACKUP TO URL または RESTORE FROM URL のトラブルシューティング

ここでは、Azure Blob Storage に対してバックアップまたは復元を実行するときに発生するエラーを簡単にトラブルシューティングする方法をいくつか示します。

サポートされないオプションまたは制限事項によるエラーを回避するには、「Microsoft Azure Blob Storage を使った SQL Server のバックアップと復元」の記事で、制限事項の一覧およびBACKUPおよびRESTOREコマンドのサポート情報を確認してください。

初期化に失敗しました

同じ BLOB への並列バックアップを実行すると、バックアップの 1 つが " 初期化に失敗しました " エラーで失敗します。

  • SQL Server 2016 (13.x) 以降のバージョンでは、URL へのバックアップにはブロック BLOB が推奨されます。

  • BACKUP TO URLでページ BLOB を使用している場合は、トレース フラグ 3051 を使用して、 次の形式で特定のエラーログへのログ記録を有効にすることができます。BackupToUrl-\<instname>-\<dbname>-action-\<PID>.log\<action>が次のいずれかのオプションになります)

    • DB
    • FILELISTONLY
    • LABELONLY
    • HEADERONLY
    • VERIFYONLY

Windows イベント ビューアー (SQLBackupToUrl という名前のアプリケーション ログ) を確認することで情報を見つけることもできます。

I/O デバイス エラーのため、要求は実行されませんでした。

大規模なデータベースをバックアップする場合は、COMPRESSIONMAXTRANSFERSIZEBLOCKSIZE、および複数の URL 引数を検討してください。 Azure Blob Storage への VLDB のバックアップに関する記事を参照してください。

エラー:

Msg 3202, Level 16, State 1, Line 1
Write on "https://mystorage.blob.core.windows.net/mycontainer/TestDbBackupSetNumber2_0.bak" failed:
1117(The request could not be performed because of an I/O device error.)
Msg 3013, Level 16, State 1, Line 1
BACKUP DATABASE is terminating abnormally.

解決の例:

BACKUP DATABASE TestDb
TO URL = 'https://mystorage.blob.core.windows.net/mycontainer/TestDbBackupSetNumber2_0.bak',
URL = 'https://mystorage.blob.core.windows.net/mycontainer/TestDbBackupSetNumber2_1.bak',
URL = 'https://mystorage.blob.core.windows.net/mycontainer/TestDbBackupSetNumber2_2.bak'
WITH COMPRESSION, MAXTRANSFERSIZE = 4194304, BLOCKSIZE = 65536;

デバイスのメッセージ ファイルマークが揃っていません。

圧縮されたバックアップから復元するときに、次のエラーが表示される場合があります。

SqlException 3284 occurred. Severity: 16 State: 5
Message Filemark on device 'https://mystorage.blob.core.windows.net/mycontainer/TestDbBackupSetNumber2_0.bak' is not aligned.
Reissue the Restore statement with the same block size used to create the backupset: '65536' looks like a possible value.

このエラーを解決するには、RESTORE を指定した BLOCKSIZE = 65536 ステートメントを再実行してください。

バックアップ処理に失敗すると、アクティブなリースを保持する BLOB が生成されます。

アクティブなリースを保持している BLOB が原因でバックアップ中に発生するエラー: Failed backup activity can result in blobs with active leases.

BACKUP ステートメントが再実行されると、バックアップ操作が次の出力に類似したエラーで失敗することがあります。

Backup to URL received an exception from the remote endpoint. Exception Message:
The remote server returned an error: (412) There is currently a lease on the blob and no lease ID was specified in the request.

アクティブなリースを保持しているバックアップ BLOB ファイルに対して RESTORE ステートメントが実行されると、復元操作は次のようなエラーで失敗します。

Exception Message: The remote server returned an error: (409) Conflict..

このようなエラーが発生した場合は、BLOB ファイルを削除する必要があります。 このシナリオの詳細とこの問題の解決方法については、「アクティブなリースを保持している Backup BLOB ファイルを削除する」をご覧ください。

OS エラー 50: 要求はサポートされていません

データベースをバックアップしているときに、次の理由によりエラー Operating system error 50(The request is not supported) が表示される場合があります。

  • 指定されたストレージ アカウントが General Purpose V1/V2 ではない。
  • 資格情報が作成されたときに、SAS トークンの先頭に ? 記号があった。 その場合は、削除してください。
  • 現在の接続では、Storage Explorer または SQL Server Management Studio (SSMS) を使用して、現在のマシンからストレージ アカウントに接続できない。
  • SAS トークンに割り当てられたポリシーの有効期限が切れている。 Azure Storage Explorer を使用して新しいポリシーを作成し、そのポリシーを使用して新しい SAS トークンを作成するか、資格情報を変更して、もう一度バックアップを試行してください。
  • このルート証明書は、信頼されたルート証明書ストアに存在しません。 詳細については、「Azure ルート証明機関」を参照してください。

認証エラー

WITH CREDENTIAL は新しいオプションで、Azure Blob Storage に対するバックアップまたは復元で必要です。

資格情報に関連するエラーには、The credential specified in the **BACKUP** or **RESTORE** command does not exist. のようなものがあります。

この問題を回避するには、資格情報が BACKUP ステートメントに存在しない場合に資格情報を作成する T-SQL ステートメントを含めることができます。 使用可能な例を次に示します。

IF NOT EXISTS (
   SELECT *
   FROM sys.credentials
   WHERE credential_identity = 'mycredential'
)
CREATE CREDENTIAL [<credential name>]
   WITH IDENTITY = 'mystorageaccount',
      SECRET = '<storage access key>';

資格情報は存在しますが、BACKUP コマンドの実行に使用されるログインに資格情報へのアクセス権限がありません。 Alter any credential 権限がある db_backupoperator ロールのアカウントを使用してください。

ストレージ アカウントの名前とキーの値を確認してください。 資格情報に格納されている情報は、バックアップ操作と復元操作で使用する Azure ストレージ アカウントのプロパティの値と一致する必要があります。

400 (無効な要求) エラー

SQL Server 2012 (11.x) を使用すると、次の出力に類似したバックアップの実行中にエラーが発生する場合があります。

Backup to URL received an exception from the remote endpoint. Exception Message:
The remote server returned an error: (400) Bad Request.

これは、Azure Storage アカウントでサポートされている TLS バージョンが原因で発生します。 サポートされている TLS バージョンを変更するか、KB4017023 に記載されている回避策を使用してください。

プロキシ エラー

インターネットへのアクセスにプロキシ サーバーを使用している場合、以下の問題が発生することがあります。

プロキシ サーバーによる接続調整

プロキシ サーバーで、1 分あたりの接続数を制限する設定が使用されている場合があります。 Backup to URL プロセスはマルチスレッド プロセスであるため、この制限を超える可能性があります。 制限を超えた場合、プロキシ サーバーは接続を切断します。 この問題を解決するには、SQL Server でプロキシが使用されないようにプロキシ設定を変更します。 エラー ログに表示される可能性のある種類またはエラー メッセージの例を次に示します。

Write on "https://storageaccount.blob.core.windows.net/container/BackupAzurefile.bak" failed: Backup to URL received an exception from the remote endpoint. Exception Message: Unable to read data from the transport connection: The connection was closed.
A nonrecoverable I/O error occurred on file "https://storageaccount.blob.core.windows.net/container/BackupAzurefile.bak:" Error could not be gathered from Remote Endpoint.

Msg 3013, Level 16, State 1, Line 2

BACKUP DATABASE is terminating abnormally.
BackupIoRequest::ReportIoError: write failure on backup device https://storageaccount.blob.core.windows.net/container/BackupAzurefile.bak'. Operating system error Backup to URL received an exception from the remote endpoint. Exception Message: Unable to read data from the transport connection: The connection was closed.

ページ BLOB を使用する場合、トレース フラグ 3051 を使用して詳細ログを有効にすると、ログに次のメッセージが表示される場合もあります。HTTP status code 502, HTTP Status Message Proxy Error (The number of HTTP requests per minute exceeded the configured limit. Contact your ISA Server administrator.)

選択されていない既定のプロキシ設定:

場合によっては、既定の設定が選択されないことで、次のようなプロキシ認証エラーが発生します。

A nonrecoverable I/O error occurred on file "https://storageaccount.blob.core.windows.net/container/BackupAzurefile.bak:" Backup to URL received an exception from the remote endpoint. Exception Message: The remote server returned an error: (407)* **Proxy Authentication Required.

この問題を解決するには、次の手順に従って、Backup to URL プロセスで既定のプロキシ設定を使用できるようにするための構成ファイルを作成します。

  1. 次の xml コンテンツを使用して、BackuptoURL.exe.config という名前の構成ファイルを作成します。

    <?xml version ="1.0"?>
    <configuration>
        <system.net>
            <defaultProxy enabled="true" useDefaultCredentials="true">
                <proxy usesystemdefault="true" />
            </defaultProxy>
        </system.net>
    </configuration>
    
  2. SQL Server インスタンスの Binn フォルダーに構成ファイルを置きます。 たとえば、MySQL サーバーがコンピューターの Cドライブにインストールされている場合は、構成ファイルをC:\Program Files\Microsoft SQL Server\MSSQL13.\<InstanceName>\MSSQL\Binnに置きます。

  3. BackuptoURL.exeSAS キーを使用するときに呼び出されませんが、アクセス キーを使用するとトリガーされます。 アクセス キーを使用してください。そうでない場合は、次のエラーが表示される可能性があります。

    オペレーティング システム エラー 50 (要求はサポートされていません。)

一般的なエラーと解決

問題 解決策
エラー 3063: Write to backup block blob device failed (バックアップ ブロック BLOB デバイス https://storageaccount/container/name.bak に書き込めませんでした)。 デバイスで許可されているブロック数の上限に達しました。 この問題を解決するには、バックアップ ターゲットを複数のファイルでストライピングし、バックアップ コマンドで次のパラメーターを必ず使用してください: COMPRESSION, MAXTRANSFERSIZE = 4194304, BLOCKSIZE = 65536
エラー 3035: Differential backup fails for one or multiple databases (1 つまたは複数のデータベースの差分バックアップが失敗します)。 この状況は、SQL データベースまたは仮想マシン (VM) スナップショットをバックアップするように Azure Backup サービスを構成した場合に発生します。この構成ではコピーのみのバックアップが実行されないため、メンテナンス プランまたは SQL Agent ジョブ オンデマンド バックアップは失敗します。 これを修正するには、レジストリ キー [HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\BCDRAGENT] で SQL Server インスタンスをホストしている VM にこれらのレジストリ キーを追加し、"USEVSSCOPYBACKUP"="TRUE" を追加します。
エラー 3201: オペレーティング システム エラー 50 (要求がサポートされない) でバックアップが失敗します。 Storage Explorer を使用して Shared Access Signature (SAS) トークンを再生成する: Azure Storage Explorer を使用して新しいポリシーを作成し、そのポリシーを使用して Azure Storage Explorer から新しい SAS トークンを作成できます。 Azure Storage から生成されたこの新しい SAS トークンを使って資格証明を再作成し、再度バックアップを試みます。 詳細については、「BACKUP TO URL に関する既知の問題」を参照してください。 ネットワーク セキュリティ グループ (NSG) またはファイアウォールで、ポート 1433 と 443 への受信および送信接続が許可されていることを確認します。
エラー 3271: TLS のエラー (Backup to URL はリモート エンドポイントから例外を受け取りました) が原因で、バックアップに失敗しました。 これは、SQL Server バージョン 2012、2014、および 2016 で発生する可能性があります。 Microsoft Azure Blob Storage サービスの URL へのバックアップは TLS 1.2 と互換性がありません。KB4017023 の手順に従うことで修正できます。
エラー 3271: Backup to URL received an exception from the remote endpoint (URL へのバックアップがリモート エンドポイントから例外を受け取りました)。 例外メッセージ: リモート名を解決できませんでした。 このメッセージは、バックアップの構成に正しくない資格情報、シークレット、または SAS キーが使用された場合に表示されます。 資格情報を削除して再作成します。 SQL 2012 または 2014 の場合はストレージ アカウント ID とアクセス キーを使用し、SQL 2016 以降のバージョンの場合は SAS を使用します。
エラー 18210: 例外: リモート サーバーがエラーを返しました: (400) 無効な要求。 ストレージ アカウントの最小 TLS バージョンを 1.0 に変更するか (ストレージ アカウント>構成>TLS の最小バージョン)、KB4017023 に記載されているように強力な暗号化を有効にして、これを解決することができます。
例外メッセージ: リモート サーバーからエラーが返されました: (412) 現在 BLOB にリースがありますが、要求にリース ID が指定されていません。 Storage Explorer でサイズが 1 TB の BLOB を特定し、リースの中断、BLOB の削除、バックアップ操作の再試行を行います。
エラー: リモート サーバーがエラーを返しました: (403) 許可されていません。 ストレージ アカウント、資格情報、SAS トークンを再作成すると、問題が解決します。
SQL 2012 または 2014 では、1 TB データベースのバックアップが失敗します。 1 TB のバックアップは、SQL Server 2016 (13.x) より前のページ BLOB の既知の制限です。 T-SQL バックアップ ステートメントに "WITH COMPRESSION" 句を追加するか、SQL Server インスタンスを SQL Server 2016 (13.x) 以降のバージョンにアップグレードして、バックアップ圧縮を使用します。
エラー: Backup to URL received an exception from the remote endpoint (URL へのバックアップがリモート エンドポイントから例外を受け取りました)。 例外メッセージ: リモート サーバーからエラーが返されました: (416) 指定されたページ範囲は無効です。 これは、SQL Server 2012 (11.x) または SQL Server 2014 (12.x) を使用していて、バックアップ サイズが 1 TB に増加した場合に表示される可能性があります。 バックアップ ファイルをストライピングするか、バックアップ圧縮を使用して解決します。
メンテナンス プランを使用しているときにバックアップに失敗しました。 メンテナンス プランにはいくつかのバグがあります。 T-SQL を使用してバックアップを実行してみてください。 T-SQL が機能する場合は、データベースをバックアップするために実行する SQL Agent ジョブを作成できます。
VM の制限に達したため、バックアップに失敗しました。 ディスク IOPS または VM の制限に達したというエラーが発生している場合は、バックアップの速度が低下したり、失敗したりする可能性があります。 IOPS または VM の制限を監視するには、Azure Monitor メトリックを使用し、必要に応じて VM またはディスクのサイズを変更して問題を解決します。
リモート サーバーがエラーを返しました: (409) SQL Server 2012/2014 の競合" 階層型名前空間を持つストレージ アカウントは、ページ BLOB ではなくブロック BLOB 用に装備されています。 この機能のないストレージ アカウントは、SQL Server 2014 (12.x) の BACKUP TO URL には使用しないでください。