Поделиться через


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

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

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

Дополнительные сведения о типах аренды см. в этой статье.

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

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

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

Следующие действия описывают процесс очистки после неудачной операции резервного копирования или восстановления. Все действия могут быть выполнены с помощью скриптов PowerShell. В следующем разделе приводится пример скрипта PowerShell.

  1. Идентификация блобов с арендой: Если у вас есть скрипт или процесс, который выполняет резервное копирование, вы можете отслеживать ошибки в этом скрипте или процессе и использовать их для очистки блобов. Можно также использовать свойства LeaseStats и LeaseState, чтобы определить бинарные объекты с заключёнными договорами аренды. После определения больших двоичных объектов просмотрите список и проверьте работоспособность файла резервной копии перед удалением большого двоичного объекта.

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

    Совет

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

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

Пример скрипта 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.

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

  • При наличии блобов с заблокированной арендой, вы должны увидеть следующие сообщения: 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($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  
$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-адрес — рекомендации и устранение неполадок.