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.
Ao fazer backup ou restauração do armazenamento do 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 qualquer blob inválido. No entanto, se o backup falhar devido a uma falha prolongada ou sustentada de conectividade de rede, o processo de backup poderá não conseguir obter acesso ao blob e o blob poderá 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 liberar a concessão e excluir o blob..
Para obter mais informações sobre os tipos de concessões, leia este artigo.
Se a operação de backup falhar, ela poderá resultar em um arquivo de backup que não é vá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 interrompida. Se houver falhas de backup, recomendamos que você limpe as concessões e exclua blobs. Você também pode escolher a limpeza periodicamente como parte das tarefas de gerenciamento de armazenamento.
Se houver uma falha de restauração, as restaurações subsequentes não serão bloqueadas e, portanto, a concessão ativa poderá não ser um problema. Interromper a concessão só é necessário quando você precisa substituir ou excluir o blob.
Gerenciando objetos binários órfãos
As etapas a seguir descrevem como limpar após falha na atividade de backup ou restauração. Todas as etapas podem ser feitas usando scripts do PowerShell. Um exemplo de código é fornecido na seção a seguir:
Identificando blobs que têm leases: Se você tiver um script ou um processo que faça os backups, 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 os blobs que têm concessões neles. Depois de identificar os blobs, recomendamos que você examine a lista, verifique a validade do arquivo de backup antes de excluir o blob.
Quebra do contrato de locação: Uma solicitação autorizada pode romper o contrato de locação sem fornecer um número de identificação do contrato. Veja 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. A ID de concessão de restauração é BAC2BAC2BAC2BAC2BAC2BAC2BAC2BAC2.
Excluindo o Blob: Para excluir um blob que tenha uma concessão ativa, primeiro você deve interromper a concessão.
Exemplo de script do PowerShell
**Importante** Se você estiver executando o PowerShell 2.0, poderá ter problemas ao carregar o assembly do Microsoft WindowsAzure.Storage.dll. Recomendamos que você atualize para o Powershell 3.0 para resolver o problema. Você também pode usar a seguinte solução alternativa para o PowerShell 2.0:
Crie ou modifique o arquivo powershell.exe.config para carregar assemblies .NET 2.0 e .NET 4.0 em runtime com o seguinte:
<?xml version="1.0"?> <configuration> <startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0.30319"/> <supportedRuntime version="v2.0.50727"/> </startup> </configuration>
O exemplo a seguir ilustra como identificar blobs com concessões ativas e, em seguida, como quebrá-las. O exemplo também demonstra como filtrar as IDs de liberação de concessão.
Dicas sobre como executar este script
Aviso
Se um backup para o serviço de Armazenamento de Blobs do Azure estiver em execução ao mesmo tempo que esse script, o backup poderá falhar, pois esse script interromperá a concessão que o backup está tentando adquirir ao mesmo tempo. É recomendável executar esse script durante uma janela de manutenção ou quando nenhum backup deve ser executado.
Ao executar este script, você será solicitado a fornecer 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 do armazenamento de assembly é o diretório de instalação da instância do SQL Server. O nome do arquivo do conjunto de armazenamento é Microsoft.WindowsAzure.Storage.dll. Veja a seguir 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\MSSQL12.MSSQLSERVER\MSSQL\Binn\Microsoft.WindowsAzure.Storage.dllSe não houver blobs que tenham bloqueado as concessões, você deverá ver a seguinte mensagem:
Não há blobs com status de concessão bloqueado
Se houver blobs com concessões de locação bloqueadas, você deverá ver as seguintes mensagens:
Rescisão de Contratos de Aluguel
A concessão na <URL do Blob> é uma concessão de restauração: você verá essa mensagem somente se tiver um blob com uma concessão de restauração que ainda esteja ativa.
A concessão na <URL do Blob> não corresponde a uma concessão de restauração, interrompendo a concessão na <URL do Bob>.
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
Práticas recomendadas de backup do SQL Server para URL e solução de problemas