Skapa en agent av en agent som skapar en agent av en elasticitet med PowerShell (förhandsversion)

GÄLLER FÖR: Azure SQL Database

E-SQL (förhandsversion) aktiverar körningen av ett eller flera transact-SQL-skript (T-SQL) parallellt mellan många databaser.

I den här självstudiekursen lär du dig hur du kör en fråga i flera databaser:

  • Skapa en agent av en elasticitet
  • Skapa jobbautentiseringsuppgifter så att jobb kan köra skript på sina mål
  • Definiera de mål (servrar, pooler, databaser, fragmenterade kartor) som du vill köra jobbet mot
  • Skapa databasomfattningar i måldatabaserna så att agenten ansluter till och kör jobb
  • Skapa ett jobb
  • Lägga till jobbsteg för ett jobb
  • Påbörja körningen av ett jobb
  • Övervaka ett jobb

Krav

Den uppgraderade versionen av elasticitetdatabasjobben har en ny uppsättning PowerShell-cmdlets som ska användas under migreringen. Dessa nya cmdlets överför alla dina befintliga jobbautentiseringsuppgifter, mål (inklusive databaser, servrar, anpassade samlingar), jobbutlösare, jobbscheman, jobbinnehåll och jobb till en ny agent för det virtuella jobbet.

Installera de senaste cmdletarna För att få de senaste cmdletarna Elasticitetjobb

Om du inte redan har en Azure-prenumeration skapar du ett kostnadsfritt konto innan du börjar.

Installera az.sql-modulen för att få de senaste cmdletarna För att få de senaste elasticitetjobbet. Kör följande kommandon i PowerShell med administrativ åtkomst.

# installs the latest PackageManagement and PowerShellGet packages
Find-Package PackageManagement | Install-Package -Force
Find-Package PowerShellGet | Install-Package -Force

# Restart your powershell session with administrative access

# Install and import the Az.Sql module, then confirm
Install-Module -Name Az.Sql
Import-Module Az.Sql

Get-Module Az.Sql

Förutom modulen Az.Sql kräver den här självstudiekursen även SqlServer PowerShell-modulen. Mer information finns i Installera SQL Server PowerShell-modulen.

Skapa nödvändiga resurser

Om du vill skapa en agent av en elasticitet krävs en databas (S0 eller senare) som ska användas som jobbdatabas.

Skriptet nedan skapar en ny resursgrupp, server och databas för användning som Jobb-databas. Det andra skriptet skapar en andra server med två tomma databaser att köra jobb mot.

Det finns inga specifika namnkrav för att du ska kunna använda de namnkonventioner du vill, så länge de uppfyller Azure-kraven.

# sign in to Azure account
Connect-AzAccount

# create a resource group
Write-Output "Creating a resource group..."
$resourceGroupName = Read-Host "Please enter a resource group name"
$location = Read-Host "Please enter an Azure Region"
$rg = New-AzResourceGroup -Name $resourceGroupName -Location $location
$rg

# create a server
Write-Output "Creating a server..."
$agentServerName = Read-Host "Please enter an agent server name"
$agentServerName = $agentServerName + "-" + [guid]::NewGuid()
$adminLogin = Read-Host "Please enter the server admin name"
$adminPassword = Read-Host "Please enter the server admin password"
$adminPasswordSecure = ConvertTo-SecureString -String $AdminPassword -AsPlainText -Force
$adminCred = New-Object -TypeName "System.Management.Automation.PSCredential" -ArgumentList $adminLogin, $adminPasswordSecure
$agentServer = New-AzSqlServer -ResourceGroupName $resourceGroupName -Location $location `
    -ServerName $agentServerName -ServerVersion "12.0" -SqlAdministratorCredentials ($adminCred)

# set server firewall rules to allow all Azure IPs
Write-Output "Creating a server firewall rule..."
$agentServer | New-AzSqlServerFirewallRule -AllowAllAzureIPs
$agentServer

# create the job database
Write-Output "Creating a blank database to be used as the Job Database..."
$jobDatabaseName = "JobDatabase"
$jobDatabase = New-AzSqlDatabase -ResourceGroupName $resourceGroupName -ServerName $agentServerName -DatabaseName $jobDatabaseName -RequestedServiceObjectiveName "S0"
$jobDatabase
# create a target server and sample databases - uses the same credentials
Write-Output "Creating target server..."
$targetServerName = Read-Host "Please enter a target server name"
$targetServerName = $targetServerName + "-" + [guid]::NewGuid()
$targetServer = New-AzSqlServer -ResourceGroupName $resourceGroupName -Location $location `
    -ServerName $targetServerName -ServerVersion "12.0" -SqlAdministratorCredentials ($adminCred)

# set target server firewall rules to allow all Azure IPs
$targetServer | New-AzSqlServerFirewallRule -AllowAllAzureIPs
$targetServer | New-AzSqlServerFirewallRule -StartIpAddress 0.0.0.0 -EndIpAddress 255.255.255.255 -FirewallRuleName AllowAll
$targetServer

