Excluindo arquivos de blob de backup com arrendamentos ativos
Ao fazer backup ou restauração no armazenamento do Windows Azure, o SQL Server adquirirá um arrendamento infinito para bloquear o acesso exclusivo ao blob. Quando o processo de backup ou restauração for concluído com êxito, o arrendamento será liberado. Se um backup ou uma restauração falhar, o processo de backup tentará limpar qualquer blob inválido. 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. Isso significa que o blob só poderá ser gravado ou excluído quando o arrendamento for liberado. Este tópico descreve como liberar a concessão e excluir o blob.
Para obter mais informações sobre os tipos de arrendamentos, leia este artigo.
Se a operação de backup falhar, isso poderá resultar em um arquivo de backup que não é válido. O arquivo de blob de backup pode ter também um arrendamento ativo, impedindo que ele seja excluído ou substituído. Para excluir ou substituir esses blobs, primeiro o arrendamento deve ser interrompido. Se houver falhas de backup, recomendamos que você limpe arrendamentos e exclua blobs. Você também pode optar por fazer a limpeza periódica como parte das tarefas de gerenciamento de armazenamento.
Se houver uma falha na restauração, as restaurações subsequentes não serão bloqueadas e, portanto, o arrendamento ativo possivelmente não será um problema. A interrupção do arrendamento só é necessária quando você precisa substituir ou excluir o blob.
Gerenciando blobs órfãos
As etapas a seguir descrevem como efetuar a limpeza após uma atividade de restauração ou backup com falha. Todas as etapas podem ser executadas por meio dos scripts do PowerShell. Um exemplo de código é fornecido na seção a seguir:
Identificando os blobs que têm arrendamentos: Se você tiver um script ou processo que executa os processos de backup, talvez possa capturar a falha no script ou processo e usá-la para limpar os blobs. Você também pode usar as propriedades LeaseStats e LeastState para identificar os blobs que têm arrendamentos neles. Após identificar os blobs, recomendamos que você examine a lista e verifique a validade do arquivo de backup antes de excluir o blob.
Interrompendo o arrendamento: uma solicitação autorizada pode interromper o arrendamento sem fornecer uma ID de arrendamento. Consulte aqui para obter mais informações.
Dica O SQL Server emite uma ID de arrendamento para estabelecer o acesso exclusivo durante a operação de restauração. A ID de arredondamento da restauração é BAC2BAC2BAC2BAC2BAC2BAC2BAC2BAC2.
Excluindo o Blob: para excluir um blob que tem um arrendamento ativo, primeiro você deve interromper o arrendamento.
Exemplo de script do PowerShell
Importante |
---|
Se você estiver executando o PowerShell 2.0, você poderá ter problemas ao carregar o assembly do Microsoft WindowsAzure.Storage.dll. Recomendamos que você atualize o Powershell 3.0 para resolver o problema. Você também pode usar a seguinte solução para o PowerShell 2.0:
|
O exemplo a seguir ilustra a identificação de blobs que têm arrendamentos ativos e sua interrupção. O exemplo também demonstra como filtrar IDs de arredondamento de versão.
Dicas para executar este script
Cuidado |
---|
Se um backup para o serviço de armazenamento de Blob do Windows Azure estiver sendo executado ao mesmo tempo que este script, o backup poderá falhar, uma vez que o script interromperá a concessão que o backup está tentando adquirir ao mesmo tempo. Recomendamos a execução deste script durante uma janela de manutenção ou quando não houver nenhum backup programado para execução. |
Ao executar este script, você será solicitado a fornecer valores da conta de armazenamento, da chave de armazenamento, do contêiner, e dos parâmetros de caminho e nome do assembly de armazenamento do Windows Azure. O caminho do armazenamento do assembly é o diretório de instalação da instância do SQL Server. O nome de arquivo do assembly de armazenamento é Microsoft.WindowsAzure.Storage.dll. O seguinte é um exemplo dos prompts e valores inseridos:
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\MSSQL11.MSSQLSERVER\MSSQL\Binn\Microsoft.WindowsAzure.Storage.dll
Se não houver nenhum blob que tenha bloqueado arrendamentos, você verá a seguinte mensagem:
Não há nenhum blob com status de arrendamento bloqueado
Se houver blobs com arrendamentos bloqueados, você verá as seguintes mensagens:
Interrompendo arrendamentos
O arrendamento na <URL do Blob> é um arrendamento de restauração: você verá esta mensagem apenas se tiver um blob com um arrendamento de restauração que ainda está ativo.
O arrendamento na <URL de Blob> não é um arrendamento de restauração que interrompe o arrendamento na <URL do 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
}
}
Consulte também
Conceitos
Práticas recomendadas de backup e restauração (serviço de armazenamento de Blob do Windows Azure)