當您嘗試刪除存放在Microsoft Azure儲存體服務中的備份檔案時,可能發生【There is currently a lease on the blob and no lease ID was specified in the request.】

當您嘗試刪除存放在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(以下簡稱儲存體),這個功能讓您很容易就做到異地備份這件事情,但您可能在備份過程中因為網路中斷或取消備份作業,導致殘留在儲存體中的備份檔案刪不掉,發生如下圖的錯誤訊息。

image

若您檢視該備份檔案可以看到租用狀態(Lesase Status)為Locked,也就是因為該檔案仍在鎖定的狀態,導致您嘗試刪除時發生失敗。

image

解決方式

您可以用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。然後執行這個主控台應用程式,就可以順利直接把您刪不掉的備份檔案刪掉。

image

或是在命令列中直接執行該主控台應用程式,並傳入所需的引數也可以順利刪除遺留在儲存體中的備份檔案。

image

參考資料

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

Lease Blob