Loading...

Azure Storage - Undelete Soft-delete Objects

Azure Storage - Undelete Soft-delete Objects

Overview

 

Azure Storage supports soft delete to protect your data for Blob Storage and Azure Data Lake Storage Gen2. Soft delete allows you to recover data that has been deleted within a retention period. With public documentation Manage and restore soft-deleted blobs - Azure Storage | Microsoft Learn, we can recover a particular soft deleted file via portal, code and Powershell script. The documentation provides some Powershell examples to recover all soft-deleted objects. In some scenarios, you may want to undelete with Powershell scripts to undelete many blobs with certain conditions.

 

This article introduces 2 scripts that are used to undelete blobs with condition of path prefix and deletion time for both blob storage and Azure Data Lake Storage Gen2 respectively.

 

The scripts in this article are all tested with Powershell 7.2.6, Az.Storage 4.9.0. From documentation PowerShell Gallery | Az.Storage 4.9.0  ,if the Az.Storage module is less than 4.9.0, Az.Storage preview module is required. The Az CLI scripts are all tested with CLI version 2.40.0. For the version is less than 2.39.0, the extension storage-preview is required.

 

The Powershell version could be checked with $PSVersionTable.

jasoncao_0-1664530899978.png

Az.Storage module version could be checked with Get-InstalledModule.

jasoncao_1-1664530953498.png

Az CLI version could be checked with az version.

jasoncao_2-1664530988244.png

 

Azure Data Lake Storage Gen2

 

Powershell

  1. Below script is used to restore soft-deleted items that were deleted after a specific time. The sincedate could be specified with parameters $Year, $Month, $Day, $Hour, $Minute, $Second. Please note, the date relevant parameters are using current system environment time zone. If sincedate is not set, the script will restore all soft-deleted items.$storageAccountName = "xxx" $StorageAccountKey = "xxxx" #get context $ctx = New-AzStorageContext -StorageAccountName $storageAccountName -StorageAccountKey $StorageAccountKey $filesystemName= "xxx" $dirName="xxx" $MaxReturn = 100 $Token = $Null $Year = '' $Month='' $Day='' $Hour='0' $Minute='0' $Second = '0' If($Year -ne '' -and $Month -ne '' -and $Day -ne ''){ $sinceDate = Get-Date -Year $Year -Month $Month -Day $Day -Hour $Hour -Minute $Minute -Second $Second -AsUTC -ErrorAction Stop }else{ $sinceDate = (Get-Date -AsUTC).AddDays(-366) } write-host $sinceDate do { # list the deleted blobs in the path $DeletedItems= Get-AzDataLakeGen2DeletedItem -Context $ctx -FileSystem $filesystemName -Path $dirName -MaxCount $MaxReturn -ContinuationToken $Token #get all deleted items write-host "========================================" write-host "Soft deleted items: " $DeletedItems.Path $Token = $DeletedItems[$DeletedItems.Count-1].ContinuationToken $DeletedItems| Where-Object {$_.DeletedOn -ge [DateTime] $sinceDate} |Restore-AzDataLakeGen2DeletedItem #restore the items that meet the criteria }while ($Token -ne '') ​
  2. Below script is used to restore soft-deleted items that item path is in a specific pattern. $pathexpression is used to specify the pattern. It supports wildcard expression(*,?,[]). If the pathexpression is not set, it will restore all soft delete items.

    $storageAccountName = "xxx" $StorageAccountKey = "xxx" #get context $ctx = New-AzStorageContext -StorageAccountName $storageAccountName -StorageAccountKey $StorageAccountKey $filesystemName= "xxxx" $dirName="xxx" $pathexpression= '' #pathexpression, a wildcard expression (containing *, ?, and [ ])like 'xxx*', if not setting, recover all soft delete blobs $MaxReturn = 100 $Token = $Null if($pathexpression -eq ''){ $pathexpression = '*' } write-host $pathexpression do { # list the deleted blobs in the path $DeletedItems= Get-AzDataLakeGen2DeletedItem -Context $ctx -FileSystem $filesystemName -Path $dirName -MaxCount $MaxReturn -ContinuationToken $Token write-host "========================================" write-host "Soft deleted items: " $DeletedItems.Path $Token = $DeletedItems[$DeletedItems.Count-1].ContinuationToken $DeletedItems| Where-Object {$_.Path -like $pathexpression} |Restore-AzDataLakeGen2DeletedItem }while ($Token -ne '')

 

