Удаление резервных файлов блобов с активными арендными соглашениями

Область применения:SQL Server

При резервном копировании или восстановлении из хранилища Microsoft Azure, SQL Server получает вечную блокировку, чтобы обеспечить исключительный доступ к BLOB. После успешного завершения резервного копирования или восстановления процесс освобождает аренду. Если резервное копирование или восстановление не удается, процесс резервного копирования пытается очистить любые недопустимые блобы. Однако, если длительный или устойчивый сбой сетевого подключения приводит к сбою резервного копирования, процесс резервного копирования может не иметь доступа к блобу, и блоб может остаться неподключённым. Это условие означает, что объект BLOB не может быть записан или удален до освобождения аренды. В этой статье описывается, как освободить (разорвать) аренду и удалить BLOB.

Дополнительные сведения см. в разделе "Blob-объект аренды" (REST API).

Если операция резервного копирования завершается ошибкой, это может привести к появлению недопустимого файла резервной копии. Также у файла-blob резервной копии может быть активная блокировка, которая предотвращает его удаление или перезапись. Чтобы удалить или перезаписать такие большие двоичные объекты, сначала выпустите (разорвать) аренду. Если возникают сбои резервных копий, очистите аренды и удалите BLOB-ы. Также можно периодически очищать аренды и удалять объекты хранения в рамках задач по управлению хранилищем.

Если происходит сбой восстановления, последующие операции восстановления не блокируются, поэтому активная аренда может не представлять проблемы. Вам нужно только разорвать аренду, если необходимо перезаписать или удалить BLOB.

Управление осиротевшими большими двоичными объектами

В этом разделе описано, как очистить после сбоя резервного копирования или восстановления с помощью PowerShell.

  1. Определите BLOB-объекты с арендой: Если у вас есть скрипт или процесс, выполняющий процессы резервного копирования, вы можете обнаружить сбой в скрипте или процессе и использовать этот сбой для очистки BLOB-объектов. Вы также можете использовать свойства LeaseStats и LeastState для отображения больших двоичных объектов с арендой на них. После идентификации BLOB'ов просмотрите список и проверьте целостность и допустимость файла резервной копии перед удалением BLOB.

  2. Прерывание аренды. Авторизованный запрос может прерывать аренду без предоставления идентификатора аренды. Дополнительные сведения см. в разделе Аренда Blob.

    Совет

    SQL Server использует идентификатор аренды для установления эксклюзивного доступа во время операции восстановления. Идентификатор восстановления аренды — BAC2BAC2BAC2BAC2BAC2BAC2BAC2BAC2.

  3. Удаление объекта BLOB: Чтобы удалить объект BLOB с активной арендой, сначала прервите аренду.

Пример скрипта PowerShell

Внимание

Если вы используете PowerShell 2.0, у вас могут возникнуть проблемы с загрузкой сборки Microsoft WindowsAzure.Storage.dll. Обновите PowerShell , чтобы устранить проблему. Для создания или изменения файла powershell.exe.config можно также использовать следующее решение для загрузки сборок .NET 2.0 и .NET 4.0 во время выполнения:

<?xml version="1.0"?>
    <configuration>
        <startup useLegacyV2RuntimeActivationPolicy="true">
            <supportedRuntime version="v4.0.30319"/>
            <supportedRuntime version="v2.0.50727"/>
        </startup>
    </configuration>  

В следующем примере скрипта показано определение блобов с активными арендными договорами и их последующее прерывание. В этом примере также показано, как отфильтровывать идентификаторы аренды.

Советы для запуска этого скрипта

Предупреждение

Если резервное копирование в Azure Blob Storage выполняется одновременно с этим скриптом, резервное копирование может завершиться ошибкой, так как этот скрипт нарушает процесс получения аренды, которую резервная копия пытается получить одновременно. Выполняйте этот скрипт во время перерывов на профилактическое техобслуживание или в то время, когда не ожидается проведение резервного копирования.

  • Перед выполнением этого скрипта добавьте значения для учетной записи хранения, ключа хранения, контейнера и пути сборки хранилища Azure и параметров имени. Путь к сборке хранилища — это каталог установки экземпляра SQL Server. Имя файла для сборки хранилища — Microsoft.WindowsAzure.Storage.dll.

  • Если объектов blob с заблокированными арендами нет, появится следующее сообщение: There are no blobs with locked lease status

  • Если есть BLOB'ы с заблокированными арендами, вы увидите следующие сообщения: 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., и 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($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." }

См. также

Резервное копирование SQL Server на URL-адрес — рекомендации и устранение неполадок.