Eliminare i file BLOB di backup con lease attiviDelete backup blob files with active leases

Quando si esegue il backup nell'archiviazione di Microsoft Azure o il ripristino dallo stesso, tramite SQL Server viene acquisito un lease infinito per bloccare l'accesso esclusivo al BLOB.When backing up to or restoring from Microsoft Azure storage, SQL Server acquires an infinite lease to lock exclusive access to the blob. Quando il processo di backup o ripristino viene completato correttamente, il lease viene rilasciato.When the backup or restore process is successfully completed, the lease is released. Se il backup o il ripristino non viene completato, il processo di backup tenta di eliminare i BLOB non validi.If a backup or restore fails, the backup process attempts to clean up any invalid blobs. Tuttavia, se il backup non viene completato a causa di un problema di connettività di rete che persiste nel tempo, è possibile che il processo di backup non sia in grado di accedere al BLOB e che quindi quest'ultimo rimanga orfano.However, if the backup fails due to prolonged or sustained network connectivity failure, the backup process may not be able gain access to the blob and the blob may remain orphaned. Di conseguenza, il BLOB non può essere scritto o eliminato finché il lease non viene rilasciato.This means the blob cannot be written to or deleted until the lease is released. In questo argomento viene descritto come rilasciare (interrompere) il lease ed eliminare il BLOB.This topic describes how to release (break) the lease and delete the blob.

Per altre informazioni sui tipi di lease, leggere questo articolo.For more information on lease types, read this article.

Il mancato completamento dell'operazione di backup potrebbe generare un file di backup non valido.If the backup operation fails, it can result in an invalid backup file. Anche nel file BLOB di backup potrebbe essere presente un lease attivo, impedendone l'eliminazione o la sovrascrittura.The backup blob file might also have an active lease, preventing it from being deleted or overwritten. Per eliminare o sovrascrivere questi BLOB, il lease deve innanzitutto essere rilasciato (interrotto).To delete or overwrite such blobs, the lease should first be released (broken). Se sono presenti errori di backup, è consigliabile rimuovere i lease ed eliminare i BLOB.If there are backup failures, we recommend that you clean up leases and delete blobs. Periodicamente, è anche possibile rimuovere i lease ed eliminare i BLOB come parte dell'attività di gestione della risorsa di archiviazione.You can also periodically clean up leases and delete blobs as part of your storage management tasks.

Se si verifica un errore di ripristino, i ripristini successivi non vengono bloccati, quindi il lease attivo potrebbe non essere un problema.If there is a restore failure, subsequent restores are not blocked, so active lease may not be an issue. L'interruzione del lease è necessaria solo quando si deve sovrascrivere o eliminare il BLOB.Breaking the lease is only necessary when you have to overwrite or delete the blob.

Gestire i BLOB orfaniManage orphaned blobs

Nei passaggi seguenti viene descritto come effettuare una rimozione dopo un backup non riuscito o un'attività di ripristino.The follow steps describe how to clean up after failed backup or restore activity. È possibile eseguire tutti i passaggi tramite gli script di PowerShell.You can do all the steps using PowerShell scripts. La sezione seguente include un esempio di script di PowerShell:The following section includes an example PowerShell script:

  1. Identificare i BLOB con lease: se si dispone di uno script o un processo in cui vengono eseguiti i processi di backup, è possibile rilevare l'errore nello script o nel processo e usarlo per rimuovere i BLOB.Identify blobs with leases: If you have a script or a process that runs the backup processes, you might be able to capture the failure within the script or process and use that to clean up the blobs. È anche possibile usare le proprietà LeastState e LeaseStats per identificare i BLOB con lease.You can also use the LeaseStats and LeastState properties to identify blobs with leases on them. Dopo aver identificato i BLOB, rivedere l'elenco e verificare la validità del file di backup prima di eliminare il BLOB.Once you have identified the blobs, review the list and verify the validity of the backup file before deleting the blob.

  2. Interrompere il lease: tramite una richiesta autorizzata è possibile interrompere il lease senza specificare un relativo ID.Break the lease: An authorized request can break the lease without supplying a lease ID. Per altre informazioni, fare clic qui .See here for more information.

    Suggerimento

    Tramite SQL Server viene generato un ID lease per stabilire l'accesso esclusivo durante l'operazione di ripristino.SQL Server issues a lease ID to establish exclusive access during the restore operation. L'ID lease di ripristino è BAC2BAC2BAC2BAC2BAC2BAC2BAC2BAC2.The restore lease ID is BAC2BAC2BAC2BAC2BAC2BAC2BAC2BAC2.

  3. Eliminare il BLOB: per eliminare un BLOB con un lease attivo è innanzitutto necessario interrompere il lease.Delete the Blob: To delete a blob with an active lease, you must first break the lease.

