활성 임대가 있는 백업 Blob 파일 삭제Delete backup blob files with active leases

Microsoft Azure Storage로 백업하거나 Microsoft Azure Storage에서 복원할 때 SQL Server는 Blob에 대한 단독 액세스를 잠그기 위해 무한 임대를 획득합니다.When backing up to or restoring from Microsoft Azure storage, SQL Server acquires an infinite lease to lock exclusive access to the blob. 백업 또는 복원 프로세스가 성공적으로 완료되면 임대가 해제됩니다.When the backup or restore process is successfully completed, the lease is released. 백업 또는 복원에 실패하면 백업 프로세스에서는 잘못된 모든 Blob을 정리하려고 합니다.If a backup or restore fails, the backup process attempts to clean up any invalid blobs. 하지만 오랫동안 지속된 네트워크 연결 오류로 인해 백업이 실패한 경우에는 백업 프로세스에서 blob에 액세스할 수 없으므로 blob이 분리됩니다.However, if the backup fails due to prolonged or sustained network connectivity failure, the backup process may not be able gain access to the blob and the blob may remain orphaned. 즉, 임대가 해제될 때까지 Blob을 쓰거나 삭제할 수 없습니다.This means the blob cannot be written to or deleted until the lease is released. 이 항목에서는 임대를 해제(중단)하고 Blob을 삭제하는 방법을 설명합니다.This topic describes how to release (break) the lease and delete the blob.

임대 유형에 대한 자세한 내용은 이 문서를 참조하세요.For more information on lease types, read this article.

백업 작업이 실패하는 경우 잘못된 백업 파일이 만들어질 수 있습니다.If the backup operation fails, it can result in an invalid backup file. 백업 blob 파일에 활성 임대도 있어 해당 blob을 삭제하거나 덮어쓸 수 없습니다.The backup blob file might also have an active lease, preventing it from being deleted or overwritten. 이러한 Blob을 삭제하거나 덮어쓰려면 먼저 임대를 해제(중단)해야 합니다.To delete or overwrite such blobs, the lease should first be released (broken). 백업 실패가 있는 경우 임대를 정리하고 Blob을 삭제하는 것이 좋습니다.If there are backup failures, we recommend that you clean up leases and delete blobs. 저장소 관리 작업의 일부로 주기적으로 임대를 정리하고 Blob을 삭제할 수도 있습니다.You can also periodically clean up leases and delete blobs as part of your storage management tasks.

복원 실패가 있는 경우 후속 복원이 차단되지 않으므로 활성 임대는 문제가 되지 않을 수 있습니다.If there is a restore failure, subsequent restores are not blocked, so active lease may not be an issue. blob을 덮어쓰거나 삭제해야 할 때만 임대 해제가 필요합니다.Breaking the lease is only necessary when you have to overwrite or delete the blob.

분리된 Blob 관리Manage orphaned blobs

다음 단계에서는 백업 또는 복원 작업 실패 후 정리하는 방법을 설명합니다.The follow steps describe how to clean up after failed backup or restore activity. PowerShell 스크립트를 사용하여 모든 단계를 수행할 수 있습니다.You can do all the steps using PowerShell scripts. 다음 섹션에는 예제 PowerShell 스크립트가 포함되어 있습니다.The following section includes an example PowerShell script:

  1. 임대가 있는 Blob 식별: 백업 프로세스를 실행하는 스크립트나 프로세스가 있는 경우 해당 스크립트나 프로세스 내에서 오류를 캡처하여 Blob 정리에 사용할 수 있습니다.Identify blobs with leases: If you have a script or a process that runs the backup processes, you might be able to capture the failure within the script or process and use that to clean up the blobs. LeaseStats 및 LeastState 속성을 사용하여 임대가 있는 Blob을 식별할 수도 있습니다.You can also use the LeaseStats and LeastState properties to identify blobs with leases on them. Blob을 식별하고 나서 목록을 검토하고 백업 파일의 유효성을 확인한 후 Blob을 삭제합니다.Once you have identified the blobs, review the list and verify the validity of the backup file before deleting the blob.

  2. 임대 중단: 권한 있는 요청은 임대 ID를 제공하지 않고 임대를 중단할 수 있습니다.Break the lease: An authorized request can break the lease without supplying a lease ID. 자세한 내용은 여기 를 참조하십시오.See here for more information.

    SQL Server는 복원 작업 중 임대 ID를 실행하여 단독 액세스를 설정합니다.SQL Server issues a lease ID to establish exclusive access during the restore operation. 복원 임대 ID는 BAC2BAC2BAC2BAC2BAC2BAC2BAC2BAC2입니다.The restore lease ID is BAC2BAC2BAC2BAC2BAC2BAC2BAC2BAC2.

  3. Blob 삭제: 활성 임대가 있는 Blob을 삭제하려면 먼저 임대를 중단해야 합니다.Delete the Blob: To delete a blob with an active lease, you must first break the lease.

