簡體   English   中英

Azure 自動化 PowerShell 腳本運行命令兩次

[英]Azure Automation PowerShell Script runs commands twice

我有一個 Azure 自動化 PowerShell 腳本,計划每晚運行。 出於某種原因,工作流會時不時地運行,然后在正在運行的工作流的同一實例中再次從頭開始運行所有命令。 我沒有循環整個工作流程或任何東西,所以我不知道這是如何或為什么發生的。 有什么想法嗎?

這是代碼:

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

    }
}

這是輸出。 您可以看到它在完成后再次從腳本頂部開始運行命令。

 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 小時的作業(以確保其他作業有機會運行),然后從上一個檢查點恢復作業(如果有Runbook 中沒有檢查點,就像您的情況一樣,作業將從頭開始恢復)。

如果要確保在達到 Azure 自動化公平份額限制的情況下不會重新運行 Runbook 的某些部分,請確保您的 Runbook 作業將在三個小時內完成,或者在部分運行后添加檢查點(通過 Checkpoint-Workflow)不應重復的操作手冊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM