Deletando Backups no Microsoft Azure com Active Leases

Posted on junho 13, 2017

0


Introdução

Como falado anteriormente no blog post de Estratégias de Backup de Máquinas Virtuais e SQL Server no Azure , uma das mais utilizadas técnicas para realização de backup de banco de dados de médio ou grande porte, o Ola Hallengren pode atender a necessidade para administradores de banco de dados que desejam sair dos planos de manutenção padrão do SQL Server, na verdade um dos melhores conselhos que posso apontar seria trocar imediatamente para esse novo modelo.

Quando estamos no Microsoft Azure, nossa estratégia de backup é a utilização para a URL geralmente, isso possibilita com que os backups sejam armazenados diretamente no Blob Storage do Azure, garantindo a replicação, redundância e alta disponibilidade do arquivo, porém durante o processo de envio do backup, um processo chamado de “lease blob” é iniciado e em determinado ponto, pode gerar uma dor de cabeça!

Lease Blob

O Lease Blob é uma operação que estabelece e gerencia o bloqueio de operações de escrita e deleção no Blob, os bloqueios podem durar entre 15 a 60 segundos geralmente, mas também podem ser marcadas como infinito. Para mais detalhes sobre essa operação, acesse esse link – https://docs.microsoft.com/en-us/rest/api/storageservices/lease-blob 

Quando um restore ou um processo de backup é iniciado, o SQL Server realiza um lease infinito para ter exclusividade ao Blob assim sendo possível a gravação do arquivo no mesmo, quando o processo é finalizado então o SQL Server marca o arquivo como completo e retira o lease para utilização e acesso daquele arquivo, no caso estamos falando do arquivo de backup do banco de dados.

Porém em algumas situações, devido a latência ou erros na rede ou até mesmo o acesso incorreto ao blob internamente, esse arquivo poderá ser marcado como órfão. Quando isso acontece, o Blob a partir desse momento não consegue escrever ou deletar até que esse “lease” seje removido do container. Se a operação falhar do lado do SQL Server então o resultado será que o arquivo de backup não é valido, para isso existem 3 tipos de decisões e estratégias a serem tomadas caso você passe por esse problema.

Gerenciando Blobs Órfãos

Identificação de Blobs com LeasesUtilização de um script para encontrar processos que tiveram problemas de “leases” durante a gravação no Blob Storage. Nesse caso você pode capturar as falhas no SQL Server e verificar Blob Storage se você tem algum problema de “leasing”. Você pode verificar isso em dois níveis, tanto no container como no arquivo por ele mesmo, acessando as propriedades no Portal do Azure.

blob_lease_status

(Figura 1 – Status e Estado do Lease)

Quebrar ou Deletar o Blob – Geralmente o método adotado aqui é quebrar o lease do container todo para que seje liberado o acesso novamente, por isso quando você presenciar o seguintes erros

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.

The lease on <URL of the Blob> is not a restore lease Breaking lease on <URL of the Bob>.

Use o seguinte script para quebrar o “lease”, porém antes de utilizar você precisa ter acesso ao Portal do Azure, utilizando o PowerShell para realizar o login.

##Login Microsoft Account
Login-AzureRmAccount
Get-AzureRmSubscription

Agora com o processo de login realizado, use o seguinte código, se quiser veja o mesmo aqui

                                                                                   
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
    }
}