如何处理AZcopy失败的文件传输

时间:2019-07-12 10:11:21

标签: azure azure-storage-blobs azcopy

我正在将大量的小文件从本地文件系统复制到Azure blob存储。 很少文件无法上传。 似乎AZcopy只是记录了这些失败,没有简单的方法来重试上载这些文件。 (按时)逐个搜索每个文件并手动上传是不可行的。 有什么建议可以解决这些失败问题,然后重试自动将其上传到Blob吗?

4 个答案:

答案 0 :(得分:1)

如果不是由于sas令牌或身份验证导致传输作业错误,则可以从此link尝试在命令行下面进行操作。

显示失败的作业的错误消息:

azcopy jobs show <job-id> --with-status=Failed

enter image description here

修复它们,然后执行恢复命令:

azcopy jobs resume <job-id> --source-sas="<sas-token>"
azcopy jobs resume <job-id> --destination-sas="<sas-token>"

请参考以上命令的声明:

  

当您恢复作业时,AzCopy将查看作业计划文件。计划   文件列出了在以下情况下已确定要处理的所有文件:   作业是第一次创建的。当您恢复工作时,AzCopy将尝试   传输计划文件中列出的所有文件   还没有转移。

答案 1 :(得分:1)

当我偶尔遇到大量失败时,添加到该线程中。对于填充空白目录的范围有限的方案,一种简单的解决方案是使用--overwrite = false命令再次运行azcopy copy命令。

答案 2 :(得分:0)

如果您知道Powershell或其他编程语言,则可以编写脚本。在脚本中,您可以检查是否有任何失败的上传文件,如果存在,则可以使用脚本调用azcopy再次上传文件。

Here是有关如何使用Powershell脚本重新上传失败的上传文件的链接,您可以尝试根据需要进行修改。

希望有帮助。

答案 3 :(得分:0)

我遇到了进程被杀死的情况(可能在容器化环境中发生)。因此,我认为最简单的方法是实现重试机制(从here启发而来)。我遇到了要下载的问题,但解决方法几乎相同:

function azcopyWithRetry() {
      local list_of_blobs=`echo ${1}`
      local connection_string="https://${2}.blob.core.windows.net/${3}/*?${4}"
      local download_path="/tmp/download"
      local max_attempts="${5}"
      local command="azcopy copy --include-path ${list_of_blobs} ${connection_string} ${download_path}"

      local n=1
      while true; do
        ${command}  && break || {
          if [[ $n -lt $max_attempts ]]; then
            echo "WARN: Command failed, retrying. (attempt $n/$max_attempts) "
            ((n++))
            sleep 1;
          else
            echo "FAIL: Command failed after $n attempts. Nothing will happen"
            return 1
          fi
        }
      done
}

您将使用以下命令调用此函数:

export LIST_BLOBS="blobs.txt"
export AZ_ACCOUNT="..."
export AZ_CONTAINER="..."
export AZ_SAS_TOKEN="..."
azcopyWithRetry ${LIST_BLOBS} ${AZ_ACCOUNT} ${AZ_CONTAINER} ${AZ_SAS_TOKEN} 5

5次重试