Excluir arquivos de blob de backup com concessões ativasDelete backup blob files with active leases

APLICA-SE A: simSQL Server nãoBanco de Dados SQL do Azure nãoSQL Data Warehouse do Azure nãoParallel Data Warehouse APPLIES TO: yesSQL Server noAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Ao fazer backup para o armazenamento do Microsoft Azure ou restaurar nele, o SQL Server adquirirá uma concessão infinita para bloquear o acesso exclusivo ao 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 o processo de backup ou restauração for concluído com êxito, a concessão será liberada.When the backup or restore process is successfully completed, the lease is released. Se um backup ou uma restauração falhar, o processo de backup tentará limpar qualquer blob inválido.If a backup or restore fails, the backup process attempts to clean up any invalid blobs. Entretanto, se o backup falhar devido a uma falha de conectividade de rede prolongada ou contínua, o processo de backup pode não ser capaz de obter acesso ao blob e o blob pode permanecer órfão.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. Isso significa que o blob não poderá ser gravado ou excluído até que a concessão seja liberada.This means the blob cannot be written to or deleted until the lease is released. Este tópico descreve como liberar (interromper) a concessão e excluir o blob.This topic describes how to release (break) the lease and delete the blob.

Para obter mais informações sobre tipos de concessão, leia este artigo.For more information on lease types, read this article.

Se a operação de backup falhar, o resultado poderá ser um arquivo de backup inválido.If the backup operation fails, it can result in an invalid backup file. O arquivo de blob de backup pode ter também uma concessão ativa, impedindo que ele seja excluído ou substituído.The backup blob file might also have an active lease, preventing it from being deleted or overwritten. Para excluir ou substituir esses blobs, primeiro a concessão deve ser liberada (interrompida).To delete or overwrite such blobs, the lease should first be released (broken). Se houver falhas de backup, recomendamos que você limpe as concessões e exclua os blobs.If there are backup failures, we recommend that you clean up leases and delete blobs. Você também pode limpar as concessões e excluir os blobs periodicamente como parte de suas tarefas de gerenciamento de armazenamento.You can also periodically clean up leases and delete blobs as part of your storage management tasks.

Se houver uma falha na restauração, as próximas restaurações não serão bloqueadas, portanto, talvez não haja problemas com a concessão ativa.If there is a restore failure, subsequent restores are not blocked, so active lease may not be an issue. A interrupção da concessão só é necessária quando você precisa substituir ou excluir o blob.Breaking the lease is only necessary when you have to overwrite or delete the blob.

Gerenciar blobs órfãosManage orphaned blobs

As etapas a seguir descrevem como efetuar a limpeza após uma atividade de restauração ou backup com falha.The follow steps describe how to clean up after failed backup or restore activity. Você pode realizar todas as etapas usando scripts do PowerShell.You can do all the steps using PowerShell scripts. A seção a seguir inclui um exemplo de script do PowerShell:The following section includes an example PowerShell script:

  1. Identificar blobs com concessões: Se houver um script ou um processo que execute os processos de backup, você poderá capturar a falha no script ou no processo e usá-la para limpar os blobs.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. Você também pode usar o LeaseStats e as propriedades do LeastState para identificar blobs que contêm concessões.You can also use the LeaseStats and LeastState properties to identify blobs with leases on them. Depois de ter identificado os blobs, examine a lista e verifique a validade do arquivo de backup antes de excluir o blob.Once you have identified the blobs, review the list and verify the validity of the backup file before deleting the blob.

  2. Interromper a concessão: Uma solicitação autorizada pode interromper a concessão sem fornecer uma ID de concessão.Break the lease: An authorized request can break the lease without supplying a lease ID. Consulte aqui para obter mais informações.See here for more information.

    Dica

    O SQL Server emite uma ID de concessão para estabelecer o acesso exclusivo durante a operação de restauração.SQL Server issues a lease ID to establish exclusive access during the restore operation. A ID de concessão da restauração é BAC2BAC2BAC2BAC2BAC2BAC2BAC2BAC2.The restore lease ID is BAC2BAC2BAC2BAC2BAC2BAC2BAC2BAC2.

  3. Excluir o Blob: Para excluir um blob com uma concessão ativa, primeiro, é necessário interromper a concessão.Delete the Blob: To delete a blob with an active lease, you must first break the lease.

Somos todos ouvidos: Se você encontrar algo desatualizado ou incorreto neste artigo, como uma etapa ou um exemplo de código, informe-nos.We are listening: If you find something outdated or incorrect in this article, such as a step or a code example, please tell us. Você pode clicar no botão Esta página na seção Comentários na parte inferior desta página.You can click the This page button in the Feedback section at the bottom of this page. Lemos todos os itens de comentários sobre o SQL, normalmente no dia seguinte.We read every item of feedback about SQL, typically the next day. Obrigado.Thanks.

Exemplo de script do PowerShellPowerShell script example

Importante

Se você estiver executando o PowerShell 2.0, você poderá ter problemas ao carregar o assembly do Microsoft WindowsAzure.Storage.dll.If you are running PowerShell 2.0, you may have problems loading the Microsoft WindowsAzure.Storage.dll assembly. Recomendamos que você atualize o Powershell para solucionar o problema.We recommend that you upgrade Powershell to solve the issue. Use também a seguinte solução alternativa para criar ou modificar o arquivo powershell.exe.config para carregar os assemblies do.NET 2.0 e do.NET 4.0 em runtime com o seguinte:You can also use the following workaround to 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>  

O script de exemplo a seguir identifica os blobs com concessões ativas e, em seguida, os interrompe.The following example script identifies blobs with active leases and then breaks them. O exemplo também demonstra como filtrar IDs de concessão da versão.The example also demonstrates how filter for release lease IDs.

Dicas para executar este scriptTips on running this script

Aviso

Se um backup no serviço de Armazenamento de Blobs do Azure estiver em execução ao mesmo tempo que o script, o backup poderá falhar, porque esse script interromperá a concessão que o backup está tentando adquirir simultaneamente.If a backup to the 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. Execute este script durante uma janela de manutenção ou quando não houver backups em execução ou que serão executados.Run this script during a maintenance window or when no backups are running or expected to run.

  • Antes de executar esse script, você deverá 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.Before you run this script, you should add values for the storage account, storage key, container, and the Azure storage assembly path and name parameters. O caminho do armazenamento do assembly é o diretório de instalação da instância do SQL ServerSQL Server.The path of the storage is assembly is the installation directory of the instance of SQL ServerSQL Server. O nome de arquivo do assembly de armazenamento é Microsoft.WindowsAzure.Storage.dll.The file name for the storage assembly is Microsoft.WindowsAzure.Storage.dll.

  • Se não houver blobs com concessões bloqueadas, você deverá ver a seguinte mensagem: There are no blobs with locked lease statusIf there are no blobs with locked leases you should see the following message: There are no blobs with locked lease status

  • Se houver blobs com concessões bloqueadas, você deverá 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>.If there are blobs with locked leases, you should see the following messages: 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., and 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." }

Confira tambémSee also

Práticas recomendadas e solução de problemas de backup do SQL Server para URLSQL Server Backup to URL Best Practices and Troubleshooting