Freigeben über


Löschen von Blob-Dateien mit aktiven Mietverträgen

Gilt für:SQL Server

Wenn Sie eine Sicherung oder Wiederherstellung aus dem Microsoft Azure-Speicher durchführen, erwirbt SQL Server eine unbegrenzte Lease, um exklusiven Zugriff auf das Blob zu sperren. Wenn der Sicherungs- oder Wiederherstellungsvorgang erfolgreich beendet wird, gibt der Prozess die Pacht frei. Wenn eine Sicherung oder Wiederherstellung fehlschlägt, versucht der Sicherungsvorgang, ungültige BLOBs zu bereinigen. Wenn jedoch ein längerer oder dauerhafter Netzwerkkonnektivitätsfehler dazu führt, dass die Sicherung fehlschlägt, kann der Sicherungsvorgang möglicherweise nicht auf das Blob zugreifen, und das Blob bleibt möglicherweise verwaist. Diese Bedingung bedeutet, dass das Blob nicht beschrieben oder gelöscht werden kann, bis die Lease freigegeben wurde. In diesem Artikel wird beschrieben, wie Sie die Lease freigeben (unterbrechen) und das Blob löschen.

Weitere Informationen finden Sie unter Lease Blob (REST API).For more information, see Lease Blob (REST API).

Ist der Sicherungsvorgang fehlerhaft, kann eine ungültige Sicherungsdatei generiert werden. Für die Sicherungs-Blobs-Datei kann auch ein aktives Lease bestehen, das verhindert, dass sie gelöscht oder überschrieben wird. Um solche Blobs zu löschen oder zu überschreiben, lösen Sie zuerst die Lease auf. Wenn Sicherungsfehler auftreten, bereinigen Sie Leases und löschen Sie Blobs. Im Rahmen Ihrer Speicherverwaltungsaufgaben können Sie auch regelmäßig Leases bereinigen und Blobs löschen.

Wenn ein Wiederherstellungsfehler auftritt, werden nachfolgende Wiederherstellungen nicht blockiert, daher kann die aktive Leasing möglicherweise kein Problem darstellen. Sie müssen die Lease nur unterbrechen, wenn Sie das Blob überschreiben oder löschen müssen.

Verwalten verwaister Blobs

In diesem Abschnitt wird beschrieben, wie Sie mithilfe von PowerShell Bereinigungen nach fehlgeschlagenen Sicherungs- oder Wiederherstellungsaktivitäten durchführen können.

  1. Blobs mit Leases identifizieren: Wenn Sie über ein Skript oder einen Prozess verfügen, das die Sicherungsprozesse ausführt, können Sie möglicherweise den Fehler innerhalb des Skripts oder Prozesses erfassen und diesen Fehler verwenden, um die Blobs aufzusäumen. Sie können auch die Eigenschaften LeaseStats und LeastState verwenden, um Blobs mit Leases zu identifizieren. Nachdem Sie die Blobs identifiziert haben, überprüfen Sie die Liste, und überprüfen Sie die Gültigkeit der Sicherungsdatei, bevor Sie das Blob löschen.

  2. Unterbrechen der Lease: Durch eine autorisierte Anforderung kann die Lease ohne Angabe einer Lease-ID unterbrochen werden. Weitere Informationen finden Sie unter Lease Blob.

    Tipp

    SQL Server verwendet eine Lease-ID, um während des Wiederherstellungsvorgangs exklusiven Zugriff herzustellen. Die Wiederherstellungslease-ID lautet BAC2BAC2BAC2BAC2BAC2BAC2BAC2BAC2.

  3. Blob löschen: Um ein Blob mit einem aktiven Leasingvertrag zu löschen, brechen Sie zunächst den Leasingvertrag.

Beispiel für ein PowerShell-Skript

Wichtig

Wenn Sie PowerShell 2.0 ausführen, haben Sie möglicherweise Probleme beim Laden der Microsoft WindowsAzure.Storage.dll-Assembly. Aktualisieren Sie PowerShell , um das Problem zu lösen. Sie können auch die folgende Workaround verwenden, um die Datei powershell.exe.config zu erstellen oder zu ändern, um .NET 2.0- und .NET 4.0-Assemblys zur Laufzeit zu laden.

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

Das folgende Beispielskript ermittelt Blobs mit aktiven Leases und bricht sie anschließend. Das Beispiel zeigt auch, wie Sie nach freigegebenen Lease-IDs filtern.

Tipps zum Ausführen des Skripts

Warnung

Wenn eine Sicherung in Azure Blob Storage gleichzeitig mit diesem Skript ausgeführt wird, kann die Sicherung fehlschlagen, da dieses Skript das Lease-Abkommen bricht, das die Sicherung gleichzeitig zu erwerben versucht. Führen Sie das Skript während eines Wartungsfensters oder in Phasen aus, in denen keine Sicherungsaktivitäten ausgeführt werden oder zu erwarten sind.

  • Fügen Sie vor dem Ausführen dieses Skripts Werte für das Speicherkonto, den Speicherschlüssel, den Container und den Pfad und die Namenparameter der Azure-Speicherassembly hinzu. Der Pfad der Speicherassembly ist das Installationsverzeichnis der Instanz von SQL Server. Der Dateiname der Speicherassembly lautet "Microsoft.WindowsAzure.Storage.dll".

  • Wenn keine Blobs mit gesperrten Leases vorhanden sind, wird die folgende Meldung angezeigt: There are no blobs with locked lease status

  • Wenn Blobs mit gesperrten Leases vorhanden sind, werden die folgenden Meldungen angezeigt: 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., und 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($storageAssemblyPathName)  
[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." }

Siehe auch

SQL Server-Sicherung über URLs – bewährte Methoden und Problembehandlung