當您嘗試刪除存放在Microsoft Azure儲存體服務中的備份檔案時,可能發生【There is currently a lease on the blob and no lease ID was specified in the request.】
問題描述
SQL Server 2012 SP1 CU2開始支援將資料庫直接備份到Microsoft Azure Storage(以下簡稱儲存體),這個功能讓您很容易就做到異地備份這件事情,但您可能在備份過程中因為網路中斷或取消備份作業,導致殘留在儲存體中的備份檔案刪不掉,發生如下圖的錯誤訊息。
若您檢視該備份檔案可以看到租用狀態(Lesase Status)為Locked,也就是因為該檔案仍在鎖定的狀態,導致您嘗試刪除時發生失敗。
解決方式
您可以用PowerShell的方式來解除被鎖定在儲存體中的備份檔案,請參考SQL Server Backup to Cloud – Managing Interrupted backups一文,或是參考There is currently a lease on the blob and no lease ID was specified in the request這篇文章中所提到.NET程式碼來直接刪除被鎖定的檔案。筆者將該.NET程式碼以主控台應用程式來實作,並且稍作調整。
using System;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Auth;
using Microsoft.WindowsAzure.Storage.Blob;
using Microsoft.WindowsAzure.Storage.Blob.Protocol;
namespace UnlockLeaseStatus
{
class Program
{
static void Main(string[] args)
{
if (args.Length != 3)
Console.WriteLine("輸入引數數量錯誤。必須提供3個引數,第1個引數為儲存體帳戶名稱,第2個引數為主要或次要存取金鑰,第3個引數則是備份檔案在儲存體中的URL。");
else
{
string StorageAccountName = args[0];
string AccessKey = args[1];
string BackupFileUrl = args[2];
CloudStorageAccount account;
CloudStorageAccount.TryParse(string.Format("DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}", StorageAccountName, AccessKey), out account);
CloudBlobClient blobclient = new CloudBlobClient(account.BlobEndpoint, account.Credentials);
CloudPageBlob blob = new CloudPageBlob(new Uri(BackupFileUrl), account.Credentials);
blob.FetchAttributes();
if (blob.Properties.LeaseStatus == LeaseStatus.Locked)
{
blob.BreakLease();
blob.Delete(DeleteSnapshotsOption.None);
}
Console.WriteLine("解除鎖定成功。");
}
Console.ReadKey();
}
}
}
您只要將上述程式碼複製到您所建立的主控台應用程式,接著在專案的命令列引數中輸入3個引數,其中第1個引數為儲存體帳戶名稱,第2個引數為主要或次要存取金鑰,第3個引數則是備份檔案在儲存體中的URL。然後執行這個主控台應用程式,就可以順利直接把您刪不掉的備份檔案刪掉。
或是在命令列中直接執行該主控台應用程式,並傳入所需的引數也可以順利刪除遺留在儲存體中的備份檔案。
參考資料
SQL Server Backup to Cloud – Managing Interrupted backups
There is currently a lease on the blob and no lease ID was specified in the request