Azure自动化PowerShell脚本两次运行命令 [英] Azure Automation PowerShell Script runs commands twice

查看:95
本文介绍了Azure自动化PowerShell脚本两次运行命令的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个Azure自动化PowerShell脚本,计划将其每晚运行.由于某种原因,工作流会一次又一次地运行,然后在运行的工作流的同一实例中从头开始再次运行所有命令.我没有循环整个工作流程或其他任何事情,所以我不知道这种情况发生的原因或原因.有什么想法吗?

I have a Azure Automation PowerShell script the gets scheduled to run every night. For some reason every once and while the workflow will run and then just start running all the commands from the beginning again in the same instance of the running workflow. I am not looping the whole workflow or anything so i do not know how or why this is happening. Any thoughts?

这是代码:

workflow Start-SQLDatabaseBackup
{
        param(
        [parameter(Mandatory=$true)]
        [string] $credName = 'automation',

        [parameter(Mandatory=$true)]
        [string] $SubscriptionName,

        [parameter(Mandatory=$true)]
        [string] $SQLServerName,

        [parameter(Mandatory=$true)]
        [string] $DatabaseName,

        [parameter(Mandatory=$true)]
        [string] $StorageAccountName,

        [parameter(Mandatory=$true)]
        [string] $ContainerName ='backup',

        [parameter(Mandatory=$false)]
        [string] $time


    ) 
    inlinescript {

        Write-Output ("Starting Database Backup for " +  $Using:DatabaseName)

        $Credential = Get-AutomationPSCredential -Name $Using:credName
        if($Credential) 
        {            
            Write-Output ("Found Automation Credential Asset named " + $Using:credName)
        }
        else
        {
             throw ("Could not find an Automation Credential Asset named" +  $Using:credName + ". Make sure you have created one in this Automation Account." )
        }       

       $SQLCredential = Get-AutomationPSCredential -Name '****' 

        if($SQLCredential) 
        {            
            Write-Output ("Found SQL Credential Asset named " +  $Using:SQLcredName)
        }
        else
        {
             throw ("Could not find an SQL Credential Asset named " +  $Using:SQLcredName + ". Make sure you have created one in this Automation Account.")
        } 


        Add-AzureAccount -Credential $Credential > $null
        Select-AzureSubscription -SubscriptionName $Using:SubscriptionName

        if (!(Test-AzureName -Storage $Using:StorageAccountName))
        {  
            Write-Output ("Creating Storage Account "  + $Using:StorageAccountName)
            New-AzureStorageAccount -StorageAccountName $Using:StorageAccountName -Location $Using:Location 
        }

        Set-AzureSubscription -SubscriptionName $Using:SubscriptionName -CurrentStorageAccountName $Using:StorageAccountName

        $SqlContext = New-AzureSqlDatabaseServerContext -ServerName $Using:SQLServerName -Credential $SQLCredential
        if($SqlContext) 
        {            
            Write-Output ("Created SQL Context for " +  $Using:SQLServerName)
        }
        else
        {
             throw ("Could not Create SQL Context for " + $Using:SQLServerName + ". Make sure SQL Credential Asset named" +  $Using:SQLcredName + " has access to the server" )
        }
        $time = $Using:time
        if ([string]::IsNullOrEmpty($time) )
        {
            $start = [System.DateTime]::UtcNow
            $time = $start.ToString("yyyyMMdd_hh-mm-ss-tt") 
        }

        $fileName = ( "{2}/{0}_{1}.bacpac" -f $Using:DatabaseName, $time, $time )


        $Container = Get-AzureStorageContainer -Name $Using:ContainerName
        if($Container) 
        {            
            Write-Output ("Retrieved Azure Storage Container - " + $Using:ContainerName)
        }
        else
        {
             throw ("Could not Retrieve Azure Storage Container " +  $Using:ContainerName + ". Make sure the Storage Container exists. " )
        }
        Write-Output ("Starting Copy of " +  $Using:DatabaseName)

        $dbCopyName = ($Using:DatabaseName +"_copy")
        $dbCopy = Start-AzureSqlDatabaseCopy -ServerName $Using:SQLServerName -DatabaseName $Using:DatabaseName -PartnerDatabase $dbCopyName
        $doLoop = 1

        while ($doLoop -eq 1)
        {
            $copyStatus = Get-AzureSqlDatabaseCopy -ServerName $Using:SQLServerName -DatabaseCopy $dbCopy -ErrorAction SilentlyContinue
            if ($copyStatus -ne $null)
            {
                Write-Output $copyStatus.PercentComplete
                Start-Sleep -s 10            
            }
            else
            {
                $doLoop=0
                Start-Sleep -s 10
            }
        }
        Get-AzureSqlDatabase -ConnectionContext $SqlContext -DatabaseName $dbCopyName

        Write-Output ("Starting Export of " +  $dbCopyName )
        $exportRequest = Start-AzureSqlDatabaseExport -SqlConnectionContext $SqlContext -StorageContainer $Container -DatabaseName $dbCopyName -BlobName $fileName
        if ($exportRequest)
        {
            $doLoop = 1
            while ($doLoop -eq 1)
            {
                $exportStatus = Get-AzureSqlDatabaseImportExportStatus -Request $exportRequest
                if ($exportStatus.Status -eq "Completed")
                {
                    $doLoop = 0               
                }
                elseif ($exportStatus.Status -eq "Failed")
                {
                    $doLoop = 0 
                    throw ("Exporting database " + $dbCopyName + " failed")
                }
                else
                {
                    Write-Output $exportStatus.Status
                    Start-Sleep -s 10
                }
            }

          Write-Output ("Backup " + $fileName + " Created" )
        }
        else
        {
            throw ("Error Creating Export Request for " + $dbCopyName)
        }
      Write-Output ("Deleting " +  $dbCopyName) 
      Remove-AzureSqlDatabase -ConnectionContext $SqlContext -DatabaseName $dbCopyName -Force

    }
}