PowerShell 스크립트 예 PowerShell script example

중요

PowerShell 2.0을 실행하는 경우 Microsoft WindowsAzure.Storage.dll 어셈블리를 로드하는 데 문제가 있을 수 있습니다.If you are running PowerShell 2.0, you may have problems loading the Microsoft WindowsAzure.Storage.dll assembly. 문제 해결을 위해 PowerShell을 업그레이드하는 것이 좋습니다.We recommend that you upgrade Powershell to solve the issue. PowerShell 2.0에 대한 다음 해결 방법을 사용할 수도 있습니다.You may also use the following workaround for PowerShell 2.0:

  • 다음과 같이 powershell.exe.config 파일을 만들거나 수정하여 런타임에 .NET 2.0 및 .NET 4.0 어셈블리를 로드합니다.Create or modify the powershell.exe.config file to load .NET 2.0 and .NET 4.0 assemblies at runtime with the following:

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

다음 예제 스크립트에서는 활성 임대가 있는 Blob을 식별한 다음 중단합니다.The following example script identifies blobs with active leases and then breaks them. 임대 ID를 필터링하는 방법도 보여 줍니다.The example also demonstrates how filter for release lease IDs.

이 스크립트 실행 팁Tips on running this script

경고

이 스크립트는 백업에서 동시에 획득하려고 하는 임대를 중단하므로 이 스크립트와 동시에 Microsoft Azure Blob Storage 서비스로의 백업을 실행할 경우 백업이 실패할 수 있습니다.If a backup to the Microsoft Azure Blob storage service is running at the same time as this script, the backup can fail since this script will break the lease that the backup is trying to concurrently acquire. 이 스크립트는 유지 관리 기간에 실행하거나, 실행되고 있거나 실행될 예정인 백업이 없을 때 실행하세요.Run this script during a maintenance window or when no backups are running or expected to run.

  1. 이 스크립트를 실행하면 저장소 계정, 저장소 키, 컨테이너 및 Azure Storage 어셈블리 경로와 이름 매개 변수 값을 제공하라는 메시지가 나타납니다.When you run this script, you will be prompted to provide values for the storage account, storage key, container, and the azure storage assembly path and name parameters. 저장소 어셈블리의 경로는 SQL ServerSQL Server인스턴스의 설치 디렉터리입니다.The path of the storage is assembly is the installation directory of the instance of SQL ServerSQL Server. 저장소 어셈블리의 파일 이름은 Microsoft.WindowsAzure.Storage.dll입니다.The file name for the storage assembly is Microsoft.WindowsAzure.Storage.dll. 다음은 프롬프트 및 입력 값의 예입니다.Following is an example of the prompts and values entered:

    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\MSSQL13.MSSQLSERVER\MSSQL\Binn\Microsoft.WindowsAzure.Storage.dll  
    
  2. 잠긴 임대가 있는 Blob이 없는 경우 다음 메시지가 나타납니다.If there are no blobs with locked leases you should see the following message:

    잠긴 임대 상태의 blob 없음There are no blobs with locked lease status

    잠긴 임대를 가진 blob이 있는 경우 다음과 같은 메시지가 나타납니다.If there are blobs with locked leases, you should see the following messages:

    임대 해제 중Breaking Leases

    <Blob의 URL>의 임대는 복원 임대입니다. 아직 활성 상태인 복원 임대를 가진 blob이 있는 경우에만 이 메시지가 나타납니다.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.

    <Blob의 URL>의 임대는 <Blob의 URL>의 복원 임대 해제 임대가 아닙니다.The lease on <URL of the Blob> is not a restore lease Breaking lease on <URL of the Bob>.

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($null,$true) 

$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  
    }  
}  

참고 항목See also

URL에 대한 SQL Server 백업 - 최상의 방법 및 문제 해결SQL Server Backup to URL Best Practices and Troubleshooting