2016-03-05 4 views
0

У меня есть сценарий PowerShell для Azure Automation, который планируется запустить каждую ночь. По какой-то причине каждый раз и в то время рабочий процесс запускается, а затем просто запускает все команды из начала снова в том же экземпляре текущего рабочего процесса. Я не зацикливаю весь рабочий процесс или что-то еще, поэтому я не знаю, как и почему это происходит. Есть предположения?Azure Automation PowerShell Script запускает команды дважды

Вот код:

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 ***** 

ответ

1

Вы, вероятно, работает в "fair share" пределе Azure Automation, где мы выгрузить любую работу, которая занимает более 3 часов (чтобы убедиться, что другие рабочие места имеют возможность работать), а затем возобновить работу с его последней контрольной точки (если в рабочей книге нет контрольных точек, как и в вашем случае, работа возобновится с самого начала).

Если вы хотите, чтобы определенные части вашей рабочей книги не перезапускались в случае, когда достигнут предел справедливого доступа Azure Automation, убедитесь, что ваши задания на рабочем столе завершены менее чем за три часа или добавьте контрольные точки (через контрольно-пропускной пункт) после частей рабочей книги, которые не следует повторять.

+0

Хм ... Интересно. Я думаю, что возможно. Благодаря! – Bullsfan127

 Смежные вопросы

  • Нет связанных вопросов^_^