Удаление резервных файлов больших двоичных объектов с активной арендой

Применимо к:SQL Server

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

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

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

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

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

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

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

  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>  

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

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

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

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

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