我对 Azure 自动化运行手册非常陌生,但我一直在编写一个 powershell 脚本,该脚本将 SQL Azure 数据库备份到 bacpac 文件到 blob 存储容器,然后将其上传到 Google Drive 以进行“异地”备份。我已经实现了这个功能,因为 1 个月前微软意外终止了我的 Azure 订阅,我无法访问我的数据库备份,因为它们是帐户的一部分。
编写完脚本后,我成功地使用了测试功能,出色地完成了任务。随后,我配置了一个每日计划,每晚执行备份。第二天早上我发现备份方面工作成功,文件确实已发布到 Google Drive,但有三个副本。Azure 门户将作业标记为“暂停”,我被告知作业失败并重试了 3 次。
我已阅读 Invoke-WebRequest 并怀疑它正在超时,即使文档表明默认行为是不超时。其他建议是使用“内联”脚本,但我认为这仅适用于工作流运行手册,而不是我的特定脚本运行手册。
我认为失败的命令是:
Write-Verbose "Uploading database to google drive using a timeout of 600 seconds..."
$uploadrequest = Invoke-WebRequest -method Post -uri $GUploadURI -body $GUploadBody -Headers $Guploadheaders -usebasicparsing -TimeoutSec 600
Write-Verbose "Uploaded database to google drive."
但我没有收到错误通知。日志显示运行手册写入了详细行“正在将数据库上传到谷歌驱动器..”,之后似乎又回到了开头并再次重复了 2 次。
timeoutsec 是作为试验引入的,以查看我是否可以覆盖超时功能(尽管我猜这是问题所在)。该日志没有显示后续的详细消息“已将数据库上传到谷歌驱动器”,因此很明显 WebRequest 由于某种原因失败了。
作为进一步的信息,我被迫将数据库的 blob 内容读入本地临时文件,然后我必须将其读入内存,以便作为多部分消息发布到 Google。目前该数据库的大小为 16Mbytes。这可能是问题所在,因为有人告诉我运行手册对内存分配非常严格。
Write-Verbose "Creating temporary file for blob content..."
$file = New-TemporaryFile
Write-Verbose "Downloading blob content to temporary file..."
$blob = Get-AzureStorageBlobContent -Container $container -Blob $blob -Context $storageContext -Destination $file -Force
Write-Verbose "Extracting file content as RAW"
$togoogle = Get-Content $file -Raw -ErrorAction:SilentlyContinue
我真的很感激一些关于在这里做什么的建议,以及如何防止重试,因为我也可以在 powershell runbook 中看到如何配置它。