Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell Azure存储增量拷贝(按修改日期)_Powershell_Azure_Azure Storage_Azure Automation - Fatal编程技术网

Powershell Azure存储增量拷贝(按修改日期)

Powershell Azure存储增量拷贝(按修改日期),powershell,azure,azure-storage,azure-automation,Powershell,Azure,Azure Storage,Azure Automation,我需要将一个存储帐户复制到另一个存储帐户。我已经创建了一个Runbook,并计划每天运行。这是一个增量副本 我正在做的是 列出源存储容器中的blob 检查目标存储容器中的Blob 如果目标容器中不存在该blob,请复制blobStart AzureStorageBlobCopy 虽然这适用于小尺寸的容器,但这需要很长的时间,而且对于具有1000万块Blob的容器来说肯定是没有成本效益的,因为每次运行任务时,我都必须处理所有1000万块Blob 我在中没有看到它,但是否有任何方法可以在powers

我需要将一个存储帐户复制到另一个存储帐户。我已经创建了一个
Runbook
,并计划每天运行。这是一个增量副本

我正在做的是

  • 列出源存储容器中的blob
  • 检查目标存储容器中的Blob
  • 如果目标容器中不存在该blob,请复制blob
    Start AzureStorageBlobCopy
  • 虽然这适用于小尺寸的容器,但这需要很长的时间,而且对于具有1000万块Blob的容器来说肯定是没有成本效益的,因为每次运行任务时,我都必须处理所有1000万块Blob

    我在中没有看到它,但是否有任何方法可以在powershell中使用条件标题,如
    DateModifiedSince
    或类似
    Get-AzureStorageBlob-DateModifiedSince-date

    我没有尝试过,但我发现可以在中使用
    DateModifiedSince

    我是否可以使用powershell执行此操作,以便能够使用
    Runbook

    编辑:

    使用AzCopy制作了一个包含700万个Blob的存储帐户副本,我上传了几个新Blob并再次启动AzCopy。复制几个新上传的文件仍然需要大量的时间

    AzCopy/Source:$sourceUri/Dest:$destUri/SourceKey:$sourceStorageKey/DestKey:$destStorageAccountKey/S/XO/XN/Y

    可以立即筛选具有blob名称的blob

    例如,
    Get AzureStorageBlob-Blob
    将立即从700万条记录返回Blob


    还可以使用其他属性筛选blob。

    上次修改存储在iCloudBlob对象中,您可以使用Powershell访问它,如下所示

    $blob = Get-AzureStorageBlob -Context $Context  -Container $container
    $blob[1].ICloudBlob.Properties.LastModified
    
    这会给你

    日期时间:31/03/2016 17:03:07
    联合技术开发署发布时间:31/03/2016 17:03:07
    LocalDateTime:31/03/2016 18:03:07
    日期:2016年3月31日00:00:00
    日期:31
    星期四:星期四
    年月日:91
    小时:17
    毫秒:0
    分钟:3
    月份:3
    偏移量:00:00:00
    第二:7
    滴答声:635950405870000000
    UtcTicks:635950405870000000
    时间:17:03:07
    年份:2016年

    通读了之后,我认为不可能使用名称以外的任何参数对容器执行搜索。我只能想象nodejs库仍然检索所有blob,然后过滤它们


    虽然我不确定这是否是真正正确的答案,但我现在已经求助于这个解决方案,我将对此进行更深入的研究

    AzCopy速度稍快,但由于它是可执行的,所以我没有选择在自动化中使用它

    我编写了自己的runbook(可以修改为工作流),它实现了以下功能 AzCopy命令

    AzCopy/Source:$sourceUri/Dest:$destUri/SourceKey:$sourceStorageKey/DestKey:$destStorageAccountKey/S/XO/Y

  • 我们只能通过blob前缀来筛选blob。因此,我无法提取按修改日期过滤的水滴。这让我把所有的污点都拉出来
  • 我每次从源和目标中提取20000个Blob使用ContinuationToken获取AzureStorageBlob
  • 循环查看拉取的20000个源blob,查看它们是否在目标中不存在或是否在源中被修改
  • 如果2为真,那么我将这些blob写入目标
  • 大约需要3-4个小时才能穿过700万个斑点。任务将根据要写入目标的blob数量而延长
  • 代码片段

        #loop throught the source container blobs, 
        # and copy the blob to destination that are not already there
        $MaxReturn = 20000
        $Total = 0
        $Token = $null
        $FilesTransferred = 0;
        $FilesTransferSuccess = 0;
        $FilesTransferFail = 0;
        $sw = [Diagnostics.Stopwatch]::StartNew();
        DO
        {
            $SrcBlobs = Get-AzureStorageBlob -Context $sourceContext -Container $container -MaxCount $MaxReturn  -ContinuationToken $Token | 
                Select-Object -Property Name, LastModified, ContinuationToken
    
            $DestBlobsHash = @{}
            Get-AzureStorageBlob -Context $destContext -Container $container -MaxCount $MaxReturn  -ContinuationToken $Token  | 
                Select-Object -Property Name, LastModified, ContinuationToken  | 
                    ForEach { $DestBlobsHash[$_.Name] = $_.LastModified.UtcDateTime }
    
    
            $Total += $SrcBlobs.Count
    
            if($SrcBlobs.Length -le 0) { 
                Break;
            }
            $Token = $SrcBlobs[$SrcBlobs.Count -1].ContinuationToken;
    
            ForEach ($SrcBlob in $SrcBlobs){
                # search  in destination blobs for the source blob and unmodified, if found copy it
                $CopyThisBlob = $false
    
                if(!$DestBlobsHash.count -ne 0){
                    $CopyThisBlob = $true
                } elseif(!$DestBlobsHash.ContainsKey($SrcBlob.Name)){
                    $CopyThisBlob = $true
                } elseif($SrcBlob.LastModified.UtcDateTime -gt $DestBlobsHash.Item($SrcBlob.Name)){
                    $CopyThisBlob = $true
                }
    
                if($CopyThisBlob){
                    #Start copying the blobs to container
                    $blobToCopy = $SrcBlob.Name
                    "Copying blob: $blobToCopy to destination"
                    $FilesTransferred++
                    try {
                        $c = Start-AzureStorageBlobCopy -SrcContainer $container -SrcBlob $blobToCopy  -DestContainer $container -DestBlob $blobToCopy -SrcContext $sourceContext -DestContext $destContext -Force
                        $FilesTransferSuccess++
                    } catch {
                        Write-Error "$blobToCopy transfer failed"
                        $FilesTransferFail++
                    }   
                }           
            }
        }
        While ($Token -ne $Null)
        $sw.Stop()
        "Total blobs in container $container : $Total"
        "Total files transferred: $FilesTransferred"
        "Transfer successfully: $FilesTransferSuccess"
        "Transfer failed: $FilesTransferFail"
        "Elapsed time: $($sw.Elapsed) `n"
    

    你可以使用AzCopy。见@JackZeng谢谢我正在测试AzCopy。我正在使用
    \XO\XN
    选项。因为这是我第一次复印,所以需要时间。我的容器大于100 gb。完成后,我将测试AzCopy是否只需要复制一个新的blob就可以获得相同的数量。但是,如果AzCopy工作正常(祈求好运),我将不得不退出自动化(可能改用VM)请尝试AzCopy,我认为它可以实现比您现在所做的更好的性能。:)是的,但问题是如何使整个复制过程更快。对于大约1000万(甚至十万)块Blob,即使使用
    延续令牌
    ConcurrentTaskCount
    ,也需要数小时才能获取AzureStorageBlob。如果
    Get-AzureStorageBlob
    能够在指定的时间后列出blob,那就更好了。顺便说一句,即使是azure portal在试图查看如此大的容器的大小时也会显示“loading…”:(@Sami我已经修改了答案,我将检查nodejs源代码以了解其工作原理(但我认为这是不可能的)我很好奇为什么你一次要处理20000个斑点。你是否遇到内存或超时问题?我遇到了“公平份额”Azure Runbook上的超时限制,正在查看您的脚本,想知道限制maxcount是否有帮助。我发现运行Runbook将一个存储容器复制到另一个存储容器比AzCopy要长一个数量级。小时比分钟长。