Delen via


Back-upblobbestanden met actieve leases verwijderen

van toepassing op:SQL Server-

Wanneer u een back-up maakt van of herstelt vanuit Microsoft Azure Storage, verkrijgt SQL Server een oneindige lease om exclusieve toegang tot de blob te vergrendelen. Wanneer het back-up- of herstelproces is voltooid, wordt de lease vrijgegeven. Als een back-up of herstel mislukt, probeert het back-upproces ongeldige blobs op te schonen. Als de back-up echter mislukt vanwege een langdurige of aanhoudende netwerkverbindingsfout, kan het back-upproces mogelijk geen toegang krijgen tot de blob en kan de blob zwevend blijven. Dit betekent dat de blob pas kan worden weggeschreven naar of verwijderd nadat de lease is vrijgegeven. In dit onderwerp wordt beschreven hoe u de lease afbreekt en de blob verwijdert.

Lees dit artikelvoor meer informatie over leasetypen.

Als de back-upbewerking mislukt, kan dit resulteren in een ongeldig back-upbestand. Het back-upblobbestand kan ook een actieve huurovereenkomst hebben, waardoor het niet kan worden verwijderd of overschreven. Als u dergelijke blobs wilt verwijderen of overschrijven, moet de lease eerst worden vrijgegeven (verbroken). Wanneer er problemen met de back-up zijn, adviseren we u om leases op te schonen en blobs te verwijderen. U kunt ook regelmatig leases opschonen en blobs verwijderen als onderdeel van uw opslagbeheertaken.

Als er een herstelfout optreedt, worden volgende herstelbewerkingen niet geblokkeerd, waardoor actieve lease mogelijk geen probleem is. Het verbreken van de lease is alleen nodig wanneer u de blob moet overschrijven of verwijderen.

Zwevende blobs beheren

In de volgende stappen wordt beschreven hoe u opschoont na mislukte back-up- of herstelactiviteit. U kunt alle stappen uitvoeren met behulp van PowerShell-scripts. De volgende sectie bevat een voorbeeld van een PowerShell-script:

  1. Blobs identificeren met leases: Als u een script of een proces hebt waarmee de back-upprocessen worden uitgevoerd, kunt u mogelijk de fout in het script of proces vastleggen en deze gebruiken om de blobs op te schonen. U kunt ook de eigenschappen LeaseStats en LeastState gebruiken om blobs met leases op deze blobs te identificeren. Nadat u de blobs hebt geïdentificeerd, controleert u de lijst en controleert u de geldigheid van het back-upbestand voordat u de blob verwijdert.

  2. De lease verbreken: Een geautoriseerde aanvraag kan de lease verbreken zonder een Lease-ID op te leveren. Zie hier voor meer informatie.

    Tip

    SQL Server geeft een lease-id uit om exclusieve toegang tot stand te brengen tijdens de herstelbewerking. De herstellease-id is BAC2BAC2BAC2BAC2BAC2BAC2BAC2BAC2.

  3. De blob verwijderen: Als u een blob met een actieve lease wilt verwijderen, moet u eerst de lease verbreken.

PowerShell-voorbeeldscript

Belangrijk

Als u PowerShell 2.0 gebruikt, kunt u problemen ondervinden bij het laden van de Microsoft WindowsAzure.Storage.dll-assembly. U wordt aangeraden PowerShell- bij te werken om het probleem op te lossen. U kunt ook de volgende tijdelijke oplossing gebruiken om het powershell.exe.config-bestand te maken of te wijzigen voor het laden van .NET 2.0- en .NET 4.0-assembly's tijdens runtime:

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

Het volgende voorbeeldscript identificeert blobs met actieve leases en breekt deze vervolgens af. In het voorbeeld ziet u ook hoe u filtert op release-lease-id's.

Tips voor het uitvoeren van dit script

Waarschuwing

Als een back-up naar Azure Blob Storage wordt uitgevoerd op hetzelfde moment als dit script, kan de back-up mislukken omdat dit script de lease onderbreekt die de back-up gelijktijdig probeert te verkrijgen. Voer dit script uit tijdens een onderhoudsvenster of wanneer er geen back-ups worden uitgevoerd of verwacht te worden uitgevoerd.

  • Voordat u dit script uitvoert, moet u waarden toevoegen voor het opslagaccount, de opslagsleutel, de container en het azure-opslagassemblypad en de naamparameters. Het pad van de opslag is de installatiemap van het exemplaar van SQL Server. De bestandsnaam voor de opslagassembly is Microsoft.WindowsAzure.Storage.dll.

  • Als er geen blobs zijn met vergrendelde leases, zou u het volgende bericht moeten zien: There are no blobs with locked lease status

  • Als er blobs zijn met vergrendelde leases, ziet u de volgende berichten: 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.en 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." }

Zie ook

Best Practices en Probleemoplossing voor Back-up van SQL Server naar een URL