将存档的 Blob 解冻到联机层
本文内容
若要读取存档层中的 Blob,必须先将该 Blob 解除冻结到联机层(热层、冷层或寒层)。 可以通过以下两种方式之一解除冻结 Blob:
在解除冻结 blob 时,可以将操作优先级指定为标准优先级或高优先级。 标准优先级解除冻结操作可能需要 15 个小时才能完成。 高优先级操作的优先级高于标准优先级请求,对于大小不到 10 GB 的对象,可以在一小时内完成。 操作挂起时,可以将解除冻结优先级从“标准”更改为“高” 。
你可以配置 Azure 事件网格,用于在解除冻结完成时触发事件,并运行应用程序代码进行响应。 若要了解如何在 Blob 解除冻结操作完成后处理运行 Azure 函数的事件,请参阅运行 Azure 函数以响应 Blob 解除冻结事件 。
有关解除冻结 Blob 的详细信息,请参阅存档层中的 Blob 解除冻结 。
使用复制操作解除冻结 Blob
若要通过将 Blob 从存档层复制到联机层来解除冻结 Blob,请使用 Azure 门户、PowerShell、Azure CLI 或任一 Azure 存储客户端库。 请注意,当你将存档的 Blob 复制到联机层时,源 Blob 和目标 Blob 必须使用不同的名称。
支持在同一存储帐户中将存档的 Blob 复制到联机目标层。 从服务版本 2021-02-12 开始,只要目标帐户与源帐户位于同一区域中,就可以将存档的 Blob 复制到其他存储帐户。
复制操作完成后,目标 Blob 将显示在存档层中。 然后,目标 Blob 将被解除冻结到你在复制操作中指定的联机层。 目标 Blob 完全解除冻结后,它将在新的联机层中可用。
将 Blob 解除冻结到同一存储帐户
以下示例展示了如何将存档的 Blob 复制到同一存储帐户的热层中的 Blob。
在 Azure 门户中,转到源存储帐户。
在存储帐户的导航窗格中,选择“存储浏览器 ”。
在存储浏览器中,导航到存档 Blob 的位置,选中 Blob 旁边显示的复选框,然后选择“复制 ”按钮。
导航到要在其中放置已解除冻结 Blob 的容器,然后选择“粘贴 ”按钮。
此时将显示“粘贴存档 Blob ”对话框。
注意
如果在与源 Blob 位于同一位置时选择“粘贴 ”按钮,则“目标 Blob 名称 ”字段中显示的默认名称将包含数字后缀。 这可确保源 Blob 和目标 Blob 具有不同的名称。 如果需要,只要名称不同于源 Blob 的名称,就可以更改此名称。
在“粘贴存档 Blob ”对话框中,选择访问层和解除冻结优先级。 然后,选择“粘贴 ”以解除冻结 Blob。
若要使用 PowerShell 将存档的 Blob 复制到联机层,请调用 Start-AzStorageBlobCopy 命令,并指定目标层和解除冻结优先级。 请记得将尖括号中的占位符替换为你自己的值:
# Initialize these variables with your values.
$rgName = "<resource-group>"
$accountName = "<storage-account>"
$srcContainerName = "<source-container>"
$destContainerName = "<dest-container>"
$srcBlobName = "<source-blob>"
$destBlobName = "<dest-blob>"
# Get the storage account context
$ctx = (Get-AzStorageAccount `
-ResourceGroupName $rgName `
-Name $accountName).Context
# Copy the source blob to a new destination blob in hot tier with Standard priority.
Start-AzStorageBlobCopy -SrcContainer $srcContainerName `
-SrcBlob $srcBlobName `
-DestContainer $destContainerName `
-DestBlob $destBlobName `
-StandardBlobTier Hot `
-RehydratePriority Standard `
-Context $ctx
若要使用 Azure CLI 将存档的 Blob 复制到联机层,请调用 az storage blob copy start 命令,并指定目标层和解除冻结优先级。 请记得将尖括号中的占位符替换为你自己的值:
az storage blob copy start \
--source-container <source-container> \
--source-blob <source-blob> \
--destination-container <dest-container> \
--destination-blob <dest-blob> \
--account-name <storage-account> \
--tier hot \
--rehydrate-priority standard \
--auth-mode login
将 Blob 解除冻结到同一区域中的其他存储帐户
以下示例展示了如何将存档的 Blob 复制到其他存储帐户的热层中的 Blob。
在 Azure 门户中,转到源存储帐户。
在存储帐户的导航窗格中,选择“存储浏览器 ”。
在存储浏览器中,导航到存档 Blob 的位置,选中 Blob 旁边显示的复选框,然后选择“复制 ”按钮。
导航到目标存储帐户,并在导航窗格中选择“存储浏览器 ”。
导航到要在其中放置已解除冻结 Blob 的容器,然后选择“粘贴 ”按钮。
此时将显示“粘贴存档 Blob ”对话框。
在“粘贴存档 Blob ”对话框中,选择访问层和解除冻结优先级。 然后,选择“粘贴 ”以解除冻结 Blob。
若要使用 PowerShell 将存档的 Blob 复制到其他存储帐户的联机层中的 Blob,请确保已安装 Az.Storage 模块版本 4.4.0 或更高版本。 接下来,调用 Start-AzStorageBlobCopy 命令,并指定目标联机层和解除冻结优先级。 必须为存档的源 Blob 指定具有读取权限的共享访问签名 (SAS)。
以下示例展示了如何将存档的 Blob 复制到其他存储帐户的热层。 请记得将尖括号中的占位符替换为你自己的值:
$rgName = "<resource-group>"
$srcAccount = "<source-account>"
$destAccount = "<dest-account>"
$srcContainer = "<source-container>"
$destContainer = "<dest-container>"
$srcBlob = "<source-blob>"
$destBlob = "<destination-blob>"
# Get the destination account context
$destCtx = New-AzStorageContext -StorageAccountName $destAccount -UseConnectedAccount
# Get the source account context
$srcCtx = New-AzStorageContext -StorageAccountName $srcAccount -UseConnectedAccount
# Get the SAS URI for the source blob
$srcBlobUri = New-AzStorageBlobSASToken -Container $srcContainer `
-Blob $srcBlob `
-Permission rwd `
-ExpiryTime (Get-Date).AddDays(1) `
-FullUri `
-Context $srcCtx
# Start the cross-account copy operation
Start-AzStorageBlobCopy -AbsoluteUri $srcBlobUri `
-DestContainer $destContainer `
-DestBlob $destBlob `
-DestContext $destCtx `
-StandardBlobTier Hot `
-RehydratePriority Standard
若要使用 Azure CLI 将存档的 Blob 复制到其他存储帐户的联机层中的 Blob,请确保已安装版本 2.35.0 或更高版本。 接下来,调用 az storage blob copy start 命令,并指定目标联机层和解除冻结优先级。 必须为存档的源 Blob 指定具有读取权限的共享访问签名 (SAS)。
以下示例展示了如何将存档的 Blob 复制到其他存储帐户的热层。 请记得将尖括号中的占位符替换为你自己的值:
# Specify the expiry interval
end=`date -u -d "1 day" '+%Y-%m-%dT%H:%MZ'`
# Get a SAS for the source blob
srcBlobUri=$(az storage blob generate-sas \
--account-name <source-account> \
--container <source-container> \
--name <archived-source-blob> \
--permissions rwd \
--expiry $end \
--https-only \
--full-uri \
--as-user \
--auth-mode login | tr -d '"')
# Copy to the destination blob in the hot tier
az storage blob copy start \
--source-uri $srcBlobUri \
--account-name <dest-account> \
--destination-container <dest-container> \
--destination-blob <dest-blob> \
--tier Hot \
--rehydrate-priority Standard \
--auth-mode login
从次要区域解除冻结
如果将存储帐户配置为使用读取访问异地冗余存储 (RA-GRS),则可以将位于次要区域中已存档的 blob 复制到位于同一次要区域中不同存储帐户中的联机层。
若要从次要区域解除冻结,请使用上一部分中介绍的相同指南(将 Blob 解除冻结到同一区域中的不同存储帐户 。 追加后缀 -secondary
到源终结点的帐户名称。 例如,如果 Blob 存储的主终结点是 myaccount.blob.core.chinacloudapi.cn
,则辅助终结点是 myaccount-secondary.blob.core.chinacloudapi.cn
。 存储帐户的帐户访问密钥对于主要终结点和次要终结点是相同的。
若要详细了解如何获取对次要区域的读取访问权限,请参阅对次要区域中数据的读取访问权限 。
通过更改 Blob 层解除冻结 Blob
若要通过将 Blob 从存档层更改为热层或冷层来解除冻结 Blob,请使用 Azure 门户、PowerShell 或 Azure CLI。
若要在 Azure 门户中将 Blob 层从存档层更改为热层或冷层,请执行以下步骤:
在 Azure 门户中找到要解除冻结的 Blob。
选择页面右侧的“更多”按钮。
选择“更改层”。
从“访问层”下拉菜单中选择目标访问层。
从“解除冻结优先级”下拉菜单中,选择所需的解除冻结优先级。 请注意,将“解除冻结优先级”设置为“高”通常会加快解除冻结速度,但同时也会增加成本。
选择“保存”按钮。
若要使用 PowerShell 将 Blob 层从存档层更改为热层或冷层,请使用 Blob 的 BlobClient 属性返回对 Blob 的 .NET 引用,然后对该引用调用 SetAccessTier 方法。 请记得将尖括号中的占位符替换为你自己的值:
# Initialize these variables with your values.
$rgName = "<resource-group>"
$accountName = "<storage-account>"
$containerName = "<container>"
$blobName = "<archived-blob>"
# Get the storage account context
$ctx = (Get-AzStorageAccount `
-ResourceGroupName $rgName `
-Name $accountName).Context
# Change the blob's access tier to hot with Standard priority.
$blob = Get-AzStorageBlob -Container $containerName -Blob $blobName -Context $ctx
$blob.BlobClient.SetAccessTier("Hot", $null, "Standard")
若要使用 Azure CLI 将 Blob 层从存档层更改为热层或冷层,请调用 az storage blob set-tier 命令。 请记得将尖括号中的占位符替换为你自己的值:
az storage blob set-tier \
--account-name <storage-account> \
--container-name <container> \
--name <archived-blob> \
--tier Hot \
--rehydrate-priority Standard \
--auth-mode login
若要使用 AzCopy 将 Blob 的层从存档层更改为热层或冷层,请使用 azcopy set-properties 命令并将 -block-blob-tier
参数设置为所需层,将 --rehydrate-priority
设置为 standard
或 high
。 默认情况下,此参数设置为 standard
。 若要详细了解关于每个选项的权衡,请参阅解除冻结优先级 。
重要
使用 AzCopy 更改 Blob 层的功能目前位于预览版中。
有关 beta 版本、预览版或尚未正式发布的版本的 Azure 功能所适用的法律条款,请参阅 Azure 预览版的补充使用条款 。
注意
此示例将路径参数括在单引号 ('') 内。 在除 Windows 命令 Shell (cmd.exe) 以外的所有命令 shell 中,都请使用单引号。 如果使用 Windows 命令 Shell (cmd.exe),请用双引号 ("") 而不是单引号 ('') 括住路径参数。 此示例还不包含 SAS 令牌,因为它假定你已使用 Microsoft Entra ID 提供授权凭据。 请参阅 AzCopy 入门 一文了解如何向存储服务提供授权凭据。
azcopy set-properties 'https://<storage-account-name>.blob.core.chinacloudapi.cn/<container-name>/<blob-name>' --block-blob-tier=hot --rehydrate-priority=high
批量解除冻结一组 blob
若要将容器或文件夹中存档的 blob 解除冻结到热存储层或冷存储层,请枚举 blob,并对每个 blob 调用“设置 blob 层”操作。 下面的示例向你展示了如何执行此操作:
# Initialize these variables with your values.
$rgName = "<resource-group>"
$accountName = "<storage-account>"
$containerName = "<container>"
$folderName = "<folder>/"
$ctx = (Get-AzStorageAccount -ResourceGroupName $rgName -Name $accountName).Context
$blobCount = 0
$Token = $Null
$MaxReturn = 5000
do {
$Blobs = Get-AzStorageBlob -Context $ctx -Container $containerName -Prefix $folderName -MaxCount $MaxReturn -ContinuationToken $Token
if($Blobs -eq $Null) { break }
#Set-StrictMode will cause Get-AzureStorageBlob returns result in different data types when there is only one blob
if($Blobs.GetType().Name -eq "AzureStorageBlob")
{
$Token = $Null
}
else
{
$Token = $Blobs[$Blobs.Count - 1].ContinuationToken;
}
$Blobs | ForEach-Object {
if(($_.BlobType -eq "BlockBlob") -and ($_.AccessTier -eq "Archive") ) {
$_.BlobClient.SetAccessTier("Hot", $null, "Standard")
}
}
}
While ($Token -ne $Null)
az storage blob list --account-name $accountName --account-key $key \
--container-name $containerName --prefix $folderName \
--query "[?properties.blobTier == 'Archive'].name" --output tsv \
| xargs -I {} -P 10 \
az storage blob set-tier --account-name $accountName --account-key $key \
--container-name $containerName --tier Hot --name "{}"
要一次解除冻结大量 blob,请调用 Blob 批处理 操作,将设置 Blob 层 作为批量操作调用。
有关演示如何执行批处理操作的代码示例,请参阅 AzBulkSetBlobTier 。
查看解除冻结操作的状态
在对 Blob 解除冻结时,可以使用 Azure 门户、PowerShell 或 Azure CLI 查看其状态和解除冻结优先级。 状态属性可能返回 rehydrate-pending-to-hot 或 rehydrate-pending-to-cool,具体取决于解除冻结操作的目标层。 解除冻结优先级属性会返回“标准”或“高” 。
请注意,解除冻结存档的 Blob 可能需要 15 个小时才能完成,如果通过反复轮询 Blob 的状态来确定解除冻结是否完成,效率会很低。 通过使用 Azure 事件网格捕获在解除冻结完成时触发的事件,能够提高性能并优化成本。 若要了解如何在因 Blob 解除冻结而触发事件时运行 Azure 函数,请参阅运行 Azure 函数以响应 Blob 解除冻结事件 。
若要在 Azure 门户中查看挂起的解除冻结操作的状态和优先级,请显示 Blob 的“更改层”对话框:
解除冻结完成后,可以在 Azure 门户看到,完全解除冻结的 Blob 现在显示在目标联机层中。
若要使用 PowerShell 查看挂起的解除冻结操作的状态和优先级,请调用 Get-AzStorageBlob 命令,并查看 Blob 的 ArchiveStatus 和 RehydratePriority 属性 。 如果解除冻结是一个复制操作,请在目标 Blob 上查看上述属性。 请记得将尖括号中的占位符替换为你自己的值:
$rehydratingBlob = Get-AzStorageBlob -Container $containerName -Blob $blobName -Context $ctx
$rehydratingBlob.BlobProperties.ArchiveStatus
$rehydratingBlob.BlobProperties.RehydratePriority
若要使用 Azure CLI 查看挂起的解除冻结操作的状态和优先级,请调用 az storage blob show 命令,并查看目标 Blob 的 rehydrationStatus 和 rehydratePriority 属性。 请记得将尖括号中的占位符替换为你自己的值:
az storage blob show \
--account-name <storage-account> \
--container-name <container> \
--name <blob> \
--query '[rehydratePriority, properties.rehydrationStatus]' \
--output tsv \
--auth-mode login
更改挂起操作的解除冻结优先级
当标准优先级的解除冻结操作处于挂起状态时,可以将 blob 的解除冻结优先级设置从“标准”更改为“高”,以便更快地解除冻结该 blob 。
对于挂起的操作,不能将解除冻结优先级设置从“高”降低到“标准”。 另请注意,更改解除冻结优先级可能会对计费产生影响。 有关详细信息,请参阅存档层中的 Blob 解除冻结 。
更改挂起的“设置 Blob 层”操作的解除冻结优先级
若要在标准优先级设置 Blob 层 操作挂起时更改解除冻结优先级,请使用 Azure 门户、PowerShell、Azure CLI 或 Azure 存储客户端库之一。
若要使用 Azure 门户更改挂起操作的解除冻结优先级,请执行以下步骤:
导航到要为其更改解除冻结优先级的 blob,然后选择该 blob。
选择“更改层”按钮。
在“更改层 ”对话框中,将访问层设置为要解除冻结的 Blob 的目标联机访问层(热或冷)。 “存档状态”字段显示目标联机层。
在“解除冻结优先级”下拉菜单中,将优先级设置为“高”。
选择“保存”。
若要使用 PowerShell 更改挂起操作的解除冻结优先级,请确保已安装 Az.Storage 模块版本 3.12.0 或更高版本。 接下来,从服务获取 blob 的属性。 此步骤是确保你拥有具有最新属性设置的对象所必需的。 最后,使用 blob 的 BlobClient 属性返回对 blob 的 .NET 引用,然后对该引用调用 SetAccessTier 方法 。
# Get the blob from the service.
$rehydratingBlob = Get-AzStorageBlob -Container $containerName -Blob $blobName -Context $ctx
# Verify that the current rehydration priority is Standard.
if ($rehydratingBlob.BlobProperties.RehydratePriority -eq "Standard")
{
# Change rehydration priority to High, using the same target tier.
if ($rehydratingBlob.BlobProperties.ArchiveStatus -eq "rehydrate-pending-to-hot")
{
$rehydratingBlob.BlobClient.SetAccessTier("Hot", $null, "High")
"Changing rehydration priority to High for blob moving to hot tier."
}
if ($rehydratingBlob.BlobProperties.ArchiveStatus -eq "rehydrate-pending-to-cool")
{
$rehydratingBlob.BlobClient.SetAccessTier("Cool", $null, "High")
"Changing rehydration priority to High for blob moving to cool tier."
}
}
若要使用 Azure CLI 更改挂起操作的解除冻结优先级,请首先确保已安装了 Azure CLI 版本 2.29.2 或更高版本。 有关安装 Azure CLI 的详细信息,请参阅如何安装 Azure CLI 。
接下来,调用 az storage blob set-tier 命令,并将 --rehydrate-priority
参数设置为“High”。 目标层(热或冷)必须与最初为解除冻结操作指定的层相同。 请记得将尖括号中的占位符替换为你自己的值:
# Update the rehydration priority for a blob moving to the hot tier.
az storage blob set-tier \
--account-name <storage-account> \
--container-name <container> \
--name <blob> \
--tier Hot \
--rehydrate-priority High \
--auth-mode login
# Show the updated property values.
az storage blob show \
--account-name <storage-account> \
--container-name <container> \
--name <blob> \
--query '[rehydratePriority, properties.rehydrationStatus]' \
--output tsv \
--auth-mode login
更改挂起的“复制 Blob”操作的解除冻结优先级
通过将存档的 Blob 复制到联机层来解除冻结 Blob 时,Azure 存储会立即在存档层中创建目标 Blob。 然后,目标 blob 会根据复制操作中指定的优先级解除冻结到目标层。 有关使用复制操作解除冻结存档 blob 的详细信息,请参阅将存档 blob 复制到联机层 。
若要执行从存档层到具有标准优先级的联机层的复制操作,请使用 PowerShell、Azure CLI 或 Azure 存储客户端库之一。 有关详细信息,请参阅使用复制操作解除冻结 blob 。 接下来,若要将挂起的解除冻结操作的解除冻结优先级从“标准”更改为“高”,请对目标 blob 调用“设置 Blob 层”并指定目标层 。
启动复制操作后,你将在 Azure 门户中看到源和目标 Blob 都在存档层中。 目标 blob 正在以标准优先级解除冻结。
若要更改目标 blob 的解除冻结优先级,请执行以下步骤:
选择目标 blob。
选择“更改层”按钮。
在“更改层 ”对话框中,将访问层设置为要解除冻结的 Blob 的目标联机访问层(热或冷)。 “存档状态”字段显示目标联机层。
在“解除冻结优先级”下拉菜单中,将优先级设置为“高”。
选择“保存”。
现在,目标 blob 的属性页显示其以高优先级解除冻结。
启动复制操作后,检查目标 blob 的属性。 你会看到,目标 Blob 位于存档层中,并且正在以标准优先级解除冻结。
# Initialize these variables with your values.
$rgName = "<resource-group>"
$accountName = "<storage-account>"
$destContainerName = "<container>"
$destBlobName = "<destination-blob>"
# Get the storage account context
$ctx = (Get-AzStorageAccount `
-ResourceGroupName $rgName `
-Name $accountName).Context
# Get properties for the destination blob.
$destinationBlob = Get-AzStorageBlob -Container $destContainerName `
-Blob $destBlobName `
-Context $ctx
$destinationBlob.BlobProperties.AccessTier
$destinationBlob.BlobProperties.ArchiveStatus
$destinationBlob.BlobProperties.RehydratePriority
接下来,通过 PowerShell 调用 SetAccessTier 方法,将目标 blob 的解除冻结优先级更改为“高”,如更改挂起的“设置 Blob 层”操作的解除冻结优先级 中所述。 目标层(热或冷)必须与最初为解除冻结操作指定的层相同。 再次检查属性以验证 blob 现在是否正在以高优先级解除冻结。
启动复制操作后,检查目标 blob 的属性。 你会看到,目标 Blob 位于存档层中,并且正在以标准优先级解除冻结。
az storage blob show \
--account-name <storage-account> \
--container-name <container> \
--name <blob> \
--query '[rehydratePriority, properties.rehydrationStatus]' \
--output tsv \
--auth-mode login
接下来,调用 az storage blob set-tier 命令,并将 --rehydrate-priority
参数设置为“高”,如更改挂起的“设置 Blob 层”操作的解除冻结优先级 中所述。 目标层(热或冷)必须与最初为解除冻结操作指定的层相同。 再次检查属性以验证 blob 现在是否正在以高优先级解除冻结。
请参阅