Удаление резервных файлов больших двоичных объектов с активной арендой
При резервном копировании или восстановлении из хранилища Azure SQL Server получает бесконечную аренду, чтобы заблокировать монопольный доступ к большому двоичному объекту. После успешного завершения процесса резервного копирования или восстановления аренда аннулируется. Если резервное копирование или восстановление оканчивается неудачей, то в процессе резервного копирования предпринимается попытка очистить все недействительные большие двоичные объекты. Однако если резервное копирование завершается сбоем из-за длительного или устойчивого сбоя сетевого подключения, процесс резервного копирования может не получить доступ к большому двоичному объекту, а BLOB-объект может остаться потерянным. Это означает, что большой двоичный объект не может быть записан или удален до тех пор, пока аренда не освободится. В этом разделе показано, как освободить и удалить зарезервированный большой двоичный объект.
Дополнительные сведения о типах аренды см. в этой статье.
Если операция резервного копирования не удается, это может привести к появлению файла резервной копии, который является нерабочим. Также у большого двоичного объекта файла может появиться активная аренда, которая предотвращает его удаление и повторную запись. Чтобы удалить или повторно записать такие большие двоичные объекты, необходимо вначале прекратить аренду. Если происходят ошибки при резервном копировании, рекомендуется очистить аренды и удалить большие двоичные объекты. Также можно внести периодическую чистку в задачи управления хранилищем.
Если происходит ошибка восстановления, то последующие операции восстановления не блокируются, поэтому проблем с активной арендой не возникает. Прерывайте аренду только в том случае, если необходимо перезаписать или удалить большой двоичный объект.
Управление потерянными большими двоичными объектами
Следующие действия описывают процесс очистки после неудачной операции резервного копирования или восстановления. Все действия могут быть выполнены с помощью скриптов PowerShell. Пример кода представлен в следующем разделе:
Определение больших двоичных объектов с арендой. Если резервное копирование выполняется с помощью скрипта или процесса, вы можете фиксировать ошибки внутри такого скрипта или процесса и использовать эти данные для очистки больших двоичных объектов. Можно также использовать свойства LeaseStats и LeastState, чтобы выделить большие двоичные объекты с арендой. После определения больших двоичных объектов рекомендуется просмотреть список, проверить работоспособность файла резервной копии перед удалением большого двоичного объекта.
Прерывание аренды. Авторизованный запрос может прерывать аренду без предоставления идентификатора аренды. Дополнительные сведения см. в этом разделе .
Совет
SQL Server выдает идентификатор аренды для получения монопольного доступа во время операции восстановления. Идентификатор аренды при операции восстановления — BAC2BAC2BAC2BAC2BAC2BAC2BAC2BAC2.
Удаление большого двоичного объекта. Чтобы удалить большой двоичный объект с активной арендой, сначала необходимо прервать аренду.
Пример скрипта PowerShell
**Важно** Если вы используете PowerShell 2.0, могут возникнуть проблемы с загрузкой сборки Microsoft WindowsAzure.Storage.dll. Рекомендуется обновить Powershell до версии 3.0, чтобы решить проблему. Можно также использовать следующее решение для PowerShell 2.0:
Создайте или измените файл powershell.exe.config для загрузки сборки .NET Framework 2.0 и .NET Framework 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. Далее приводится пример запросов и введенных значений.
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.dll
При отсутствии больших двоичных объектов с заблокированными арендами появится следующее сообщение:
Отсутствуют большие двоичные объекты с заблокированным статусом аренды
При наличии больших двоичных объектов с заблокированными арендами появится следующее сообщение:
Прерывание аренды
Аренда ПО <URL-адресу большого двоичного объекта> является арендой восстановления. Это сообщение отображается только в том случае, если у вас есть большой двоичный объект с арендой восстановления, который все еще активен.
Аренда ПО <URL-адресу большого двоичного объекта> не является арендой восстановления Разрыв аренды по <URL-адресу Боба>.
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
}
}
См. также
Резервное копирование SQL Server на URL-адрес — рекомендации и устранение неполадок.