次の方法で共有


アクティブなリースを保持しているバックアップ BLOB ファイルの削除

Azure ストレージへのバックアップまたは Azure ストレージからの復元時に、SQL Serverは、BLOB への排他的アクセスをロックするために無限リースを取得します。 バックアップまたは復元プロセスが正常に完了すると、リースは解放されます。 バックアップまたは復元に失敗すると、バックアップ プロセスは無効な BLOB のクリーンアップを試みます。 ただし、長時間のネットワーク接続障害または持続的なネットワーク接続障害が原因でバックアップが失敗した場合、バックアップ プロセスが BLOB にアクセスできず、BLOB が孤立したままになる可能性があります。 つまり、リースが解放されるまで、BLOB を書き込むことも削除することもできません。 このトピックでは、リースを解放する方法と BLOB の削除について説明します。

リースの種類の詳細については、こちらの 記事をご覧ください。

バックアップ操作が失敗すると、無効なバックアップ ファイルが生成されます。 また、バックアップ BLOB ファイルでは、削除や上書きを防ぐためにアクティブなリースを保持する場合もあります。 BLOB を削除または上書きするには、最初にリースを終了する必要があります。バックアップ障害が発生した場合は、リースをクリーンアップして BLOB を削除することをお勧めします。 また、ストレージ管理タスクの一部としてクリーンアップを定期的に選択することもできます。

復元エラーが発生した場合、後続の復元はブロックされないため、アクティブなリースは問題にならないことがあります。 リースを終了する必要があるのは、BLOB を上書きまたは削除する場合だけです。

孤立した BLOB の管理

次の手順では、バックアップ動作または復元動作の失敗後にクリーンアップする方法について説明します。 すべての手順は、PowerShell スクリプトを使用して実行することもできます。 コード例については、次のセクションに示します。

  1. リースを保持している BLOB の識別: バックアップ プロセスを実行するスクリプトまたはプロセスがあると、スクリプトまたはプロセス内のエラーをキャプチャし、それを使用して BLOB をクリーンアップできる場合があります。 また、LeaseStats プロパティと LeastState プロパティを使用して、それらのプロパティに対してリースを保持している BLOB を識別することもできます。 BLOB を識別したら、一覧を確認し、BLOB を削除する前にバックアップ ファイルが有効かどうかを確認することをお勧めします。

  2. リースの終了: 承認された要求では、リース ID を指定せずにリースを終了できます。 詳細については、 こちら をご覧ください。

    ヒント

    SQL Server は、復元操作中にリース ID を発行して排他アクセスを確立します。 復元のリース ID は BAC2BAC2BAC2BAC2BAC2BAC2BAC2BAC2 です。

  3. BLOB の削除: アクティブなリースを保持している BLOB を削除するには、最初にリースを終了する必要があります。

PowerShell スクリプトの例

**大事な** PowerShell 2.0 を実行している場合は、Microsoft WindowsAzure.Storage.dll アセンブリの読み込みに問題が発生する可能性があります。 この問題を解決するには、PowerShell 3.0 にアップグレードすることをお勧めします。 また、PowerShell 2.0 では次の回避策を使用することもできます。

  • 次のスクリプトを使用して実行時に .NET 2.0 アセンブリと .NET 4.0 アセンブリを読み込むように powershell.exe.config ファイルを作成または変更する:

    <?xml version="1.0"?>
    <configuration>
        <startup useLegacyV2RuntimeActivationPolicy="true">
            <supportedRuntime version="v4.0.30319"/>
            <supportedRuntime version="v2.0.50727"/>
        </startup>
    </configuration>
    

次の例は、アクティブなリースを保持している BLOB を識別してから、アクティブなリースを終了する方法を示しています。 この例は、リリースのリース ID をフィルター選択する方法も示します。

このスクリプトの実行に関するヒント

警告

Azure Blob Storage サービスへのバックアップがこのスクリプトと同時に実行されている場合、このスクリプトはバックアップが同時に取得しようとしているリースを中断するため、バックアップが失敗する可能性があります。 このスクリプトは、保守期間中またはバックアップの実行が予期されていないときに実行することをお勧めします。

  1. このスクリプトを実行すると、ストレージ アカウント、ストレージ キー、コンテナー、および Azure ストレージ アセンブリ パスと名前パラメーターの値を指定するように求められます。 ストレージ アセンブリのパスは、 SQL Serverインスタンスのインストール ディレクトリです。 ストレージ アセンブリのファイル名は Microsoft.WindowsAzure.Storage.dll です。 次に、入力するプロンプトと値の例を示します。

    cmdlet  at command pipeline position 1  
    Supply values for the following parameters:  
    storageAccount: mycloudstorageaccount  
    storageKey: 0BopKY7eEha3gBnistYk+904nf  
    blobContainer: mycontainer   
    storageAssemblyPath: C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Binn\Microsoft.WindowsAzure.Storage.dll  
    
  2. リースがロックされている BLOB がない場合は、次のメッセージが表示されます。

    ロックされたリースの状態の BLOB はありません

    リースがロックされている BLOB がある場合は、次のメッセージが表示されます。

    リースを終了しています

    BLOB> の URL の<リースは復元リースです。このメッセージは、まだアクティブな復元リースを持つ BLOB がある場合にのみ表示されます。

    BLOB> の URL の<リースは、Bob> の URL に対<する復元リースの破壊的リースではありません。

param(  
       [Parameter(Mandatory=$true)]  
       [string]$storageAccount,  
       [Parameter(Mandatory=$true)]  
       [string]$storageKey,  
       [Parameter(Mandatory=$true)]  
       [string]$blobContainer,  
       [Parameter(Mandatory=$true)]  
       [string]$storageAssemblyPath  
)  
  
# Well known Restore Lease ID  
$restoreLeaseId = "BAC2BAC2BAC2BAC2BAC2BAC2BAC2BAC2"  
  
# Load the storage assembly without locking the file for the duration of the PowerShell session  
$bytes = [System.IO.File]::ReadAllBytes($storageAssemblyPath)  
[System.Reflection.Assembly]::Load($bytes)  
  
$cred = New-Object 'Microsoft.WindowsAzure.Storage.Auth.StorageCredentials' $storageAccount, $storageKey  
$client = New-Object 'Microsoft.WindowsAzure.Storage.Blob.CloudBlobClient' "https://$storageAccount.blob.core.windows.net", $cred  
$container = $client.GetContainerReference($blobContainer)  
  
#list all the blobs  
$allBlobs = $container.ListBlobs()
  
$lockedBlobs = @()  
# filter blobs that are have Lease Status as "locked"  
foreach($blob in $allBlobs)  
{  
    $blobProperties = $blob.Properties
    if($blobProperties.LeaseStatus -eq "Locked")  
    {  
        $lockedBlobs += $blob  
    }  
}  
  
if ($lockedBlobs.Count -eq 0)  
{
    Write-Host " There are no blobs with locked lease status"  
}

if($lockedBlobs.Count -gt 0)  
{  
    Write-Host "Breaking leases"  
    foreach($blob in $lockedBlobs )
    {  
        try  
        {  
            $blob.AcquireLease($null, $restoreLeaseId, $null, $null, $null)  
            Write-Host "The lease on $($blob.Uri) is a restore lease"  
        }  
        catch [Microsoft.WindowsAzure.Storage.StorageException]  
        {  
            if($_.Exception.RequestInformation.HttpStatusCode -eq 409)  
            {  
                Write-Host "The lease on $($blob.Uri) is not a restore lease"  
            }  
        }  
  
        Write-Host "Breaking lease on $($blob.Uri)"  
        $blob.BreakLease($(New-TimeSpan), $null, $null, $null) | Out-Null  
    }  
}

関連項目

SQL Server Backup to URL に関するベスト プラクティスとトラブルシューティング