Az CLI

  1. Below script is used to restore soft-deleted items that were deleted after a specific time. The sincedate could be specified with parameters $Year, $Month, $Day, $Hour, $Minute, $Second. Please note, the date relevant parameters are using current system environment time zone. If sincedate is not set, the script will restore all soft-deleted items.$storageAccountName = "xxxx" $StorageAccountKey = "xxxx" $filesystemName= "xxx" $dirName="xxx" $c=0 $Year = '' $Month='' $Day='' $Hour='0' $Minute='0' $Second = '0' If($Year -ne '' -and $Month -ne '' -and $Day -ne ''){ $sinceDate = Get-Date -Year $Year -Month $Month -Day $Day -Hour $Hour -Minute $Minute -Second $Second -AsUTC -ErrorAction Stop }else{ $sinceDate = (Get-Date -AsUTC).AddDays(-366) } write-host $sinceDate If($dirName.Length -eq 0){ $DeletedItems= az storage fs list-deleted-path -f $filesystemName --account-key $storageAccountKey --account-name $storageAccountName }else{ $DeletedItems= az storage fs list-deleted-path -f $filesystemName --account-key $storageAccountKey --account-name $storageAccountName --path-prefix $dirName } $DeletedItemsJson = "$DeletedItems" | ConvertFrom-Json write-host "========================================" write-host "Soft deleted items: " Foreach($item in $DeletedItemsJson) { if($item.deletedTime.ToUniversalTime() -ge [DateTime] $sinceDate) { $item.name + " - " + $item.deletionId + " - " + $item.deletedTime.ToUniversalTime() az storage fs undelete-path -f $filesystemName --deleted-path-name $item.name --deletion-id $item.deletionId --account-key $storageAccountKey --account-name $storageAccountName $c++ } } write-host "A total of " $c " blobs were recovered"​
  2. Below script is used to restore soft-deleted items that item path is in a specific pattern. $pathexpression is used to specify the pattern. It supports wildcard expression(*,?,[]). If the pathexpression is not set, it will restore all soft delete items.$storageAccountName = "xxxx" $StorageAccountKey = "xxxx" $filesystemName= "xxxx" $dirName="xxxx" $pathexpression= '' #pathexpression, a wildcard expression (containing *, ?, and [ ])like 'xxx*', if not setting, recover all soft delete blobs $c=0 if($pathexpression -eq ''){ $pathexpression = '*' } If($dirName.Length -eq 0){ $DeletedItems= az storage fs list-deleted-path -f $filesystemName --account-key $storageAccountKey --account-name $storageAccountName }else{ $DeletedItems= az storage fs list-deleted-path -f $filesystemName --account-key $storageAccountKey --account-name $storageAccountName --path-prefix $dirName } $DeletedItemsJson = "$DeletedItems" | ConvertFrom-Json write-host "========================================" write-host "Soft deleted items: " Foreach($item in $DeletedItemsJson) { if($item.name -like $pathexpression) { $item.name + " - " + $item.deletionId + " - " + $item.deletedTime.ToUniversalTime() az storage fs undelete-path -f $filesystemName --deleted-path-name $item.name --deletion-id $item.deletionId --account-key $storageAccountKey --account-name $storageAccountName $c++ } } write-host "A total of " $c " blobs were soft deleted and recovered" ​

 

Blob Storage (Below scripts are only work for no versioning enabled accounts, if you would like to restore soft-deleted items with versioning enabled, please check related documentation)

 

  1. Below script is used to restore soft-deleted items that were deleted after a specific time. The sincedate could be specified with parameters $Year, $Month, $Day, $Hour, $Minute, $Second. Please note, the date relevant parameters are using current system environment time zone. If sincedate is not set, the script will restore all soft-deleted items.$storageAccountName = "xxx" $StorageAccountKey = "xxx" $storageContainer = "xxx" #get context $ctx = New-AzStorageContext -StorageAccountName $storageAccountName -StorageAccountKey $StorageAccountKey $MaxReturn = 100 $Token = $Null $Year = '' $Month='' $Day='' $Hour='0' $Minute='0' $Second = '0' If($Year -ne '' -and $Month -ne '' -and $Day -ne ''){ $sinceDate = Get-Date -Year $Year -Month $Month -Day $Day -Hour $Hour -Minute $Minute -Second $Second -AsUTC -ErrorAction Stop }else{ $sinceDate = (Get-Date -AsUTC).AddDays(-366) } write-host $sinceDate do { # get a list of all of the blobs in the container $Blobs = Get-AzStorageBlob -Container $storageContainer -Context $ctx -IncludeDeleted -MaxCount $MaxReturn -ContinuationToken $Token write-host "========================================" write-host "All Blobs including soft deleted ones: " $Blobs.Name $DeletedBlobs = $Blobs | Where-Object { ($_.ICloudBlob.Properties.DeletedTime -ge $sinceDate) -and ($_.IsDeleted -eq $true)} if($DeletedBlobs.Count -gt 0){ $DeletedBlobs.BlobBaseClient.Undelete() } $Token = $Blobs[$Blobs.Count -1].ContinuationToken; }while ($Token -ne $Null) ​
  2. Below script is used to restore soft-deleted items that item path is in a specific pattern. $pathexpression is used to specify the pattern. It supports wildcard expression(*,?,[]). If the pathexpression is not set, it will restore all soft delete items.$storageAccountName = "xxx" $StorageAccountKey = "xxxx" $storageContainer = "xxx" #get context $ctx = New-AzStorageContext -StorageAccountName $storageAccountName -StorageAccountKey $StorageAccountKey $nameexpression= '' #nameexpression, a wildcard expression (containing *, ?, and [ ])like 'xxx*', if not setting, recover all soft delete blobs $MaxReturn = 100 $Token = $Null if($nameexpression -eq ''){ $nameexpression = '*' } do { # get a list of all of the blobs in the container $Blobs = Get-AzStorageBlob -Container $storageContainer -Context $ctx -IncludeDeleted -MaxCount $MaxReturn -ContinuationToken $Token write-host "========================================" write-host "All Blobs including soft deleted ones: " $Blobs.Name $DeletedBlobs = $Blobs | Where-Object { ($_.Name -Like $nameexpression) -and ($_.IsDeleted -eq $true)} if($DeletedBlobs.Count -gt 0){ $DeletedBlobs.BlobBaseClient.Undelete() } $Token = $Blobs[$Blobs.Count -1].ContinuationToken; }while ($Token -ne $Null) ​

 

