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