# create sample databases to execute jobs against
$db1 = New-AzSqlDatabase -ResourceGroupName $resourceGroupName -ServerName $targetServerName -DatabaseName "database1"
$db1
$db2 = New-AzSqlDatabase -ResourceGroupName $resourceGroupName -ServerName $targetServerName -DatabaseName "database2"
$db2

Skapa agenten Elasticitet

En agent av flexibelt jobb är en Azure-resurs för att skapa, köra och hantera jobb. Agenten kör jobb baserat på ett schema eller som ett jobb som en gång.

Cmdleten New-AzSqlElasticJobAgent kräver att en databas i Azure SQL Database redan finns, så parametrarna resourceGroupName,serverNameoch databaseName måste peka på befintliga resurser.

Write-Output "Creating job agent..."
$agentName = Read-Host "Please enter a name for your new Elastic Job agent"
$jobAgent = $jobDatabase | New-AzSqlElasticJobAgent -Name $agentName
$jobAgent

Skapa jobbautentiseringsuppgifter

Jobb använder databasomfattningar för att ansluta till måldatabaserna som anges av målgruppen vid körning och körning av skript. De här autentiseringsuppgifterna med databasomfattning används också för att ansluta till huvuddatabasen för att räkna upp alla databaser i en server eller en autentiseringspool, när någon av dessa används som medlemstyp för målgruppen.

Databasens begränsade autentiseringsuppgifter måste skapas i jobbdatabasen. Alla måldatabaser måste ha en inloggning med tillräcklig behörighet för att jobbet ska slutföras.

Elastic Jobs credentials

Utöver autentiseringsuppgifterna i bilden observera tillägget av GRANT kommandona i följande skript. De här behörigheterna krävs för skriptet som vi valde för det här exempeljobbet. Eftersom exemplet skapar en ny tabell i de riktade databaserna behöver varje db-mål ha rätt behörighet för att kunna köras.

Skapa de jobbuppgifter som krävs (i jobbdatabasen) genom att köra följande skript:

# in the master database (target server)
# create the master user login, master user, and job user login
$params = @{
  'database' = 'master'
  'serverInstance' =  $targetServer.ServerName + '.database.windows.net'
  'username' = $adminLogin
  'password' = $adminPassword
  'outputSqlErrors' = $true
  'query' = 'CREATE LOGIN masteruser WITH PASSWORD=''password!123'''
}
Invoke-SqlCmd @params
$params.query = "CREATE USER masteruser FROM LOGIN masteruser"
Invoke-SqlCmd @params
$params.query = 'CREATE LOGIN jobuser WITH PASSWORD=''password!123'''
Invoke-SqlCmd @params

# for each target database
# create the jobuser from jobuser login and check permission for script execution
$targetDatabases = @( $db1.DatabaseName, $Db2.DatabaseName )
$createJobUserScript =  "CREATE USER jobuser FROM LOGIN jobuser"
$grantAlterSchemaScript = "GRANT ALTER ON SCHEMA::dbo TO jobuser"
$grantCreateScript = "GRANT CREATE TABLE TO jobuser"

$targetDatabases | % {
  $params.database = $_
  $params.query = $createJobUserScript
  Invoke-SqlCmd @params
  $params.query = $grantAlterSchemaScript
  Invoke-SqlCmd @params
  $params.query = $grantCreateScript
  Invoke-SqlCmd @params
}

# create job credential in Job database for master user
Write-Output "Creating job credentials..."
$loginPasswordSecure = (ConvertTo-SecureString -String 'password!123' -AsPlainText -Force)

$masterCred = New-Object -TypeName "System.Management.Automation.PSCredential" -ArgumentList "masteruser", $loginPasswordSecure
$masterCred = $jobAgent | New-AzSqlElasticJobCredential -Name "masteruser" -Credential $masterCred

$jobCred = New-Object -TypeName "System.Management.Automation.PSCredential" -ArgumentList "jobuser", $loginPasswordSecure
$jobCred = $jobAgent | New-AzSqlElasticJobCredential -Name "jobuser" -Credential $jobCred

Definiera måldatabaserna som jobbet ska köras mot

En målgrupp definierar uppsättningen med en eller flera databaser som ett jobbsteg ska utföras på.

Följande kodstycke skapar två målgrupper: serverGroupoch serverGroupExcludingDb2. serverGroup target all databases that exist on the server at the time of execution, and serverGroupExcludingDb2 targets all databases on the server, except targetDb2:

Write-Output "Creating test target groups..."
# create ServerGroup target group
$serverGroup = $jobAgent | New-AzSqlElasticJobTargetGroup -Name 'ServerGroup'
$serverGroup | Add-AzSqlElasticJobTarget -ServerName $targetServerName -RefreshCredentialName $masterCred.CredentialName