Related documentation

 

https://learn.microsoft.com/en-us/azure/storage/blobs/soft-delete-blob-overview

Azure Storage Explorer soft delete guide | Microsoft Learn

https://learn.microsoft.com/en-us/azure/storage/blobs/blob-powershell#restore-a-deleted-blob

Manage and restore soft-deleted blobs - Azure Storage | Microsoft Learn

Published on:

Learn more
Need help with this product?

We can help you with Azure Storage - Undelete Soft-delete Objects

If you want help implementing, troubleshooting, or improving this product, contact us and we’ll point you in the right direction.

Azure PaaS Blog articles
Azure PaaS Blog articles

Azure PaaS Blog articles

Share post:

Related posts

Azure Storage - TLS 1.0 and 1.1 retirement

Overview TLS 1.0 and 1.1 retirement on Azure Storage was previously announced for Nov 1st, 2024, and it was postponed recently to 1 year later...

1 year ago

Efficient Management of Append and Page Blobs Using Azure Storage Actions

  Overview In Azure Storage, Blob Lifecycle Management (BLM) allows you to automate the management of your data based on rules defined by...

1 year ago

[Azure AI Search] Internal Server Error when creating CMK encrypted objects

Scenario Customers follow the Microsoft doc to create CMK encrypted objects (data source, index etc.), but get the 500 Internal Serv...

1 year ago

Optimizing Azure Table Storage: Automated Data Cleanup using a PowerShell script with Azure Automate

Scenario This blog’s aim is to manage Table Storage data efficiently. Imagine you have a large Azure Table Storage that accumulates logs from ...

1 year ago

Optimizing Azure Table Storage: Automated Data Clean-up using a PowerShell script with Azure Automat

Scenario This blog’s aim is to manage Table Storage data efficiently. Imagine you have a large Azure Table Storage that accumulates logs from ...

1 year ago

Restoring Soft-Deleted Blobs with multithreading in Azure Storage Using C#

Blob soft delete is an essential feature that safeguards your data against accidental deletions or overwrites. By retaining deleted data for a...

1 year ago

Performing simple Azure Table Storage REST API operations using curl command.

The blog provides guidance to perform simple Table Storage REST API operations such as Create table, Delete Table, Insert entity, Delete entit...

1 year ago

Bulk delete all the old jobs from the batch account

Deleting a Job also deletes all Tasks that are part of that Job, and all Job statistics. This also overrides the retention period for Task dat...

1 year ago

Utilizing Azure Storage and Runbooks for scheduled automated backups of Azure SQL Databases

In this article, we are going to provide detailed steps to create a scheduled Azure SQL Database backup to storage account using automation. T...

2 years ago

[Azure Service Bus] JMS messages getting dead-lettered

The article discusses a problem where numerous messages end up in the dead letter queue (DLQ) when the JMS service bus consumer connects to th...

2 years ago

Newsletter

Get the latest Dynamics 365 and Power Platform content in your inbox

A curated digest of community blogs, product news, videos, and podcasts — delivered without the noise.

Weekly updates Unsubscribe anytime Fresh community picks
We use your email only for the newsletter and you can unsubscribe at any time.
By subscribing, you agree to the privacy policy.