Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
S’applique à :SQL Server
Lorsque vous sauvegardez ou restaurez à partir du stockage Microsoft Azure, SQL Server acquiert un bail infini pour verrouiller l’accès exclusif à l’objet blob. Une fois le processus de sauvegarde ou de restauration terminé, le processus libère le bail. Si une sauvegarde ou une restauration échoue, le processus de sauvegarde tente de nettoyer les objets blob non valides. Toutefois, si une défaillance de connectivité réseau prolongée ou soutenue entraîne l'échec de la sauvegarde, le processus de sauvegarde peut ne pas être en mesure d’accéder à l’objet blob, le laissant potentiellement orphelin. Cette condition signifie que l’objet blob ne peut pas être écrit ou supprimé tant que le bail n’est pas libéré. Cet article explique comment libérer (interrompre) le bail et supprimer le blob.
Pour plus d’informations, consultez Bail Blob (API REST).
Si l’opération de sauvegarde échoue, elle peut générer un fichier de sauvegarde non valide. Le fichier de sauvegarde d'objet blob peut également avoir un bail actif, ce qui empêche sa suppression ou son remplacement. Pour supprimer ou remplacer ces objets blob, commencez par libérer (interrompre) le bail. Si des échecs de sauvegarde se produisent, nettoyez les baux et supprimez les blobs. Vous pouvez également périodiquement nettoyer les baux et supprimer les objets blob comme partie de vos tâches de gestion du stockage.
Si un échec de restauration se produit, les restaurations suivantes ne sont pas bloquées. Par conséquent, le bail actif peut ne pas être un problème. Vous devez uniquement interrompre le bail lorsque vous devez remplacer ou supprimer l’objet blob.
Gérer les objets blob orphelins
Les étapes décrites dans cette section décrivent comment nettoyer après l’échec de l’activité de sauvegarde ou de restauration à l’aide de PowerShell.
Identifiez les objets blob avec 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 utiliser cet échec pour nettoyer les objets blob. Vous pouvez également utiliser les propriétés
LeaseStatsetLeastStatepour identifier les objets blob avec des baux. Après avoir identifié les objets blob, passez en revue la liste et vérifiez la validité du fichier de sauvegarde avant de supprimer l’objet blob.Résiliation du bail : une demande autorisée peut résilier le bail sans fournir d’ID de bail. Pour plus d’informations, consultez Blob de location.
Conseil
SQL Server utilise un ID de bail pour établir un accès exclusif pendant l’opération de restauration. L'ID de bail de la restauration est BAC2BAC2BAC2BAC2BAC2BAC2BAC2BAC2.
Supprimez l’objet blob : Pour supprimer un objet blob ayant un bail actif, commencez par rompre le bail.
Exemple de script PowerShell
Important
Si vous exécutez PowerShell 2.0, vous pouvez rencontrer des problèmes lors du chargement de l’assembly Microsoft WindowsAzure.Storage.dll. Mettez à niveau PowerShell pour résoudre le problème. Vous pouvez également utiliser la solution de contournement suivante pour créer ou modifier le fichier powershell.exe.config pour charger les assemblys .NET 2.0 et .NET 4.0 au moment de l’exécution :
<?xml version="1.0"?>
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0.30319"/>
<supportedRuntime version="v2.0.50727"/>
</startup>
</configuration>
L’exemple de script suivant identifie les objets blob avec des baux actifs, puis résilie ces baux. Le texte montre également comment filtrer les identificateurs de bail pour des versions spécifiques.
Conseils pour l’exécution de ce script
Avertissement
Si une sauvegarde vers 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 simultanément. Exécutez ce script au cours d’une fenêtre de maintenance ou quand aucune sauvegarde n’est en cours d’exécution ou prévue.
Avant d’exécuter ce script, ajoutez des valeurs pour le compte de stockage, la clé de stockage, le conteneur et les paramètres de chemin et de nom de l'assembly de stockage Azure. Le chemin d’accès de l’assembly de stockage 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.
S’il n’existe aucun objet blob avec des baux verrouillés, le message suivant s’affiche :
There are no blobs with locked lease statusS’il existe des objets blob avec des baux verrouillés, vous voyez les messages suivants :
Breaking Leases,The lease on <URL of the Blob> is a restore lease: You will see this message only if you have a blob with a restore lease that is still active.etThe lease on <URL of the Blob> is not a restore lease Breaking lease on <URL of the Bob>.
$storageAccount = "<myStorageAccount>"
$storageKey = "<myStorageKey>"
$blobContainer = "<myBlobContainer>"
$storageAssemblyPathName = "<myStorageAssemblyPathName>"
# 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($storageAssemblyPathName)
[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
$blobs = $container.ListBlobs($null,$true)
# filter blobs that are have Lease Status as "locked"
$lockedBlobs = @()
foreach($blob in $blobs)
{
$blobProperties = $blob.Properties
if($blobProperties.LeaseStatus -eq "Locked")
{
$lockedBlobs += $blob
}
}
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
}
} else { Write-Host " There are no blobs with locked lease status." }
Voir aussi
Bonnes pratiques et résolution des problèmes liés à la sauvegarde SQL Server vers une URL