Eliminazione dei file BLOB di backup con lease attiviDeleting Backup Blob Files with Active Leases

Quando si esegue il backup nell'archiviazione di Windows 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 Windows Azure storage, SQL Server acquires an infinite lease in order 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 blob. 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 that the blob cannot be written to or deleted until the lease is released. In questo argomento viene descritto come rilasciare il lease ed eliminare il BLOB.This topic describes how to release the lease and deleting the blob..

Per altre informazioni sui tipi di lease, leggere questo articolo.For more information on the types of leases, 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 a backup file that is not valid. 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, è innanzitutto necessario interrompere il lease. Se si verificano errori di backup, è consigliabile rimuovere i lease ed eliminare i BLOB.In order to delete or overwrite such blobs, the lease should first be broken.If there are backup failures, we recommend that you clean up leases and delete blobs. È inoltre possibile scegliere di effettuare rimozioni periodiche come parte delle attività di gestione della memoria.You can also choose cleanup periodically as part of storage management tasks.

Se si verifica un errore di ripristino, i ripristini successivi non vengono bloccati e pertanto il lease attivo potrebbe non essere un problema.If there is a restore failure, subsequent restores are not blocked, and therefore the 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.

Gestione dei BLOB orfaniManaging 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. Tutti i passaggi possono essere effettuati utilizzando gli script di PowerShell.All the steps can be done using PowerShell scripts. Nella sezione seguente è disponibile un esempio di codice:A code example is provided in the following section:

  1. Identificazione di 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.Identifying blobs that have 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. È inoltre possibile utilizzare le proprietà LeastState e LeaseStats per identificare i BLOB con lease.You can also use the LeaseStats and LeastState properties to identify the blobs that have leases on them. Dopo aver identificato i BLOB, è consigliabile rivedere l'elenco e verificare la validità del file di backup prima di eliminare il BLOB.Once you have identified the blobs, we recommend that you review the list, verify the validity of the backup file before deleting the blob.

  2. Interruzione del lease: tramite una richiesta autorizzata è possibile interrompere il lease senza specificare un relativo ID.Breaking 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. Eliminazione del BLOB: per eliminare un BLOB con un lease attivo è innanzitutto necessario interrompere il lease.Deleting the Blob: To delete a blob that has 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 effettuare l'aggiornamento a 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>  
    

Nell'esempio seguente vengono illustrate l'identificazione dei BLOB con lease attivi e la relativa interruzione.The following example illustrates identifying blobs that have active leases and then breaking 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 Windows 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 Windows 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 acquire at the same time. È consigliabile eseguire questo script durante un periodo di manutenzione o quando non sono previste esecuzioni di backup.We recommend running this script during a maintenance windows or when no backups are 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 Windows Azure.When you run this script, you will be prompted to provide values for the storage account, storage key, container, and the windows 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 non è presente alcun BLOB con lease bloccati, dovrebbe essere visualizzato il messaggio seguente:If there are no blobs that have 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()   

$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