Partager via


Suppression des fichiers de sauvegarde Blob avec des baux encore actifs

Lors de la sauvegarde ou de la restauration à partir du stockage Azure, SQL Server acquiert un bail infini afin de verrouiller l’accès exclusif à l’objet blob. Une fois le processus de sauvegarde ou de restauration terminé, le bail est libéré. Si une sauvegarde ou une restauration échoue, le processus de sauvegarde tente de nettoyer tout objet blob non valide. Toutefois, si la sauvegarde échoue en raison d’un échec de connectivité réseau prolongée ou soutenue, le processus de sauvegarde peut ne pas être en mesure d’accéder à l’objet blob et l’objet blob peut rester orphelin. Cela signifie que l’objet blob ne peut pas être écrit ou supprimé tant que le bail n’est pas libéré. Cette rubrique explique comment libérer le bail et supprimer l’objet blob.

Pour plus d’informations sur les types de baux, lisez cet article.

Si l’opération de sauvegarde échoue, elle peut entraîner un fichier de sauvegarde qui n’est pas valide. Le fichier blob de sauvegarde peut également avoir un bail actif, ce qui l’empêche d’être supprimé ou remplacé. Pour supprimer ou remplacer ces objets blob, le bail doit d’abord être rompu. S’il existe des échecs de sauvegarde, nous vous recommandons de nettoyer les baux et de supprimer des objets blob. Vous pouvez également choisir de nettoyer régulièrement dans le cadre des tâches de gestion du stockage.

En cas d’échec de restauration, les restaurations suivantes ne sont pas bloquées, et par conséquent, le bail actif n’est peut-être pas un problème. La rupture du bail n’est nécessaire que lorsque vous devez remplacer ou supprimer l’objet blob.

Gestion des objets blob orphelins

Les étapes suivantes décrivent comment nettoyer après l’échec de l’activité de sauvegarde ou de restauration. Toutes les étapes peuvent être effectuées à l’aide de scripts PowerShell. Un exemple de code est fourni dans la section suivante :

  1. Identification des objets blob qui ont des baux : Si vous avez un script ou un processus qui exécute les processus de sauvegarde, vous pouvez peut-être capturer l’échec dans le script ou le processus et l’utiliser pour nettoyer les objets blob. Vous pouvez également utiliser les propriétés LeaseStats et LeastState pour identifier les objets blob qui ont des baux sur eux. Une fois que vous avez identifié les objets blob, nous vous recommandons de passer en revue la liste, de vérifier la validité du fichier de sauvegarde avant de supprimer l’objet blob.

  2. Rupture du bail : Une demande autorisée peut interrompre le bail sans fournir d’ID de bail. Pour plus d’informations, consultez ici.

    Conseil / Astuce

    SQL Server émet un ID de bail pour établir un accès exclusif pendant l’opération de restauration. L’ID de bail de restauration est BAC2BAC2BAC2BAC2BAC2BAC2BAC2BAC2.

  3. Suppression de l’objet blob : Pour supprimer un objet blob disposant d’un bail actif, vous devez d’abord interrompre le bail.

Exemple de script PowerShell

**Important** Si vous exécutez PowerShell 2.0, vous pouvez rencontrer des problèmes de chargement de l’assembly Microsoft WindowsAzure.Storage.dll. Nous vous recommandons de procéder à la mise à niveau vers PowerShell 3.0 pour résoudre le problème. Vous pouvez également utiliser la solution de contournement suivante pour PowerShell 2.0 :

  • Créez ou modifiez le fichier powershell.exe.config pour charger les assemblys .NET 2.0 et .NET 4.0 au moment de l’exécution avec les éléments suivants :

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

L’exemple suivant illustre l’identification des objets blob qui ont des baux actifs, puis de les résilier. L’exemple montre également comment filtrer les ID de bail de mise en production.

Conseils sur l’exécution de ce script

Avertissement

Si une sauvegarde vers le service stockage Blob Azure s’exécute en même temps que ce script, la sauvegarde peut échouer, car ce script interrompt le bail que la sauvegarde tente d’acquérir en même temps. Nous vous recommandons d’exécuter ce script pendant une fenêtre de maintenance ou lorsqu’aucune sauvegarde n’est censée s’exécuter.

  1. Lorsque vous exécutez ce script, vous êtes invité à fournir des valeurs pour le compte de stockage, la clé de stockage, le conteneur et les paramètres de nom et chemin d’accès de l’assembly de stockage Azure. Le chemin d’accès du stockage est l’assembly est le répertoire d’installation de l’instance de SQL Server. Le nom de fichier de l’assembly de stockage est Microsoft.WindowsAzure.Storage.dll. Voici un exemple des invites à saisir et des valeurs saisies :

    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. S’il n’y a pas d’objets blob qui ont des baux verrouillés, vous devez voir le message suivant :

    Il n’existe aucun blob avec un bail verrouillé

    S’il existe des objets blob avec des baux verrouillés, vous devez voir les messages suivants :

    Résiliation de baux

    Le bail sur <l’URL de l’objet blob> est un bail de restauration : ce message s’affiche uniquement si vous avez un objet blob avec un bail de restauration qui est toujours actif.

    Le bail sur <l’URL de l’objet blob> n’est pas un bail de restauration cassé sur <l’URL de l’objet blob>.

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  
    }  
}

Voir aussi

Meilleures pratiques et résolution des problèmes liés à la sauvegarde SQL Server vers l’URL