这是输出.您可以看到它完成后再次从脚本顶部开始运行命令.

And here is the output. You can see it starts running the commands from the top of the script again after it finished.

 Starting Database Backup for *****
    Found Automation Credential Asset named ****
    Found SQL Credential Asset named 
    Created SQL Context for *****
    Retrieved Azure Storage Container - backup
    Starting Copy of ******
    0
    0
    0
    0
    0
    0
    0
    100
    Starting Export of ******
    Pending
    Running, Progress = 0%
    **Starting Database Backup for ********  < -- Starts running from the top of script again?
    Found Automation Credential Asset named ****
    Found SQL Credential Asset named 
    Created SQL Context for *******
    Retrieved Azure Storage Container - backup
    Starting Copy of *****
    Starting Export of *****

推荐答案

您可能正在遇到Azure自动化的限制,我们卸载所有耗时超过3小时(以确保其他作业有机会运行)的作业,然后从上一个检查点恢复作业(如果运行本中没有检查点,如您的情况一样,该作业将从头开始恢复.)

You are probably running into Azure Automation's "fair share" limit, where we unload any job that takes more than 3 hours (to make sure other jobs have a chance to run), and then resume the job from its last checkpoint (if there are no checkpoints in the runbook, like in your case, the job will resume from the beginning).

如果要确保在达到Azure自动化公平份额限制的情况下不重新运行Runbook的某些部分,请确保Runbook作业将在三个小时内完成,或添加检查点(通过Checkpoint-Workflow)在手册中不应重复的部分之后.

If you want to ensure certain parts of your runbook are not rerun in the case where the Azure Automation fair share limit is reached, make sure your runbook jobs will complete in under three hours, or add checkpoints (via Checkpoint-Workflow) after parts of the runbook that should not be repeated.

这篇关于Azure自动化PowerShell脚本两次运行命令的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