我对Azure自动化运行手册非常陌生,但是我一直在编写一个Powershell脚本,该脚本执行将SQL Azure数据库备份到bacpac文件中的Blob存储容器中,然后将其上传到Google云端硬盘以进行“异地”备份。我已经在1个月前实现了此功能,Microsoft意外终止了我的Azure订阅,并且我无法访问数据库备份,因为它们是该帐户的一部分。
已经编写了脚本,我成功地使用了可出色完成任务的测试功能。随后,我配置了一个每日计划,该计划将每晚执行一次备份。第二天早上,我发现备份方面已成功运行,该文件确实已发布到Google云端硬盘,但是有三个副本。 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."
但是没有通知我错误。日志显示该运行手册写了冗长的行“ Uploading database to google drive ..”,然后似乎回到了开头,并重复了两次。
timeoutsec是作为试用版引入的,以查看是否可以覆盖超时功能(尽管我猜这是问题所在)。该日志未显示随后的冗长消息“将数据库上传到Google驱动器”,因此很明显WebRequest由于某种原因而失败。
作为进一步的信息,我被迫将数据库的blob内容读取到本地临时文件中,然后我必须将其读取到内存中,以便将其作为多部分消息发布到Google。该数据库目前的大小为16 MB。这可能是个问题,因为我被告知运行手册对内存的分配非常严格。
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中进行配置,这是我的荣幸。