Esempio di script di PowerShell PowerShell script example

Importante

Se si esegue PowerShell 2.0 potrebbero verificarsi dei problemi durante il caricamento dell'assembly Microsoft.WindowsAzure.Storage.dll.If you are running PowerShell 2.0, you may have problems loading the Microsoft WindowsAzure.Storage.dll assembly. È consigliabile eseguire l'aggiornamento di Powershell per risolvere il problema.We recommend that you upgrade Powershell to solve the issue. È inoltre possibile utilizzare la soluzione alternativa per PowerShell 2.0:You may also use the following workaround for PowerShell 2.0:

  • Creare o modificare il file powershell.exe.config per caricare gli assembly .NET 2.0 e .NET 4.0 in fase di esecuzione con quanto riportato di seguito:Create or modify the powershell.exe.config file to load .NET 2.0 and .NET 4.0 assemblies at runtime with the following:

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

Lo script di esempio seguente identifica i BLOB con lease attivi e quindi li interrompe.The following example script identifies blobs with active leases and then breaks them. Nell'esempio viene anche descritto come applicare i filtri per gli ID lease di rilascio.The example also demonstrates how filter for release lease IDs.

Suggerimenti per l'esecuzione di questo scriptTips on running this script

Avviso

Se viene eseguito un backup nel servizio di archiviazione BLOB di Microsoft Azure contemporaneamente a questo script, è possibile che il backup non venga completato perché il lease che il backup sta tentando di acquisire viene interrotto.If a backup to the Microsoft Azure Blob storage service is running at the same time as this script, the backup can fail since this script will break the lease that the backup is trying to concurrently acquire. Eseguire questo script durante un periodo di manutenzione o quando non sono in atto esecuzioni di backup.Run this script during a maintenance window or when no backups are running or expected to run.

  1. Quando si esegue questo script, verrà richiesto di fornire valori per l'account e la chiave di archiviazione, il contenitore, nonché per i parametri del percorso e del nome dell'assembly di archiviazione di Azure.When you run this script, you will be prompted to provide values for the storage account, storage key, container, and the azure storage assembly path and name parameters. Il percorso dell'assembly di archiviazione è la directory di installazione dell'istanza di SQL ServerSQL Server.The path of the storage is assembly is the installation directory of the instance of SQL ServerSQL Server. Il nome del file per l'assembly di archiviazione è Microsoft.WindowsAzure.Storage.dll.The file name for the storage assembly is Microsoft.WindowsAzure.Storage.dll. Di seguito è riportato un esempio delle richieste e dei valori immessi:Following is an example of the prompts and values entered:

    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\MSSQL13.MSSQLSERVER\MSSQL\Binn\Microsoft.WindowsAzure.Storage.dll  
    
  2. Se sono presenti BLOB con lease bloccati, dovrebbe essere visualizzato il messaggio seguente:If there are no blobs with locked leases you should see the following message:

    Nessun BLOB con stato lease bloccatoThere are no blobs with locked lease status

    Se sono presenti BLOB con lease bloccati, dovrebbero essere visualizzati i messaggi seguenti:If there are blobs with locked leases, you should see the following messages:

    Interruzione leaseBreaking Leases

    Il lease nell'<URL del BLOB> è un lease di ripristino: questo messaggio verrà visualizzato solo se è presente un BLOB con un lease di ripristino ancora attivo.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.

    Il lease nell'<URL del BLOB> non è un lease di ripristino. Interruzione lease nell'<URL del BOB>.The lease on <URL of the Blob> is not a restore lease Breaking lease on <URL of the Bob>.

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($null,$true) 

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

Vedere ancheSee also

Procedure consigliate e risoluzione dei problemi per il backup di SQL Server nell'URLSQL Server Backup to URL Best Practices and Troubleshooting