Condividi tramite


Eliminazione dei file BLOB di backup con contratti di locazione attivi

Quando si esegue il backup o il ripristino dall'archiviazione di Azure, SQL Server acquisisce un contratto di locazione infinito per garantire l'accesso esclusivo al blob. Quando il processo di backup o ripristino viene completato correttamente, il lease viene rilasciato. Se un backup o un ripristino non riesce, il processo di backup tenta di pulire qualsiasi BLOB non valido. 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. Ciò significa che il BLOB non può essere scritto o eliminato fino al rilascio del lease. Questo argomento descrive come rilasciare il lease ed eliminare il BLOB.

Per altre informazioni sui tipi di lease, vedere questo articolo.

Se l'operazione di backup non riesce, può comportare un file di backup non valido. Anche nel file BLOB di backup potrebbe essere presente un lease attivo, impedendone l'eliminazione o la sovrascrittura. Per eliminare o sovrascrivere tali BLOB, il contratto di locazione deve essere prima interrotto. In caso di errori di backup, è consigliabile liberare i contratti di locazione ed eliminare i BLOB. È anche possibile scegliere periodicamente la pulizia come parte delle attività di gestione dell'archiviazione.

Se si verifica un errore di ripristino, i ripristini successivi non vengono bloccati e pertanto il lease attivo potrebbe non essere un problema. L'interruzione del lease è necessaria solo quando si deve sovrascrivere o eliminare il blob.

Gestione dei BLOB orfani

Nei passaggi seguenti viene descritto come effettuare una rimozione dopo un backup non riuscito o un'attività di ripristino. Tutti i passaggi possono essere eseguiti usando gli script di PowerShell. Nella sezione seguente viene fornito un esempio di codice:

  1. Identificazione di BLOB con lease: Se si dispone di uno script o di un processo che esegue i processi di backup, potrebbe essere possibile rilevare l'errore all'interno dello script o del processo e utilizzarlo per eliminare i BLOB. È anche possibile usare le proprietà LeaseStats e LeastState per identificare i BLOB con lease. Dopo aver identificato i BLOB, è consigliabile esaminare l'elenco, verificare la validità del file di backup prima di eliminare il BLOB.

  2. Interruzione del lease: Una richiesta autorizzata può interrompere il lease senza fornire un ID lease. Per altre informazioni, vedere qui.

    Suggerimento

    Tramite SQL Server viene generato un ID lease per stabilire l'accesso esclusivo durante l'operazione di ripristino. L'ID lease di ripristino è BAC2BAC2BAC2BAC2BAC2BAC2BAC2BAC2.

  3. Eliminazione del BLOB: Per eliminare un BLOB con un lease attivo, è necessario prima interrompere il lease.

Esempio di script di PowerShell

**Importante** Se si esegue PowerShell 2.0, è possibile che si verifichino problemi durante il caricamento dell'assembly di Microsoft WindowsAzure.Storage.dll. È consigliabile eseguire l'aggiornamento a PowerShell 3.0 per risolvere il problema. È anche possibile usare la soluzione alternativa seguente per 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 segue:

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

L'esempio seguente illustra l'identificazione dei Blob che hanno lease attivi e quindi l'interruzione. Nell'esempio viene anche dimostrato come filtrare per gli ID di rilascio del lease.

Suggerimenti per l'esecuzione di questo script

Avvertimento

Se un backup nel servizio di archiviazione BLOB di Azure è in esecuzione contemporaneamente a questo script, il backup può non riuscire perché questo script interromperà il lease che il backup sta tentando di acquisire contemporaneamente. È consigliabile eseguire questo script durante una finestra di manutenzione o quando non è previsto alcun backup.

  1. Quando si esegue questo script, verrà richiesto di specificare i valori per l'account di archiviazione, la chiave di archiviazione, il contenitore e i parametri del nome e del percorso dell'assembly di archiviazione di Azure. Il percorso dell'assemblaggio di archiviazione è la directory di installazione dell'istanza di SQL Server. Il nome del file per l'assembly di archiviazione è Microsoft.WindowsAzure.Storage.dll. Di seguito è riportato un esempio dei prompt e dei valori immessi:

    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. Se non sono presenti BLOB con lease bloccati, verrà visualizzato il messaggio seguente:

    Non sono presenti blob con stato di lease bloccato

    Se sono presenti blob con lease bloccate, verranno visualizzati i messaggi seguenti:

    Rottura dei contratti di locazione

    Il lease sull'URL <del BLOB> è un lease di ripristino: questo messaggio verrà visualizzato solo se si dispone di un BLOB con un lease di ripristino ancora attivo.

    Il lease sull'URL <del BLOB> non è un lease di ripristino. Interruzione del lease sull'URL <del 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  
    }  
}

Vedere anche

Procedure consigliate e risoluzione dei problemi per il backup di SQL Server nell'URL