Partilhar via


Excluir arquivos de blob de backup com concessões ativas

Aplica-se a:SQL Server

Ao fazer backup ou restaurar a partir do armazenamento do Microsoft Azure, o SQL Server adquire uma concessão infinita para bloquear o acesso exclusivo ao blob. Quando o processo de backup ou restauração é concluído com êxito, a concessão é liberada. Se um backup ou restauração falhar, o processo de backup tentará limpar todos os blobs inválidos. No entanto, se o backup falhar devido a uma falha de conectividade de rede prolongada ou sustentada, o processo de backup pode não ser capaz de obter acesso ao blob e o blob pode permanecer órfão. Isso significa que o blob não pode ser gravado ou excluído até que a concessão seja liberada. Este tópico descreve como interromper (anular) a concessão de arrendamento e apagar o blob.

Para obter mais informações sobre tipos de locação, leia este artigo .

Se a operação de backup falhar, isso pode resultar em um arquivo de backup inválido. O arquivo de blob de backup também pode ter uma concessão ativa, impedindo que ele seja excluído ou substituído. Para excluir ou substituir esses blobs, a concessão deve primeiro ser anulada (cancelada). Se houver falhas de backup, recomendamos que limpe os leases e elimine os blobs. Você também pode limpar periodicamente alugueres e excluir blobs como parte das suas tarefas de gestão de armazenamento.

Se houver uma falha de restauração, as restaurações subsequentes não serão bloqueadas, portanto, a locação ativa pode não ser um problema. Encerramento da concessão só é necessário quando tens que substituir ou eliminar o blob.

Gerenciar blobs órfãos

As etapas a seguir descrevem como limpar após falha na atividade de backup ou restauração. Você pode executar todas as etapas usando scripts do PowerShell. A seção a seguir inclui um exemplo de script do PowerShell:

  1. Identificar blobs com concessão: Se você tiver um script ou um processo que execute os processos de backup, poderá capturar a falha dentro do script ou processo e usá-la para limpar os blobs. Você também pode usar as propriedades LeaseStats e LeastState para identificar blobs com concessões neles. Depois de identificar os blobs, revise a lista e verifique a validade do arquivo de backup antes de excluir o blob.

  2. Rescindir o contrato de arrendamento: Um pedido autorizado pode rescindir o contrato de arrendamento sem fornecer um ID de contrato. Consulte aqui para obter mais informações.

    Dica

    O SQL Server emite uma ID de concessão para estabelecer acesso exclusivo durante a operação de restauração. O ID de concessão de restauro é BAC2BAC2BAC2BAC2BAC2BAC2BAC2BAC2.

  3. Excluir o Blob: Para excluir um blob com uma concessão ativa, você deve primeiro quebrar a concessão.

Exemplo de script do PowerShell

Importante

Se você estiver executando o PowerShell 2.0, você pode ter problemas para carregar o assembly do Microsoft WindowsAzure.Storage.dll. Recomendamos que você atualize Powershell para resolver o problema. Você também pode usar a seguinte solução alternativa para criar ou modificar o arquivo powershell.exe.config para carregar assemblies .NET 2.0 e .NET 4.0 em tempo de execução com o seguinte:

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

O script de exemplo a seguir identifica blobs com arrendamentos ativos e, em seguida, cancela-os. O exemplo também demonstra como filtrar IDs de concessão de versão.

Dicas sobre como executar este script

Advertência

Se um backup para o Armazenamento de Blobs do Azure estiver sendo executado ao mesmo tempo que esse script, o backup poderá falhar, pois esse script quebrará a concessão que o backup está tentando adquirir simultaneamente. Execute esse script durante uma janela de manutenção ou quando nenhum backup estiver em execução ou for esperado que seja executado.

  • Antes de executar esse script, você deve adicionar valores para a conta de armazenamento, a chave de armazenamento, o contêiner e os parâmetros de caminho e nome do assembly de armazenamento do Azure. O caminho de armazenamento é o diretório de instalação da instância do SQL Server. O nome do ficheiro para o conjunto de armazenamento é Microsoft.WindowsAzure.Storage.dll.

  • Se não houver blobs com concessões bloqueadas, você verá a seguinte mensagem: There are no blobs with locked lease status

  • Se houver blobs com concessões bloqueadas, você verá as seguintes mensagens: 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.e The 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($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  
$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." }

Ver também

Práticas Recomendadas de Backup do SQL Server para URL e Resolução de Problemas