Udostępnij za pośrednictwem


Usuwanie plików kopii zapasowej blob z aktywnymi dzierżawami

Dotyczy:programu SQL Server

Podczas tworzenia kopii zapasowej lub przywracania z usługi Microsoft Azure Storage program SQL Server uzyskuje nieskończoną dzierżawę, aby zablokować wyłączny dostęp do obiektu blob. Po pomyślnym zakończeniu procesu tworzenia kopii zapasowej lub przywracania dzierżawa zostanie zwolniona. Jeśli tworzenie kopii zapasowej lub przywracanie zakończy się niepowodzeniem, proces tworzenia kopii zapasowej podejmie próbę wyczyszczenia nieprawidłowych obiektów blob. Jeśli jednak tworzenie kopii zapasowej zakończy się niepowodzeniem z powodu długotrwałej lub ciągłej awarii łączności sieciowej, proces tworzenia kopii zapasowej może nie być w stanie uzyskać dostępu do blobu, a blob może pozostać osierocony. Oznacza to, że nie można zapisać ani usunąć obiektu blob do momentu zwolnienia dzierżawy. W tym temacie opisano sposób zwalniania (przerywania) dzierżawy i usuwania bloba.

Aby uzyskać więcej informacji na temat typów dzierżaw, przeczytaj ten artykuł .

Jeśli operacja tworzenia kopii zapasowej nie powiedzie się, może to spowodować wystąpienie nieprawidłowego pliku kopii zapasowej. Plik Blob kopii zapasowej może również mieć aktywną dzierżawę, uniemożliwiając jego usunięcie lub zastąpienie. Aby usunąć lub nadpisać takie blob, dzierżawa powinna zostać najpierw zwolniona (przerwana). Jeśli występują problemy z tworzeniem kopii zapasowych, zalecamy wyczyścić dzierżawy i usunąć bloby. Można również okresowo czyścić dzierżawy i usuwać obiekty blob w ramach zadań zarządzania przechowywaniem.

Jeśli wystąpi błąd przywracania, kolejne operacje przywracania nie są zablokowane, dlatego aktywna dzierżawa nie powinna stanowić problemu. Przerwanie dzierżawy jest konieczne tylko wtedy, gdy trzeba zastąpić lub usunąć blob.

Zarządzanie osieroconymi obiektami blob

W poniższych krokach opisano sposób czyszczenia po nieudanym działaniu tworzenia kopii zapasowej lub przywracania. Wszystkie kroki można wykonać przy użyciu skryptów programu PowerShell. Poniższa sekcja zawiera przykładowy skrypt programu PowerShell:

  1. Identyfikowanie obiektów blob z dzierżawami: Jeśli masz skrypt lub proces, który uruchamia procesy tworzenia kopii zapasowych, możesz przechwycić błąd w skrypcie lub procesie i użyć go do usunięcia obiektów blob. Możesz również użyć właściwości LeaseStats i LeastState, aby zidentyfikować obiekty blob z dzierżawami na nich. Po zidentyfikowaniu obiektów blob przejrzyj listę i sprawdź poprawność pliku kopii zapasowej przed usunięciem obiektu blob.

  2. Przerwij dzierżawę: Autoryzowane żądanie może przerwać dzierżawę bez podawania identyfikatora dzierżawy. Aby uzyskać więcej informacji, zobacz tutaj.

    Napiwek

    Program SQL Server wystawia identyfikator dzierżawy w celu ustanowienia wyłącznego dostępu podczas operacji przywracania. Identyfikator przywracania dzierżawy to BAC2BAC2BAC2BAC2BAC2BAC2BAC2BAC2.

  3. Usuń blob: Aby usunąć blob z aktywną dzierżawą, należy najpierw przerwać dzierżawę.

Przykładowy skrypt programu PowerShell

Ważny

Jeśli używasz programu PowerShell 2.0, mogą wystąpić problemy z ładowaniem zestawu microsoft WindowsAzure.Storage.dll. Zalecamy uaktualnienie programu PowerShell, aby rozwiązać problem. Możesz również użyć następującego obejścia, aby utworzyć lub zmodyfikować plik powershell.exe.config w celu załadowania zestawów .NET 2.0 i .NET 4.0 w czasie wykonywania przy użyciu poniższych instrukcji:

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

Poniższy przykładowy skrypt identyfikuje obiekty blob z aktywnymi dzierżawami, a następnie zrywa je. W tym przykładzie pokazano również, jak filtrować identyfikatory zwolnienia dzierżawy.

Porady dotyczące uruchamiania tego skryptu

Ostrzeżenie

Jeśli kopia zapasowa w usłudze Azure Blob Storage jest uruchomiona w tym samym czasie co ten skrypt, tworzenie kopii zapasowej może zakończyć się niepowodzeniem, ponieważ ten skrypt spowoduje przerwanie dzierżawy, którą kopia zapasowa próbuje uzyskać współbieżnie. Uruchom ten skrypt podczas okna konserwacji lub gdy żadne kopie zapasowe nie są uruchomione lub nie mają być uruchomione.

  • Przed uruchomieniem tego skryptu należy dodać wartości dla konta magazynu, klucza magazynu, kontenera oraz parametrów ścieżki i nazwy zestawu Azure Storage. Ścieżka magazynu to katalog instalacyjny wystąpienia programu SQL Server. Nazwa pliku zespołu magazynowego to Microsoft.WindowsAzure.Storage.dll.

  • Jeśli nie ma obiektów blob z zablokowanymi dzierżawami, powinien zostać wyświetlony następujący komunikat: There are no blobs with locked lease status

  • Jeśli istnieją bloby z zablokowanymi dzierżawami, powinny zostać wyświetlone następujące komunikaty: 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.i 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." }

Zobacz też

Kopia zapasowa SQL Server w URL – najlepsze praktyki i rozwiązywanie problemów