# create ServerGroup with an exclusion of db2
$serverGroupExcludingDb2 = $jobAgent | New-AzSqlElasticJobTargetGroup -Name 'ServerGroupExcludingDb2'
$serverGroupExcludingDb2 | Add-AzSqlElasticJobTarget -ServerName $targetServerName -RefreshCredentialName $masterCred.CredentialName
$serverGroupExcludingDb2 | Add-AzSqlElasticJobTarget -ServerName $targetServerName -Database $db2.DatabaseName -Exclude

Skapa ett jobb och steg

Det här exemplet definierar ett jobb och två jobbsteg för jobbet som ska köras. Med det förstajobbsteget (steg1) skapas en ny tabell(Steg 1Tabell)i alla databaser i målgruppen ServerGroup. Med det andra jobbsteget(steg2)skapas en ny tabell(Steg2Tabell)i alla databaser utom TargetDb2,eftersom målgruppen som tidigare definierats utesluter den.

Write-Output "Creating a new job..."
$jobName = "Job1"
$job = $jobAgent | New-AzSqlElasticJob -Name $jobName -RunOnce
$job

Write-Output "Creating job steps..."
$sqlText1 = "IF NOT EXISTS (SELECT * FROM sys.tables WHERE object_id = object_id('Step1Table')) CREATE TABLE [dbo].[Step1Table]([TestId] [int] NOT NULL);"
$sqlText2 = "IF NOT EXISTS (SELECT * FROM sys.tables WHERE object_id = object_id('Step2Table')) CREATE TABLE [dbo].[Step2Table]([TestId] [int] NOT NULL);"

$job | Add-AzSqlElasticJobStep -Name "step1" -TargetGroupName $serverGroup.TargetGroupName -CredentialName $jobCred.CredentialName -CommandText $sqlText1
$job | Add-AzSqlElasticJobStep -Name "step2" -TargetGroupName $serverGroupExcludingDb2.TargetGroupName -CredentialName $jobCred.CredentialName -CommandText $sqlText2

Kör jobbet

Om du vill starta jobbet direkt kör du följande kommando:

Write-Output "Start a new execution of the job..."
$jobExecution = $job | Start-AzSqlElasticJob
$jobExecution

När det är klart bör du se två nya tabeller i TargetDb1 och bara en ny tabell i TargetDb2:

new tables verification in SSMS

Du kan också schemalägga jobbet så att det körs senare. Om du vill schemalägga ett jobb som ska köras vid en viss tidpunkt kör du följande kommando:

# run every hour starting from now
$job | Set-AzSqlElasticJob -IntervalType Hour -IntervalCount 1 -StartTime (Get-Date) -Enable

Övervaka status för jobbkörningar

Följande avsnitt hämtar jobbkörningsinformation:

# get the latest 10 executions run
$jobAgent | Get-AzSqlElasticJobExecution -Count 10

# get the job step execution details
$jobExecution | Get-AzSqlElasticJobStepExecution

# get the job target execution details
$jobExecution | Get-AzSqlElasticJobTargetExecution -Count 2

I följande tabell visas möjliga tillstånd för körning av jobb:

Delstat Beskrivning
Skapad Jobbkörningen skapades just och pågår inte ännu.
InProgress Jobbkörningen pågår just nu.
WaitingForRetry Jobbkörningen kunde inte slutföra åtgärden och väntar på att försöka igen.
Lyckades Jobbkörningen har slutförts.
SucceededWithSkipped Jobbkörningen har slutförts, men några av dess barn har hoppats över.
Misslyckades Jobbkörningen har misslyckats och förbrukat dess försök.
TimedOut Time out för jobbkörningen.
Avbruten Jobbkörningen avbröts.
Hoppat över Jobbkörningen hoppade över eftersom en annan körning av samma jobbsteg redan kördes på samma mål.
WaitingForJobExecutions Jobbkörningen väntar på att dess underordnade körningar ska slutföras.

Rensa resurser

Ta bort Azure-resurserna som skapades i den här självstudiekursen genom att ta bort resursgruppen.

Tips!

Om du planerar att fortsätta arbeta med de här jobben rensar du inte bort resurserna som skapats i den här artikeln.

Remove-AzResourceGroup -ResourceGroupName $resourceGroupName

Nästa steg

I den här självstudiekursen körde du ett Transact-SQL-skript mot en uppsättning databaser. Du har lärt dig hur du gör följande:

  • Skapa en agent av en elasticitet
  • Skapa jobbautentiseringsuppgifter så att jobb kan köra skript på sina mål
  • Definiera de mål (servrar, pooler, databaser, fragmenterade kartor) som du vill köra jobbet mot
  • Skapa databasomfattningar i måldatabaserna så att agenten ansluter till och kör jobb
  • Skapa ett jobb
  • Lägga till ett jobbsteg i jobbet
  • Starta en körning av jobbet
  • Övervaka jobbet