Sdílet prostřednictvím


Odstraňte záložní blob soubory s aktivními leasingy

platí pro:SQL Server

Při zálohování nebo obnovování z úložiště Microsoft Azure si SQL Server zajistí nekonečný pronájem, aby zajistil výhradní přístup k objektu blob. Po úspěšném dokončení procesu zálohování nebo obnovení se zapůjčení uvolní. Pokud zálohování nebo obnovení selže, proces zálohování se pokusí vyčistit všechny neplatné bloby. Pokud se ale zálohování nezdaří kvůli selhání dlouhodobého nebo trvalého připojení k síti, proces zálohování nemusí být schopen získat přístup k objektu blob a objekt blob může zůstat osamocený. To znamená, že objekt blob nelze zapsat ani odstranit, dokud není pronájem uvolněn. Toto téma popisuje, jak ukončit zapůjčení a smazat blob.

Další informace o typech zapůjčení najdete v tomto článku.

Pokud operace zálohování selže, může vést k neplatnému záložnímu souboru. Záložní soubor objektu blob může mít také aktivní pronájem, který brání jeho odstranění nebo přepsání. Pokud chcete takové objekty blob odstranit nebo přepsat, mělo by se nejprve uvolnit (přerušit) pronájem. Pokud dojde k selhání zálohování, doporučujeme vyčistit pronájmy a odstranit blob objekty. V rámci vašich úloh správy úložiště můžete také pravidelně uvolňovat pronájmy a odstraňovat datové objekty.

Pokud dojde k selhání obnovení, následná obnovení se neblokují, takže aktivní pronájem nemusí být problém. Přerušení zapůjčení je nezbytné pouze v případě, že potřebujete přepsat nebo odstranit objekt blob.

Správa osiřelých objektů blob

Následující kroky popisují, jak vyčistit po neúspěšné aktivitě zálohování nebo obnovení. Všechny kroky můžete provést pomocí skriptů PowerShellu. Následující část obsahuje ukázkový skript PowerShellu:

  1. Identifikovat objekty blob s pronájmem: Pokud máte skript nebo proces, který spouští procesy zálohování, možná budete schopni zachytit selhání ve skriptu nebo procesu a použít ho k vyčištění objektů blob. Pomocí vlastností LeaseStats a LeastState můžete také identifikovat objekty blob s zapůjčeními. Jakmile identifikujete objekty blob, zkontrolujte seznam a před odstraněním objektu blob ověřte platnost záložního souboru.

  2. Přerušení zapůjčení: Autorizovaný požadavek může zapůjčení přerušit bez zadání ID zapůjčení. Další informace najdete tady.

    Spropitné

    SQL Server vydá ID zapůjčení pro vytvoření výhradního přístupu během operace obnovení. ID obnovy pronájmu je BAC2BAC2BAC2BAC2BAC2BAC2BAC2BAC2.

  3. cs-CZ: Smazání objektu blob: Pokud chcete odstranit objekt blob s aktivním pronájmem, musíte nejprve ukončit pronájem.

Příklad skriptu PowerShellu

Důležitý

Pokud používáte PowerShell 2.0, může dojít k problémům s načtením sestavení Microsoft WindowsAzure.Storage.dll. Doporučujeme, abyste upgradovali PowerShell, abyste vyřešili problém. Následující alternativní řešení můžete použít také k vytvoření nebo úpravě souboru powershell.exe.config pro načtení sestavení .NET 2.0 a .NET 4.0 za běhu pomocí následujícího příkazu:

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

Následující ukázkový skript identifikuje bloby s aktivními leasingy a pak je přeruší. Příklad také ukazuje, jak filtrovat ID pronájmu.

Tipy ke spuštění tohoto skriptu

Varování

Pokud probíhá zálohování do Azure Blob Storage současně s tímto skriptem, může zálohování selhat, protože tento skript naruší pronájem, který se zálohování snaží současně získat. Tento skript spusťte během časového období údržby nebo když žádné zálohy neběží ani nejsou očekávány, že poběží.

  • Před spuštěním tohoto skriptu byste měli přidat hodnoty pro účet úložiště, klíč úložiště, kontejner a cestu sestavení a parametry názvu úložiště Azure. Cesta ke složce úložiště je instalační adresář instance SQL Serveru. Název souboru sestavení úložiště je Microsoft.WindowsAzure.Storage.dll.

  • Pokud neexistují žádné objekty blob s uzamčenými zapůjčeními, měla by se zobrazit následující zpráva: There are no blobs with locked lease status

  • Pokud existují objekty blob s uzamčenými zapůjčeními, měly by se zobrazit následující zprávy: 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.a 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." }

Viz také

Osvedčené postupy pro zálohování SQL Serveru na URL a řešení potíží