Megosztás a következőn keresztül:


Biztonsági mentési blobfájlok törlése aktív bérletekkel

A következőkre vonatkozik:SQL Server

Amikor biztonsági másolatot készít a Microsoft Azure Storage-ról vagy visszaállítja azt, az SQL Server egy végtelen bérletet szerez be a blob kizárólagos hozzáférésének zárolásához. Ha a biztonsági mentési vagy visszaállítási folyamat sikeresen befejeződött, a bérlet felszabadul. Ha egy biztonsági mentés vagy visszaállítás sikertelen, a biztonsági mentési folyamat megpróbálja törölni az érvénytelen blobokat. Ha azonban a biztonsági mentés hosszabb vagy tartós hálózati kapcsolati hiba miatt meghiúsul, előfordulhat, hogy a biztonsági mentési folyamat nem fér hozzá a blobhoz, és a blob árva marad. Ez azt jelenti, hogy a blob csak akkor írható vagy törölhető, miután a bérlet felszabadul. Ez a témakör a bérlet kiadását (megszakítását) és a blob törlését ismerteti.

A bérlettípusokkal kapcsolatos további információkért olvassa el ezt a cikket.

Ha a biztonsági mentési művelet meghiúsul, az érvénytelen biztonsági mentési fájlt eredményezhet. Előfordulhat, hogy a mentési blobfájlnak aktív kizárólagos hozzáférése van, ami megakadályozza a törlést vagy a felülírást. Az ilyen blobok törléséhez vagy felülírásához először a bérletet fel kell törni (megszakítani). Biztonsági mentési hibák esetén javasoljuk, hogy törölje a bérleteket és törölje a blobokat. A tárolási felügyeleti feladatok részeként rendszeres időközönként törölheti a bérleteket és törölheti a blobokat.

Visszaállítási hiba esetén a rendszer nem tiltja le a későbbi visszaállításokat, így előfordulhat, hogy az aktív bérlet nem jelent problémát. A bérlet megszüntetése csak akkor szükséges, ha felül kell írnia vagy törölnie kell a blobot.

Árva blobok kezelése

A következő lépések azt mutatják be, hogyan lehet megtisztítani a sikertelen biztonsági mentési vagy visszaállítási tevékenység után. Az összes lépést PowerShell-szkriptekkel hajthatja végre. A következő szakasz egy példa PowerShell-szkriptet tartalmaz:

  1. Blobok azonosítása bérletekkel: Ha rendelkezik egy szkripttel vagy folyamattal, amely a biztonsági mentési folyamatokat futtatja, lehetséges, hogy képes rögzíteni a hibát a szkriptben vagy a folyamatban, és ezt felhasználhatja a blobok rendbetételére. A LeaseStats és a LeastState tulajdonságok használatával is azonosíthatja a bérlettel rendelkező blobokat. Miután azonosította a blobokat, tekintse át a listát, és ellenőrizze a biztonsági mentési fájl érvényességét a blob törlése előtt.

  2. A bérlet megszakítása: Egy engedélyezett kérelem bérletazonosító megadása nélkül is megszakíthatja a bérletet. További információ: Blob bérlés.

    Borravaló

    Az SQL Server egy bérletazonosítót ad ki, amely kizárólagos hozzáférést biztosít a visszaállítási művelet során. A visszaállítási bérlet azonosítója BAC2BAC2BAC2BAC2BAC2BAC2BAC2BAC2.

  3. Blob törlése: Aktív bérlettel rendelkező blob törléséhez először fel kell bontania a bérletet.

Példa PowerShell-szkriptre

Fontos

Ha a PowerShell 2.0-t futtatja, előfordulhat, hogy problémákat tapasztal a Microsoft WindowsAzure.Storage.dll szerelvény betöltésekor. Javasoljuk, hogy frissítse PowerShell- a probléma megoldásához. Az alábbi kerülő megoldással létrehozhatja vagy módosíthatja a powershell.exe.config fájlt a .NET 2.0 és a .NET 4.0 szerelvények futásidőben való betöltéséhez a következőkkel:

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

Az alábbi példaszkript azonosítja az aktív bérlettel rendelkező blobokat, majd megszakítja őket. A példa azt is bemutatja, hogyan szűrheti a kiadási bérlet azonosítókat.

Tippek a szkript futtatásához

Figyelmeztetés

Ha az Azure Blob Storage-ba történő biztonsági mentés a szkripttel egy időben fut, a biztonsági mentés meghiúsulhat, mivel ez a szkript megszakítja azt a bérletet, amelyet a biztonsági másolat egyidejűleg próbál beszerezni. Futtassa ezt a szkriptet karbantartási időszak alatt, vagy ha nem futnak biztonsági másolatok, vagy várhatóan nem futnak.

  • A szkript futtatása előtt adjon meg értékeket a tárfiókhoz, a tárkulcshoz, a tárolóhoz, valamint az Azure Storage szerelvényútvonalához és névparamétereihez. A tároló elérési útja az SQL Server-példány telepítési könyvtára. A tárolószerelvény fájlneve Microsoft.WindowsAzure.Storage.dll.

  • Ha nincsenek zárolt bérlettel rendelkező blobok, a következő üzenet jelenik meg: There are no blobs with locked lease status

  • Zárolt bérlettel rendelkező blobok esetén a következő üzeneteket kell látnia: 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.és 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." }

Lásd még:

SQL Server biztonsági mentése URL-címre – ajánlott eljárások és hibaelhárítás