我正在将大量的小文件从本地文件系统复制到Azure blob存储。 很少文件无法上传。 似乎AZcopy只是记录了这些失败,没有简单的方法来重试上载这些文件。 (按时)逐个搜索每个文件并手动上传是不可行的。 有什么建议可以解决这些失败问题,然后重试自动将其上传到Blob吗?
答案 0 :(得分:1)
如果不是由于sas令牌或身份验证导致传输作业错误,则可以从此link尝试在命令行下面进行操作。
显示失败的作业的错误消息:
azcopy jobs show <job-id> --with-status=Failed
修复它们,然后执行恢复命令:
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次重试