Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Quando faz backup ou restaura a partir do armazenamento Microsoft Azure, o SQL Server adquire um arrendamento infinito para bloquear o acesso exclusivo ao blob. Quando o processo de backup ou restauro termina com sucesso, o processo liberta o contrato de arrendamento. Se um backup ou restauro falhar, o processo de backup tenta limpar quaisquer blobs inválidos. No entanto, se uma falha prolongada na conectividade de rede fizer o backup falhar, o processo de backup pode não conseguir aceder ao bloco de dados e este pode permanecer órfão. Esta condição significa que o blob não pode ser escrito ou eliminado até que o contrato de arrendamento seja libertado. Este artigo descreve como libertar (quebrar) o contrato de arrendamento e eliminar o blob.
Para mais informações, consulte Lease Blob (API REST).
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 eliminar ou sobrescrever tais blobs, primeiro quebre (liberte) o arrendamento. Se ocorrerem falhas de backup, limpe os contratos de arrendamento e apague os blobs. Você também pode limpar periodicamente alugueres e excluir blobs como parte das suas tarefas de gestão de armazenamento.
Se ocorrer uma falha na restauração, as restaurações subsequentes não são bloqueadas, por isso o arrendamento ativo pode não ser um problema. Só precisas de rescindir o contrato de arrendamento quando precisas de sobrescrever ou apagar o blob.
Gerenciar blobs órfãos
Os passos desta secção descrevem como limpar após uma falha em atividade de backup ou restauro usando o PowerShell.
Identificar blobs com contratos de arrendamento: Se tiveres um script ou um processo que executa os processos de backup, podes conseguir captar a falha dentro do script ou processo e usar essa falha para limpar os blobs. Também pode utilizar as propriedades
LeaseStatseLeastStatepara identificar blobs com contratos de arrendamento. Depois de identificares os blobs, revê a lista e verifica a validade do ficheiro de backup antes de apagares o blob.Rescindir o contrato de arrendamento: Um pedido autorizado pode rescindir o contrato de arrendamento sem fornecer um ID de contrato. Para mais informações, consulte Lease Blob.
Dica
O SQL Server utiliza um ID de arrendamento para estabelecer acesso exclusivo durante a operação de restauro. O ID de concessão de restauro é BAC2BAC2BAC2BAC2BAC2BAC2BAC2BAC2.
Eliminar o Blob: Para eliminar um blob com um lease ativo, primeiro rompa o lease.
Exemplo de script do PowerShell
Importante
Se estiver a executar o PowerShell 2.0, poderá ter problemas ao carregar a biblioteca Microsoft WindowsAzure.Storage.dll. Atualize o Powershell para resolver o problema. Também pode usar a seguinte solução alternativa para criar ou modificar o ficheiro powershell.exe.config para carregar assemblies .NET 2.0 e .NET 4.0 em tempo de execução:
<?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 Azure Blob Storage estiver a correr ao mesmo tempo que este script, o backup pode falhar, pois este script quebra o lease que o backup está a tentar 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 executares este script, adiciona valores para a conta de armazenamento, chave de armazenamento, contentor, e os parâmetros de caminho e nome da montagem do armazenamento do Azure. O caminho do conjunto 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 blocos com contratos bloqueados, vê a seguinte mensagem:
There are no blobs with locked lease statusSe houver blobs com contratos bloqueados, vê 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., eThe 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($storageAssemblyPathName)
[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