Bagikan melalui


Hapus file blob cadangan dengan sewa aktif

Berlaku untuk:SQL Server

Saat mencadangkan atau memulihkan dari penyimpanan Microsoft Azure, SQL Server memperoleh sewa tak terbatas untuk mengunci akses eksklusif ke blob. Ketika proses pencadangan atau pemulihan berhasil diselesaikan, sewa akan dirilis. Jika pencadangan atau pemulihan gagal, proses pencadangan mencoba membersihkan blob yang tidak valid. Namun, jika pencadangan gagal karena kegagalan konektivitas jaringan yang berkepanjangan atau berkelanjutan, proses pencadangan mungkin tidak dapat memperoleh akses ke blob dan blob mungkin tetap yatim piatu. Ini berarti blob tidak dapat ditulis atau dihapus hingga sewa dilepaskan. Topik ini menjelaskan cara melepaskan (memutus) sewa dan menghapus blob.

Untuk informasi selengkapnya tentang jenis sewa, baca artikel ini.

Jika operasi pencadangan gagal, itu dapat mengakibatkan file cadangan yang tidak valid. File blob cadangan mungkin juga memiliki sewa aktif, mencegahnya dihapus atau ditimpa. Untuk menghapus atau menimpa blob tersebut, sewa harus terlebih dahulu dirilis (rusak). Jika ada kegagalan pencadangan, kami sarankan Anda membersihkan sewa dan menghapus blob. Anda juga dapat secara berkala membersihkan sewa dan menghapus blob sebagai bagian dari tugas manajemen penyimpanan Anda.

Jika ada kegagalan pemulihan, pemulihan berikutnya tidak diblokir, sehingga sewa aktif mungkin bukan masalah. Melanggar sewa hanya diperlukan ketika Anda harus menimpa atau menghapus blob.

Mengelola blob tanpa sumber

Langkah-langkah berikut menjelaskan cara membersihkan setelah aktivitas pencadangan atau pemulihan yang gagal. Anda dapat melakukan semua langkah menggunakan skrip PowerShell. Bagian berikut ini menyertakan contoh skrip PowerShell:

  1. Identifikasi blob dengan sewa: Jika Anda memiliki skrip atau proses yang menjalankan proses pencadangan, Anda mungkin dapat menangkap kegagalan dalam skrip atau proses dan menggunakannya untuk membersihkan blob. Anda juga dapat menggunakan properti LeaseStats dan LeastState untuk mengidentifikasi blob dengan sewa pada properti tersebut. Setelah Anda mengidentifikasi blob, tinjau daftar dan verifikasi validitas file cadangan sebelum menghapus blob.

  2. Memutus sewa: Permintaan resmi dapat memutus sewa tanpa memberikan ID sewa. Lihat di sini untuk informasi selengkapnya.

    Tip

    SQL Server mengeluarkan ID sewa untuk membuat akses eksklusif selama operasi pemulihan. ID sewa pemulihan adalah BAC2BAC2BAC2BAC2BAC2BAC2BAC2BAC2BAC2BAC2.

  3. Hapus Blob: Untuk menghapus blob dengan sewa aktif, Anda harus terlebih dahulu memutuskan sewa.

Contoh skrip PowerShell

Penting

Jika Anda menjalankan PowerShell 2.0, Anda mungkin mengalami masalah saat memuat rakitan Microsoft WindowsAzure.Storage.dll. Kami menyarankan agar Anda memutakhirkan Powershell untuk menyelesaikan masalah. Anda juga dapat menggunakan solusi berikut untuk membuat atau memodifikasi file powershell.exe.config untuk memuat rakitan .NET 2.0 dan .NET 4.0 pada runtime dengan yang berikut:

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

Contoh skrip berikut mengidentifikasi blob dengan sewa aktif lalu memutusnya. Contohnya juga menunjukkan bagaimana filter untuk ID sewa rilis.

Tips menjalankan skrip ini

Peringatan

Jika pencadangan ke Azure Blob Storage berjalan pada saat yang sama dengan skrip ini, pencadangan dapat gagal karena skrip ini akan memutuskan sewa yang coba diperoleh cadangan secara bersamaan. Jalankan skrip ini selama jendela pemeliharaan atau ketika tidak ada cadangan yang berjalan atau diharapkan berjalan.

  • Sebelum menjalankan skrip ini, Anda harus menambahkan nilai untuk akun penyimpanan, kunci penyimpanan, kontainer, dan jalur perakitan penyimpanan Azure dan parameter nama. Jalur penyimpanan adalah assembly adalah direktori penginstalan instans SQL Server. Nama file untuk perakitan penyimpanan adalah Microsoft.WindowsAzure.Storage.dll.

  • Jika tidak ada blob dengan sewa terkunci, Anda akan melihat pesan berikut: There are no blobs with locked lease status

  • Jika ada blob dengan sewa terkunci, Anda akan melihat pesan berikut: 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.dan 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." }

Baca juga

Pencadangan SQL Server ke Praktik Terbaik url dan Pemecahan Masalah