Сценарии перезапуска Azure Runbook без ошибок - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть сценарий Powershell, который отлично работает на локальной машине. Мой скрипт загружает данные в blob storage, выбирая из Azure sql data warehouse.

Когда я загружаю небольшие таблицы, все работает нормально. Однако, когда я пытаюсь загрузить файл из большой таблицы, он перезапускает мой сценарий без ошибок.

Так что я действительно не понимаю, почему в какой-то момент он начинается заново. Для меня это может пахнуть каким-то тайм-аутом или чем-то еще. Но я не могу найти наше где. И нет сообщений об ошибках.

try
{

   #Remove files to cleanup
   $deletefilelist = Get-AzStorageBlob -Container "XXXXXXX" -Context $context

    foreach ($listfiles in $deletefilelist)  
    {
      $removefile = $listfiles.Name
      if ($removefile -ne $null)
      {
        Write-Output "removeing file $removefile"

        Remove-AzStorageBlob -Blob $removefile -Container "XXXXXXX"-Context $context -Force
      }
    }

  #SQL connection settings
  $SqlConnection = New-Object System.Data.SqlClient.SqlConnection
  $SqlConnection.ConnectionString = "Server = $SQLServer; Database = $SQLDBName; Integrated Security = False; User ID = $uid; Password = $pwd;"
  $SqlConnection.Open()

  #MetaData CMDs
  $SqlCmdMeta = New-Object System.Data.SqlClient.SqlCommand
  $SqlAdapterMeta = New-Object System.Data.SqlClient.SqlDataAdapter

  #Datasets
  $DataSetMeta = New-Object System.Data.DataSet
  $DataSet = New-Object System.Data.DataSet

  #Getting metadata from table in Az DWH
  $SqlMetaQuery = "Select FullTableName,TableName,Category,MapSourceSystem,SQLStatement from XXXXXXX"

  $SqlCmdMeta.Connection = $SqlConnection
  $SqlCmdMeta.CommandTimeout = 0
  $SqlCmdMeta.CommandText = $SqlMetaQuery

  $SqlAdapterMeta.SelectCommand = $SqlCmdMeta

  $SqlAdapterMeta.Fill($DataSetMeta)
  $metadataoutput = $DataSetMeta.Tables[0]  

  Write-Output "Preparing settings and upload to blob.."
  #Build the blob file name and sql
  $Todaydate = Get-Date -Format "yyyyMMddHHmmss"
  foreach ($row in $metadataoutput) {
    $category = $row.Category
    $mapsourcesystem = $row.MapSourceSystem

    $csvfileName = $category + "_" + $row.TableName + "_$mapsourcesystem" + "_$Todaydate"


    #Check if it is a fact table. If it is a fact table then the SQLStatement should have an attached mapsourcesystem to the where clause
    $SqlFilename = $row.TableName
    if ($category -eq "Fact") {
      $SqlQuery = $row.SQLStatement + " '$mapsourcesystem'"
    }
    else {
      $SqlQuery = $row.SQLStatement 
    }
    $SqlCmd.CommandTimeout = 0      
    $SqlCmd.Connection = $SqlConnection
    $SqlCmd.CommandText = $SqlQuery


    $SqlAdapter.SelectCommand = $SqlCmd
    $SqlAdapter.Fill($DataSet)
    Write-Output "Rows Detected"

    #Check if table is empty
    if ($DataSet.Tables[0].Rows.Count -eq 0) {
      Write-Output $csvfileName" does not contain any rows in SQL Database and therefore is a CSV file not created"
    }

    else {
      Write-Host "Building and uploading blob file to storage.."
      #Create the blob file and upload it to blob storage
      $file = New-TemporaryFile
      $DataSet.Tables[0] | Export-Csv -Path $file -Delimiter ";" -Encoding UTF8 -NoTypeInformation 
      Set-AzStorageBlobContent -File $file -Container "XXXXXXX" -Context $context -ClientTimeoutPerRequest -1 -ServerTimeoutPerRequest -1 -Force -blob $csvfileName".csv"

      Write-Output $ErrorActionPreference
      Write-Output $csvfileName " Has been uploaded to the Blob storage with success!"

      Write-Output "Deleting $csvfileName in temporary enviorment"
      #Remove-Item -Path $Env:Temp -Recurse -Force -ErrorAction SilentlyContinue
      $DataSet.Reset()
    }

  }
}

1 Ответ

0 голосов
/ 12 ноября 2019

Я полагаю, что это связано с лимитом справедливой доли . Для получения дополнительной информации см. Ответ Джо в этой теме переполнения стека.

Надеюсь, это поможет!

...