Управление блочными BLOB-объектами с помощью PowerShell
Хранилище BLOB-объектов поддерживает блочные, добавочные и страничные BLOB-объекты. Блочный BLOB-объекты оптимизированы для эффективной отправки больших объемов данных. Блочные BLOB-объекты идеально подходят для хранения изображений, документов и других типов данных, для которых не используются операции произвольного чтения и записи. В этой статье объясняется, как работать с блочными BLOB-объектами.
Необходимые компоненты
Подписка Azure. См. страницу бесплатной пробной версии Azure.
Модуль
Az
Azure PowerShell, который является рекомендуемой модулем PowerShell для взаимодействия с Azure. Чтобы начать работу с модулем Az PowerShell, ознакомьтесь со статьей Установка Azure PowerShell.
Настройка объекта контекста для инкапсуляции учетных данных
Каждый запрос к службе хранилища Azure должен быть авторизован. Вы можете авторизовать запрос из PowerShell с учетной записью Microsoft Entra или с помощью ключей доступа к учетной записи. В примерах этой статьи используется авторизация Microsoft Entra с объектами контекста. Объекты контекста инкапсулируют учетные данные Microsoft Entra и передают их во время последующих операций с данными.
Чтобы войти в учетную запись Azure с помощью учетной записи Microsoft Entra, откройте PowerShell и вызовите командлет Подключение-AzAccount.
#Connect to your Azure subscription
Connect-AzAccount
После установки подключения создайте контекст Azure. Проверка подлинности с помощью идентификатора Microsoft Entra ID автоматически создает контекст Azure для вашей подписки по умолчанию. В некоторых случаях после проверки подлинности может потребоваться получить доступ к ресурсам в другой подписке. Вы можете изменить подписку, связанную с текущим сеансом Azure, изменив контекст активного сеанса.
Чтобы использовать подписку по умолчанию, создайте контекст, вызвав командлет New-AzStorageContext
. -UseConnectedAccount
Включите параметр, чтобы операции с данными выполнялись с помощью учетных данных Microsoft Entra.
#Create a context object using Azure AD credentials
$ctx = New-AzStorageContext -StorageAccountName <storage account name> -UseConnectedAccount
Чтобы изменить подписки, извлеките объект контекста с помощью командлета Get-AzSubscription, а затем измените текущий контекст с помощью Set-AzContext. Дополнительные сведения см. в разделе Изменение активной подписки.
Создание контейнера
Все данные BLOB-объектов хранятся в контейнерах, поэтому перед отправкой данных требуется по крайней мере один ресурс контейнера. При необходимости используйте следующий пример для создания контейнера хранилища. Дополнительные сведения см. в статье Управление контейнерами BLOB-объектов с помощью PowerShell.
#Create a container object
$container = New-AzStorageContainer -Name "mycontainer" -Context $ctx
При использовании следующих примеров необходимо заменить значения заполнителей в квадратных скобках собственными значениями. Дополнительные сведения о входе в Azure с помощью PowerShell см. в разделе Вход с помощью Azure PowerShell.
Отправка BLOB-объекта
Чтобы отправить файл в блочный BLOB-объект, передайте необходимые значения параметров в командлет Set-AzStorageBlobContent
. Укажите путь и имя файла с помощью параметра -File
и имя контейнера с помощью параметра -Container
. Также необходимо указать ссылку на объект контекста с параметром -Context
.
Эта команда создает BLOB-объект, если он не существует, или запрос на подтверждение перезаписи, если он существует. Вы можете перезаписать файл без подтверждения, если передадите параметр -Force
в командлет.
В следующем примере задан параметр -File
для отправки одного файла с именем. Кроме того, в нем показано использование оператора конвейера PowerShell и командлет Get-ChildItem
для отправки нескольких файлов. Командлет Get-ChildItem
использует параметр -Path
, чтобы указать C:\Temp\*.png. Добавление подстановочного знака звездочки (*
) указывает все файлы с расширением .png в имени. Параметр -Recurse
выполняет поиск в каталоге Temp и его вложенных каталогах.
#Set variables
$path = "C:\temp\"
$containerName = "mycontainer"
$filename = "demo-file.txt"
$imageFiles = $path + "*.png"
$file = $path + $filename
#Upload a single named file
Set-AzStorageBlobContent -File $file -Container $containerName -Context $ctx
#Upload multiple image files recursively
Get-ChildItem -Path $imageFiles -Recurse | Set-AzStorageBlobContent -Container $containerName -Context $ctx
В результате отображаются имя учетной записи хранения, имя контейнера хранилища и список отправленных файлов.
AccountName: demostorageaccount, ContainerName: demo-container
Name BlobType Length ContentType LastModified AccessTier IsDeleted
---- -------- ------ ----------- ------------ ---------- ---------
demo-file.txt BlockBlob 222 application/octet-stream 2021-12-14 01:38:03Z Cool False
hello-world.png BlockBlob 14709 application/octet-stream 2021-12-14 01:38:03Z Cool False
hello-world2.png BlockBlob 12472 application/octet-stream 2021-12-14 01:38:03Z Cool False
hello-world3.png BlockBlob 13537 application/octet-stream 2021-12-14 01:38:03Z Cool False
Список больших двоичных объектов
Командлет Get-AzStorageBlob
используется для списка BLOB-объектов, которые хранятся в контейнере. Для определения области поиска можно использовать различные подходы. Используйте параметр -Container
и -Name
для вывода определенного BLOB-объекта в известном контейнере. Чтобы создать неотфильтрованный список всех BLOB-объектов в определенном контейнере, используйте только параметр -Container
без значения -Name
.
Ограничений на количество контейнеров и BLOB-объектов, которые может содержать учетная запись хранения, нет. Чтобы избежать извлечения тысяч BLOB-объектов, лучше ограничить объем возвращаемых данных. При извлечении нескольких BLOB-объектов с помощью параметра -Prefix
можно указать BLOB-объекты, имена которых начинаются с определенной строки. Вы также можете использовать -Name
параметр с диким карта для указания имен файлов или типов.
Параметр -MaxCount
можно использовать для ограничения числа неотфильтрованных BLOB-объектов, возвращаемых из контейнера. Предел обслуживания в 5000 BLOB-объектов накладывается на все ресурсы Azure. Это ограничение гарантирует, что извлекаются управляемые объемы данных, а производительность не влияет. Если количество возвращенных BLOB-объектов превышает значение -MaxCount
или предел обслуживания, возвращается маркер продолжения. Этот маркер позволяет использовать несколько запросов для извлечения любого количества BLOB-объектов. Дополнительные сведения можно найти в статье Перечисление ресурсов BLOB-объектов.
В следующем примере показано несколько подходов, которые используются для вывода списка BLOB-объектов. При первом подходе выводятся отдельные BLOB-ресурсы в определенном ресурсе контейнера. Второй подход использует дикую карта для перечисления всех .jpg
файлов с префиксом Луи. За счет параметра -MaxCount
поиск ограничивается пятью контейнерами. Третий способ использует параметры -MaxCount
и -ContinuationToken
для ограничения извлечения всех BLOB-объектов в контейнере.
#Set variables
$namedContainer = "named-container"
$demoContainer = "mycontainer"
$containerPrefix = "demo"
$maxCount = 1000
$total = 0
$token = $Null
#Approach 1: List all blobs in a named container
Get-AzStorageBlob -Container $namedContainer -Context $ctx
#Approach 2: Use a wildcard to list blobs in all containers
Get-AzStorageContainer -MaxCount 5 -Context $ctx | Get-AzStorageBlob -Blob "*louis*.jpg"
#Approach 3: List batches of blobs using MaxCount and ContinuationToken parameters
Do
{
#Retrieve blobs using the MaxCount parameter
$blobs = Get-AzStorageBlob -Container $demoContainer `
-MaxCount $maxCount `
-ContinuationToken $token `
-Context $ctx
$blobCount = 1
#Loop through the batch
Foreach ($blob in $blobs)
{
#To-do: Perform some work on individual blobs here
#Display progress bar
$percent = $($blobCount/$maxCount*100)
Write-Progress -Activity "Processing blobs" -Status "$percent% Complete" -PercentComplete $percent
$blobCount++
}
#Update $total
$total += $blobs.Count
#Exit if all blobs processed
If($blobs.Length -le 0) { Break; }
#Set continuation token to retrieve the next batch
$token = $blobs[$blobs.Count -1].ContinuationToken
}
While ($null -ne $token)
Write-Host "`n`n AccountName: $($ctx.StorageAccountName), ContainerName: $demoContainer `n"
Write-Host "Processed $total blobs in $namedContainer."
В первых двух подходах отображаются учетная запись хранения и имена контейнеров, а также список извлеченных BLOB-объектов. В третьем подходе отображается общее количество BLOB-объектов в именованном контейнере. BLOB-объекты извлекаются по пакетам, а в панели состояния отображается ход выполнения подсчета.
AccountName: demostorageaccount, ContainerName: named-container
Name BlobType Length ContentType LastModified AccessTier IsDeleted
---- -------- ------ ----------- ------------ ---------- ---------
index.txt BlockBlob 222 text/plain 2021-12-15 22:00:10Z Cool False
miles-davis.txt BlockBlob 23454 text/plain 2021-12-15 22:17:59Z Cool False
cab-calloway.txt BlockBlob 18419 text/plain 2021-12-15 22:17:59Z Cool False
benny-goodman.txt BlockBlob 17726 text/plain 2021-12-15 22:17:59Z Cool False
AccountName: demostorageaccount, ContainerName: demo-container
Name BlobType Length ContentType LastModified AccessTier IsDeleted
---- -------- ------ ----------- ------------ ---------- ---------
louis-armstrong.jpg BlockBlob 211482 image/jpeg 2021-12-14 01:38:03Z Cool False
louis-jordan.jpg BlockBlob 55766 image/jpeg 2021-12-14 01:38:03Z Cool False
louis-prima.jpg BlockBlob 290651 image/jpeg 2021-12-14 01:38:03Z Cool False
AccountName: demostorageaccount, ContainerName: demo-container
Processed 5257 blobs in demo-container.
Скачивание большого двоичного объекта
В зависимости от сценария использования с помощью командлета Get-AzStorageBlobContent
можно скачать один или несколько BLOB-объектов. Как и в большинстве операций, для обоих подходов требуется объект контекста.
Чтобы скачать один именованный BLOB-объект, можно вызвать командлет напрямую и предоставить значения для параметров -Blob
и -Container
. Большой двоичный объект загружается в рабочий каталог PowerShell по умолчанию, но можно указать альтернативное расположение. Чтобы изменить целевое расположение, с параметром -Destination
должен быть передан допустимый существующий путь. Так как операция не может создать назначение, она завершается ошибкой, если указанный путь не существует.
Чтобы скачать несколько BLOB-объектов, можно объединить командлет Get-AzStorageBlob
и оператор конвейера PowerShell. Сначала создайте список BLOB-объектов с помощью командлета Get-AzStorageBlob
. Затем воспользуйтесь оператором конвейера и командлетом Get-AzStorageBlobContent
для извлечения BLOB-объектов из контейнера.
В примере кода ниже приводится пример подхода для скачивания как одного, так и нескольких BLOB-объектов. Кроме того, предлагается упрощенный подход к поиску определенных файлов во всех контейнерах с помощью подстановочного знака. Так как некоторые среды могут содержать сотни тысяч ресурсов, рекомендуется использовать параметр -MaxCount
.
#Set variables
$containerName = "mycontainer"
$path = "C:\temp\downloads\"
$blobName = "demo-file.txt"
$fileList = "*.png"
$pipelineList = "louis*"
$maxCount = 10
#Download a single named blob
Get-AzStorageBlobContent -Container $containerName -Blob $blobName -Destination $path -Context $ctx
#Download multiple blobs using the pipeline
Get-AzStorageBlob -Container $containerName -Blob $fileList -Context $ctx | Get-AzStorageBlobContent
#Use wildcard to download blobs from all containers
Get-AzStorageContainer -MaxCount $maxCount `
-Context $ctx | Get-AzStorageBlob `
-Blob "louis*" | Get-AzStorageBlobContent
В результате отображаются имена учетной записи хранения и контейнера, а также список загруженных файлов.
AccountName: demostorageaccount, ContainerName: demo-container
Name BlobType Length ContentType LastModified AccessTier IsDeleted
---- -------- ------ ----------- ------------ ---------- ---------
demo-file.txt BlockBlob 222 application/octet-stream 2021-12-14 01:38:03Z Unknown False
hello-world.png BlockBlob 14709 application/octet-stream 2021-12-14 01:38:03Z Unknown False
hello-world2.png BlockBlob 12472 application/octet-stream 2021-12-14 01:38:03Z Unknown False
hello-world3.png BlockBlob 13537 application/octet-stream 2021-12-14 01:38:03Z Unknown False
AccountName: demostorageaccount, ContainerName: public-container
Name BlobType Length ContentType LastModified AccessTier IsDeleted
---- -------- ------ ----------- ------------ ---------- ---------
louis-armstrong.jpg BlockBlob 211482 image/jpeg 2021-12-14 18:56:03Z Unknown False
AccountName: demostorageaccount, ContainerName: read-only-container
Name BlobType Length ContentType LastModified AccessTier IsDeleted
---- -------- ------ ----------- ------------ ---------- ---------
louis-jordan.jpg BlockBlob 55766 image/jpeg 2021-12-14 18:56:21Z Unknown False
AccountName: demostorageaccount, ContainerName: hidden-container
Name BlobType Length ContentType LastModified AccessTier IsDeleted
---- -------- ------ ----------- ------------ ---------- ---------
louis-prima.jpg BlockBlob 290651 image/jpeg 2021-12-14 18:56:45Z Unknown False
Управление свойствами и метаданными BLOB-объектов
Контейнер содержит как системные свойства, так и пользовательские метаданные. Системные свойства есть у каждого ресурса Хранилища BLOB-объектов. Некоторые свойства доступны только для чтения, а другие можно прочитать и записать. На самом деле, некоторые системные свойства соответствуют определенным стандартным заголовкам HTTP.
Определяемые пользователем метаданные состоят из одной или нескольких пар "имя-значение", которые можно указать для ресурса Хранилища BLOB-объектов. Метаданные можно использовать для хранения этих значений с ресурсом. Значения метаданных предназначены только для ваших собственных целей и не влияют на поведение ресурса.
Чтение свойств BLOB-объектов
Чтобы прочитать свойства или метаданные BLOB-объекта, необходимо сначала извлечь его из службы. Используйте командлет Get-AzStorageBlob
для извлечения свойств и метаданных BLOB-объекта, но не его содержимого. Затем используйте метод BlobClient.GetProperties
для получения свойств BLOB-объекта. Затем свойства или метаданные можно прочитать или установить.
В следующем примере извлекается BLOB-объект и перечисляются его свойства.
$blob = Get-AzStorageBlob -Blob "blue-moon.mp3" -Container "mycontainer" -Context $ctx
$properties = $blob.BlobClient.GetProperties()
Echo $properties.Value
В результате отображается список свойств большого двоичного объекта, как показано в следующем примере.
LastModified : 11/16/2021 3:42:07 PM +00:00
CreatedOn : 11/16/2021 3:42:07 PM +00:00
Metadata : {}
BlobType : Block
LeaseDuration : Infinite
LeaseState : Available
LeaseStatus : Unlocked
ContentLength : 2163298
ContentType : audio/mpeg
ETag : 0x8D9C0AA9E0CBA78
IsServerEncrypted : True
AccessTier : Cool
IsLatestVersion : False
TagCount : 0
ExpiresOn : 1/1/0001 12:00:00 AM +00:00
LastAccessed : 1/1/0001 12:00:00 AM +00:00
HasLegalHold : False
Чтение и запись метаданных BLOB-объекта
Метаданные BLOB-объекта — это необязательный набор пар имен и значений, связанных с BLOB-объектом. Как показано в предыдущем примере, метаданные изначально не связаны с BLOB-объектом, но их можно добавить при необходимости. Чтобы обновить метаданные большого BlobClient.UpdateMetadata
двоичного объекта, используйте этот метод. Этот метод принимает только пары "ключ-значение", хранящиеся в обобщенном объекте IDictionary
. Дополнительные сведения см. в определении класса BlobClient.
В приведенном ниже примере сначала обновляются, а затем фиксируются метаданные BLOB-объекта, после чего они извлекаются. Пример BLOB-объекта удаляется из памяти, чтобы метаданные не считывались из объекта в памяти.
#Set variable
$container = "mycontainer"
$blobName = "blue-moon.mp3"
#Retrieve blob
$blob = Get-AzStorageBlob -Blob $blobName -Container $container -Context $ctx
#Create IDictionary, add key-value metadata pairs to IDictionary
$metadata = New-Object System.Collections.Generic.Dictionary"[String,String]"
$metadata.Add("YearWritten","1934")
$metadata.Add("YearRecorded","1958")
$metadata.Add("Composer","Richard Rogers")
$metadata.Add("Lyricist","Lorenz Hart")
$metadata.Add("Artist","Tony Bennett")
#Update metadata
$blob.BlobClient.SetMetadata($metadata, $null)
#Flush blob from memory, retrieve updated blob, retrieve properties
$blob = $null
$blob = Get-AzStorageBlob -Blob $blobName -Container $container -Context $ctx
$properties = $blob.BlobClient.GetProperties()
#Display metadata
Echo $properties.Value.Metadata
Результат возвращает обновленные метаданные большого двоичного объекта, как показано в следующем примере.
Key Value
--- -----
YearWritten 1934
YearRecorded 1958
Composer Richard Rogers
Lyricist Lorenz Hart
Artist Tony Bennett
Операции копирование BLOB-объектов
Существует множество сценариев, в которых можно копировать BLOB-объекты разных типов. В этой статье рассматриваются только блочные BLOB-объекты.
Копирование исходного BLOB-объекта в целевой BLOB-объект
Для упрощенной операции копирования в пределах одной учетной записи хранения используйте командлет Copy-AzStorageBlob
. Так как операция копирует BLOB-объект в пределах одной учетной записи хранения, это синхронная операция. Операции копирования между учетными записями асинхронны.
Для повышения удобства и производительности рассмотрите возможность использования AzCopy, особенно при копировании BLOB-объектов между учетными записями хранения. AzCopy — это служебная программа командной строки, которую можно использовать для копирования больших двоичных объектов или файлов в учетную запись хранения или из нее. Узнайте больше о том, как начать работу с AzCopy.
В примере ниже BLOB-объект bannerphoto.png копируется из контейнера photos в папку photos в контейнере archive. Оба контейнера существуют в одной учетной записи хранения. Результат проверяет успешность копирования.
$blobname = "bannerphoto.png"
Copy-AzStorageBlob -SrcContainer "photos" `
-SrcBlob $blobname -DestContainer "archive" `
-DestBlob $("photos/$blobname") -Context $ctx
AccountName: demostorageaccount, ContainerName: archive
Name BlobType Length ContentType LastModified AccessTier IsDeleted VersionId
---- -------- ------ ----------- ------------ ---------- --------- ---------
photos/bannerphoto BlockBlob 12472 image/png 2021-11-27 23:11:43Z Cool False
Вы можете использовать параметр -Force
, чтобы перезаписать существующий BLOB-объект с тем же именем в месте назначения. Эта операция фактически заменяет целевой BLOB-объект. Она также приводит к удалению всех незафиксированных блоков и перезаписи метаданных целевого большого двоичного объекта.
Копирование моментального снимка в целевой BLOB-объект с другим именем
Результирующий целевой большой двоичный объект не станет моментальным снимком, а будет большим двоичным объектом, доступным для записи.
Исходный большой двоичный объект для операции копирования может быть блочным, добавочным, страничным либо представлять собой моментальный снимок. Если BLOB-объект назначения уже существует, он должен иметь тот же тип BLOB-объекта, что и BLOB-объект источника. Существующий целевой большой двоичный объект перезаписывается.
Целевой большой двоичный объект невозможно изменить во время выполнения операции копирования. Большой двоичный объект может быть целью только одной невыполненной операции копирования. Иными словами, один большой двоичный объект невозможно назначить нескольким ожидающим операциям копирования.
Копирование большого двоичного объекта в ту же учетную запись хранения — это синхронная операция. Операции копирования между учетными записями являются асинхронными.
Всегда копируется весь исходный большой двоичный объект или файл. Копирование диапазона байтов или набора блоков не поддерживается.
При копировании BLOB-объекта в целевой BLOB-объект копируются приведенные ниже системные свойства с теми же значениями.
В нем также показано, как прервать асинхронную операцию копирования.
Создание моментального снимка BLOB-объекта
Моментальный снимок — это версия BLOB-объекта только для чтения, сделанная в определенный момент времени. Моментальный снимок большого двоичного объекта идентичен базовому BLOB-объекту, за исключением того, что значение DateTime добавляется к URI. Это значение указывает время создания моментального снимка и предлагает единственное различие между базовым BLOB-объектом и моментальным снимком.
Свойства аренды, связанные с базовым BLOB-объектом, не влияют на моментальный снимок. Вы не можете получить аренду на моментальном снимке. См. дополнительные сведения о моментальных снимках BLOB-объектов.
Следующий пример кода извлекает BLOB-объект из контейнера хранилища и создает его моментальный снимок.
$blob = Get-AzStorageBlob -Container "manuscripts" -Blob "novels/fast-cars.docx" -Context $ctx
$blob.BlobClient.CreateSnapshot()
Установка уровня BLOB-объекта
При изменении уровня BLOB-объекта он и все его данные перемещаются на целевой уровень. Чтобы внести изменения, получите большой двоичный объект с помощью командлета Get-AzStorageBlob
и вызовите BlobClient.SetAccessTier
метод. Этот подход можно использовать для изменения уровня между горячим, холодным и архивным.
Изменение уровней с холодного или горячего на архив происходит почти сразу. После перемещения большого двоичного объекта на архивный уровень он считается автономным и не может быть прочитан или изменен. Прежде чем вы сможете считывать или изменять архивные данные большого двоичного объекта, необходимо восстановить его на онлайн-уровне. Дополнительные сведения о повторном извлечении BLOB-объектов из архивного уровня.
Следующий пример кода задает уровень горячим для всех больших двоичных объектов в контейнере archive
.
$blobs = Get-AzStorageBlob -Container archive -Context $ctx
Foreach($blob in $blobs) {
$blob.BlobClient.SetAccessTier("Hot")
}
Операции, использующие теги BLOB-объектов
Теги индекса BLOB-объектов упрощают управление данными и их обнаружение. Теги индекса BLOB-объектов — это определяемые пользователем атрибуты индекса "ключ — значение", которые можно применять к BLOB-объектам. После настройки вы сможете классифицировать и находить объекты в отдельном контейнере или во всех контейнерах. Ресурсы BLOB-объектов можно динамически классифицировать, обновляя их теги индекса без изменений в организации контейнеров. Теги индексов предлагают гибкий способ справиться с изменением требований к данным. Метаданные и тег индекса можно использовать одновременно. Дополнительные сведения об тегах индекса см. в статье Управление данными BLOB-объектов Azure и их поиск с помощью тегов индекса BLOB-объектов.
В следующем примере показано, как добавить теги индекса к ряду BLOB-объектов. В этом примере считываются данные из XML-файла и используются для создания тегов индекса для нескольких BLOB-объектов. Чтобы использовать образец кода, создайте локальный файл blob-list.xml в каталоге C:\temp. XML-данные приведены в следующем примере.
<Venue Name="House of Prime Rib" Type="Restaurant">
<Files>
<File path="transactions/12027121.csv" />
<File path="campaigns/radio-campaign.docx" />
<File path="photos/bannerphoto.png" />
<File path="archive/completed/2020review.pdf" />
<File path="logs/2020/01/01/logfile.txt" />
</Files>
</Venue>
В примере кода создается хэш-таблица, и ей назначается переменная $tags. Затем с помощью командлетов Get-Content
и Get-Data
создается объект на основе структуры XML. После этого в хэш-таблицу добавляются пары "ключ-значение", которые будут использоваться в качестве значений тегов. Наконец, выполняется итерация по XML-объекту и создаются теги для каждого узла File
.
#Set variables
$filePath = "C:\temp\blob-list.xml"
$tags = @{}
#Get data, set tag key-values
[xml]$data = Get-Content -Path $filepath
$tags.Add("VenueName", $data.Venue.Name)
$tags.Add("VenueType", $data.Venue.Type)
#Loop through files and add tag
$data.Venue.Files.ChildNodes | ForEach-Object {
#break the path: container name, blob
$path = $_.Path -split "/",2
#set apply the blob tags
Set-AzStorageBlobTag -Container $location[0] -Blob $location[1] -Tag $tags -Context $ctx
}
удаление больших двоичных объектов.
С помощью комадлета Remove-AzStorageBlob
можно удалить один или нескольких BLOB-объектов. При удалении нескольких больших двоичных объектов можно использовать условные операции, циклы или конвейер PowerShell, как показано в следующих примерах.
Предупреждение
Выполнение приведенных ниже примеров может привести к необратимому удалению BLOB-объектов. Мы рекомендуем включить обратимое удаление для контейнеров, чтобы защитить их и BLOB-объекты от случайного удаления. Дополнительные сведения см. в статье Обратимое удаление для контейнеров.
#Create variables
$containerName = "mycontainer"
$blobName = "demo-file.txt"
$prefixName = "file"
#Delete a single, named blob
Remove-AzStorageBlob -Blob $blobName -Container $containerName -Context $ctx
#Iterate a loop, deleting blobs
for ($i = 1; $i -le 3; $i++) {
Remove-AzStorageBlob -Blob (-join($prefixName, $i, ".txt")) -Container $containerName -Context $ctx
}
#Retrieve blob list, delete using a pipeline
Get-AzStorageBlob -Prefix $prefixName -Container $containerName -Context $ctx | Remove-AzStorageBlob
В некоторых случаях удаленные BLOB-объекты можно восстановить. Если включен параметр защиты данных обратимого удаления учетной записи хранения, параметр возвращает большие двоичные объекты, -IncludeDeleted
удаленные в течение связанного периода хранения. Дополнительные сведения об обратимом удалении см. в статье Обратимое удаление для больших двоичных объектов.
Используйте следующий пример, чтобы получить список BLOB-объектов, удаленных в течение связанного периода хранения для контейнера. В результате будет показан список недавно удаленных BLOB-объектов.
#Retrieve a list of blobs including those recently deleted
Get-AzStorageBlob -Prefix $prefixName -IncludeDeleted -Context $ctx
AccountName: demostorageaccount, ContainerName: demo-container
Name BlobType Length ContentType LastModified AccessTier IsDeleted
---- -------- ------ ----------- ------------ ---------- ---------
file.txt BlockBlob 22 application/octet-stream 2021-12-16 20:59:41Z Cool True
file2.txt BlockBlob 22 application/octet-stream 2021-12-17 00:14:24Z Cool True
file3.txt BlockBlob 22 application/octet-stream 2021-12-17 00:14:24Z Cool True
file4.txt BlockBlob 22 application/octet-stream 2021-12-17 00:14:25Z Cool True
Восстановление удаленного BLOB-объекта
Как уже упоминалось в разделе Отображение списка больших двоичных объектов, вы можете настроить защиту данных с помощью обратимого удаления в учетной записи хранения. Если такая защита данных включена, то вы сможете восстановить BLOB-объекты, удаленные в течение связанного периода хранения. Вы также можете использовать управление версиями, чтобы сохранять предыдущие версии BLOB-объектов для каждого восстановления.
Если для обратимо удаленных больших двоичных объектов включены управление версиями и обратимое удаление, то при изменении, перезаписи, удалении и восстановлении большого двоичного объекта новая версия создается автоматически. Метод, используемый для восстановления удаленного большого двоичного объекта, зависит от того, включена ли управление версиями в учетной записи хранения.
В следующем примере кода восстанавливаются все обратимо удаленные большие двоичные объекты или, если включена поддержка управления версиями, восстанавливается последняя версия большого двоичного объекта. Сначала в нем с помощью командлета Get-AzStorageBlobServiceProperty
определяется, включено ли управление версиями.
Если управление версиями включено, Get-AzStorageBlob
командлет извлекает список всех уникальных именованных версий BLOB-объектов. Затем версии большого двоичного объекта в списке извлекаются и упорядочиваются по датам. Если с значением атрибута LatestVersion
не найдено ни одной версии, командлет Copy-AzBlob
используется для создания активной копии последней версии.
Если управление версиями отключено, метод BlobBaseClient.Undelete
используется для восстановления каждого обратимо удаленного большого двоичного объекта в контейнере.
Прежде чем следовать этому примеру, необходимо включить обратимое удаление или управление версиями по крайней мере одной из учетных записей хранения.
Важно!
В следующем примере перечисляется группа больших двоичных объектов и хранит их в памяти перед обработкой. Если управление версиями включено, большие двоичные объекты также отсортированы. Использование -ContinuationToken
параметра с $maxCount
переменной ограничивает количество больших двоичных объектов в группе для экономии ресурсов. Если контейнер имеет миллионы больших двоичных объектов, это будет чрезвычайно дорого. Вы можете настроить значение переменной $maxCount
, хотя если контейнер имеет миллионы больших двоичных объектов, скрипт будет обрабатывать большие двоичные объекты медленно.
Дополнительные сведения о защите данных с помощью обратимого удаления см. в статье Обратимое удаление для больших двоичных объектов.
$accountName ="myStorageAccount"
$groupName ="myResourceGroup"
$containerName ="mycontainer"
$maxCount = 1000
$token = $null
$blobSvc = Get-AzStorageBlobServiceProperty `
-StorageAccountName $accountName `
-ResourceGroupName $groupName
# If soft delete is enabled
if($blobSvc.DeleteRetentionPolicy.Enabled)
{
# If versioning is enabled
if($blobSvc.IsVersioningEnabled -eq $true)
{
# Set context
$ctx = New-AzStorageContext `
-StorageAccountName $accountName `
-UseConnectedAccount
do
{
# Get all blobs and versions using -Unique
# to avoid processing duplicates/versions
$blobs = Get-AzStorageBlob `
-Container $containerName `
-Context $ctx -IncludeVersion | `
Where-Object {$_.VersionId -ne $null} | `
Sort-Object -Property Name -Unique
# Iterate the collection
foreach ($blob in $blobs)
{
# Process versions
if($blob.VersionId -ne $null)
{
# Get all versions of the blob, newest to oldest
$delBlob = Get-AzStorageBlob `
-Container $containerName `
-Context $ctx `
-Prefix $blob.Name `
-IncludeDeleted -IncludeVersion | `
Sort-Object -Property VersionId -Descending
# Verify that the newest version is NOT the latest (that the version is "deleted")
if (-Not $delBlob[0].IsLatestVersion)
{
$delBlob[0] | Copy-AzStorageBlob `
-DestContainer $containerName `
-DestBlob $delBlob[0].Name
}
#Dispose the temporary object
$delBlob = $null
}
}
$token = $blobs[$blobs.Count -1].ContinuationToken;
}
while ($null -ne $token)
}
# Otherwise (if versioning is disabled)
else
{
$blobs = Get-AzStorageBlob `
-Container $containerName `
-Context $ctx -IncludeDeleted | `
Where-Object {$_.IsDeleted}
foreach($blob in $blobs)
{
if($blob.IsDeleted) { $blob.BlobBaseClient.Undelete() }
}
}
}
else
{
echo "Sorry, the delete retention policy is not enabled."
}