Azure跨存储账户Blob复制时Rehydrate操作异常问题(Java)
跨区域Azure Blob复制+重新水化(Rehydration)异常:仅复制元数据,无实际内容
问题场景
尝试将归档层Blob从一个Azure存储账户跨账户复制到另一个账户时,调用beginCopy并设置了从Archive到Cool层的重新水化选项及优先级,操作执行后目标Blob大小为0B,仅复制了元数据,无重新水化等待过程,也未同步Blob内容。同一账户内跨容器复制该归档Blob正常,跨账户复制非归档层Blob也正常。
涉及代码片段
创建源/目标Blob客户端
BlobClient blobMeta = sourceClient.getBlobContainerClient(source.getContainer()).getBlobClient(key); BlobClient destObject = destClient.getBlobContainerClient(dest.getContainer()).getBlobClient(key);
生成源Blob的SAS令牌(跨账户复制要求)
OffsetDateTime sasExpiry = OffsetDateTime.now().plusMinutes(1); BlobSasPermission permission = new BlobSasPermission().setReadPermission(true); BlobServiceSasSignatureValues sas = new BlobServiceSasSignatureValues(sasExpiry,permission).setStartTime(OffsetDateTime.now()); String sourceURL = blobMeta.getBlobUrl() + "?" + blobMeta.generateSas(sas);
调用跨账户复制+重新水化操作
destObject.beginCopy(sourceURL, blobMeta.getProperties().getMetadata(), AccessTier.COOL, RehydratePriority.STANDARD, null, null, null);
问题根因
两个存储账户处于不同区域,当前Azure存储不支持跨区域场景下,在beginCopy操作中同时指定重新水化(Rehydration)参数。这类操作会被降级为仅复制元数据,不会触发源Blob的重新水化流程,也不会同步实际内容。
解决方案
分两步执行操作:
- 先将源归档层Blob重新水化到Cool或Hot访问层(使用
setAccessTier操作,指定目标层和重新水化优先级) - 待源Blob完成重新水化后,再执行跨账户的
beginCopy操作(无需再携带重新水化参数,直接复制已处于Cool/Hot层的Blob)
内容的提问来源于stack exchange,提问作者Vicente Montoro
相关产品推荐
相关产品推荐

