Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Saat mencadangkan atau memulihkan dari penyimpanan Azure, SQL Server mengambil masa sewa tak terbatas guna mengunci akses eksklusif ke blob. Ketika proses pencadangan atau pemulihan berhasil diselesaikan, hak sewa dilepas. 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 bahwa blob tidak dapat ditulis atau dihapus hingga sewa dilepaskan. Topik ini menjelaskan cara melepaskan 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 dibatalkan terlebih dahulu. Jika ada kegagalan pencadangan, kami menyarankan Anda untuk membersihkan sewa dan menghapus blob. Anda juga dapat memilih pembersihan secara berkala sebagai bagian dari tugas manajemen penyimpanan.
Jika ada kegagalan dalam proses pemulihan, pemulihan berikutnya tidak diblokir, dan oleh karena itu, sewa aktif mungkin tidak menjadi masalah. Membatalkan sewa hanya diperlukan ketika Anda harus menimpa atau menghapus blob.
Mengelola Blob Yatim Piatu
Langkah-langkah berikut menjelaskan cara membersihkan setelah aktivitas pencadangan atau pemulihan yang gagal. Semua langkah dapat dilakukan menggunakan skrip PowerShell. Contoh kode disediakan di bagian berikut:
Mengidentifikasi blob yang memiliki 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 yang memiliki sewa padanya. Setelah Anda mengidentifikasi blob, kami sarankan Anda meninjau daftar, verifikasi validitas file cadangan sebelum menghapus blob.
Melanggar sewa: Permintaan resmi dapat memutus sewa tanpa memberikan ID sewa. Lihat di sini untuk informasi selengkapnya.
Petunjuk / Saran
SQL Server mengeluarkan ID sewa untuk membuat akses eksklusif selama operasi pemulihan. ID sewa pemulihan BAC2BAC2BAC2BAC2BAC2BAC2BAC2BAC2.
Menghapus Blob: Untuk menghapus blob yang memiliki 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 ke Powershell 3.0 untuk menyelesaikan masalah. Anda juga dapat menggunakan solusi berikut untuk PowerShell 2.0:
Buat atau ubah 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 berikut mengilustrasikan mengidentifikasi blob yang memiliki sewa aktif lalu melanggarnya. Contohnya juga menunjukkan cara memfilter ID kontrak sewa yang dirilis.
Tips menjalankan skrip ini
Peringatan
Jika pencadangan ke layanan penyimpanan Azure Blob berjalan pada saat yang sama dengan skrip ini, pencadangan bisa gagal karena skrip ini akan menghentikan sewa yang coba diperoleh cadangan secara bersamaan. Sebaiknya jalankan skrip ini selama waktu pemeliharaan atau ketika tidak ada cadangan yang diperkirakan berjalan.
Saat menjalankan skrip ini, Anda akan diminta untuk menyediakan nilai untuk akun penyimpanan, kunci penyimpanan, kontainer, dan jalur perakitan penyimpanan Azure dan parameter nama. Jalur penyimpanan untuk assembly adalah direktori penginstalan dari instance SQL Server. Nama file untuk rakitan penyimpanan Microsoft.WindowsAzure.Storage.dll. Berikut ini adalah contoh perintah dan nilai yang dimasukkan:
cmdlet at command pipeline position 1 Supply values for the following parameters: storageAccount: mycloudstorageaccount storageKey: 0BopKY7eEha3gBnistYk+904nf blobContainer: mycontainer storageAssemblyPath: C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Binn\Microsoft.WindowsAzure.Storage.dllJika tidak ada blob yang memiliki sewa terkunci, Anda akan melihat pesan berikut:
Tidak ada blob dengan status sewa terkunci
Jika ada blob dengan sewa terkunci, Anda akan melihat pesan berikut:
Pembatalan Perjanjian Sewa
Kontrak sewa pada <URL Blob> adalah sewa pemulihan kembali: Anda akan melihat pesan ini hanya jika Anda memiliki blob dengan kontrak sewa pemulihan yang masih aktif.
Sewa pada <URL dari Blob> bukanlah sewa pemulihan. Memutuskan sewa pada <URL dari Bob>.
param(
[Parameter(Mandatory=$true)]
[string]$storageAccount,
[Parameter(Mandatory=$true)]
[string]$storageKey,
[Parameter(Mandatory=$true)]
[string]$blobContainer,
[Parameter(Mandatory=$true)]
[string]$storageAssemblyPath
)
# 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
$allBlobs = $container.ListBlobs()
$lockedBlobs = @()
# filter blobs that are have Lease Status as "locked"
foreach($blob in $allBlobs)
{
$blobProperties = $blob.Properties
if($blobProperties.LeaseStatus -eq "Locked")
{
$lockedBlobs += $blob
}
}
if ($lockedBlobs.Count -eq 0)
{
Write-Host " There are no blobs with locked lease status"
}
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
}
}
Lihat Juga
Praktik Terbaik dan Pemecahan Masalah Pencadangan SQL Server ke URL