Rugalmas feladatok létrehozása és kezelése a PowerShell használatával (előzetes verzió)

A következőre vonatkozik: Azure SQL Database

Ez a cikk oktatóanyagot és példákat tartalmaz a rugalmas feladatok PowerShell-lel való használatának megkezdéséhez. A rugalmas feladatok lehetővé teszik egy vagy több Transact-SQL- (T-SQL-) szkript több adatbázisban történő, párhuzamos futtatását.

Ebben a teljes körű oktatóanyagban megismerheti a lekérdezések több adatbázisban való futtatásához szükséges lépéseket:

  • Rugalmas feladatügynök létrehozása
  • A feladatok hitelesítő adatainak létrehozása, amelyek segítségével a feladatok a célhelyen tudják végrehajtani a szkripteket
  • Határozza meg a feladat futtatásához használni kívánt célokat (kiszolgálókat, rugalmas készleteket, adatbázisokat)
  • Adatbázis-hatókörű hitelesítő adatok létrehozása a céladatbázisokban, hogy az ügynök összekapcsolja és végrehajtsa a feladatokat
  • Feladat létrehozása
  • Feladatlépések hozzáadása egy feladathoz
  • Feladat-végrehajtás indítása
  • Feladat monitorozása

Megjegyzés:

A rugalmas feladatok előzetes verzióban érhetők el. A jelenleg előzetes verzióban elérhető funkciók kiegészítő használati feltételek mellett érhetők el, és tekintse át az előzetes verzióban lévő Azure-szolgáltatásokra vonatkozó jogi feltételeket. Az Azure SQL Database előzetes verziókat biztosít, amelyekkel kiértékelheti és megoszthatja visszajelzéseit a termékcsoporttal az általános elérhetővé válásuk előtt.

Előfeltételek

A rugalmas adatbázis-feladatok PowerShell-parancsmagokkal rendelkeznek.

Ezeket a parancsmagokat 2023 novemberében frissítettük.

A legújabb rugalmas feladatok parancsmagok telepítése

Ha még nincs Azure-előfizetése, kezdés előtt hozzon létre egy ingyenes fiókot.

Ha még nincs jelen, telepítse a modulok és SqlServer a modulok legújabb verzióitAz.Sql. Futtassa az alábbi parancsokat a PowerShellben rendszergazdai jogosultsággal.

# 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
Install-Module -Name SqlServer
Import-Module SqlServer

További részletekért lásd az SQL Server PowerShell-moduljának telepítését ismertető cikket.

A szükséges erőforrások létrehozása

A rugalmas feladatügynök létrehozásához egy (S1 vagy újabb) adatbázis szükséges a rugalmas feladatadatbázisként való használathoz.

Az alábbi szkript létrehoz egy új erőforráscsoportot, kiszolgálót és adatbázist a rugalmas feladatadatbázisként való használatra. A második szkript létrehoz egy második kiszolgálót két üres adatbázissal a feladatok végrehajtásához.

A rugalmas feladatok nem rendelkeznek konkrét elnevezési követelményekkel, így bármilyen elnevezési konvencióval rendelkezhet, feltéve, hogy megfelelnek az Azure-követelményeknek. Ha már létrehozott egy üres adatbázist a kiszolgálóhoz rugalmas feladatadatbázisként, ugorjon a rugalmas feladatügynök létrehozásához.

A tűzfalszabály New-AzSqlServerFirewallRule konfigurálása nem szükséges rugalmas feladatok privát végpontja esetén.

# Sign in to your Azure account
Connect-AzAccount

# The SubscriptionId in which to create these objects
$SubscriptionId = '<your subscription id>'
# Set subscription context, important if you have access to more than one subscription.
Set-AzContext -SubscriptionId $subscriptionId 

# 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, for example westus2"
$rg = New-AzResourceGroup -Name $resourceGroupName -Location $location
$rg

# Create an Azure SQL logical 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
$parameters = @{
    ResourceGroupName = $resourceGroupName 
    Location = $location
    ServerName = $agentServerName 
    SqlAdministratorCredentials = ($adminCred)    
}
$agentServer = New-AzSqlServer @parameters

# Set server firewall rules to allow all Azure IPs
# Unnecessary if using an elastic jobs private endpoint
Write-Output "Creating a server firewall rule..."
$agentServer | New-AzSqlServerFirewallRule -AllowAllAzureIPs -FirewallRuleName "Allowed IPs"
$agentServer

# Create the job database
Write-Output "Creating a blank database to be used as the Job Database..."
$jobDatabaseName = "JobDatabase"
$parameters = @{
    ResourceGroupName = $resourceGroupName 
    ServerName = $agentServerName 
    DatabaseName = $jobDatabaseName 
    RequestedServiceObjectiveName = "S1"
}
$jobDatabase = New-AzSqlDatabase @parameters
$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()
$parameters = @{
    ResourceGroupName= $resourceGroupName
    Location= $location 
    ServerName= $targetServerName
    ServerVersion= "12.0"
    SqlAdministratorCredentials= ($adminCred)
}
$targetServer = New-AzSqlServer @parameters

# Set target server firewall rules to allow all Azure IPs
# Unnecessary if using an elastic jobs private endpoint
$targetServer | New-AzSqlServerFirewallRule -AllowAllAzureIPs 

# Set the target firewall to include your desired IP range. 
# Change the following -StartIpAddress and -EndIpAddress values.
$parameters = @{
    StartIpAddress = "0.0.0.0" 
    EndIpAddress = "0.0.0.0"
    FirewallRuleName = "AllowAll"
}
$targetServer | New-AzSqlServerFirewallRule @parameters
$targetServer

# Create two sample databases to execute jobs against
$parameters = @{
    ResourceGroupName = $resourceGroupName 
    ServerName = $targetServerName 
    DatabaseName = "database1"
}
$db1 = New-AzSqlDatabase @parameters
$db1
$parameters = @{
    ResourceGroupName = $resourceGroupName 
    ServerName = $targetServerName 
    DatabaseName = "database2"
}
$db2 = New-AzSqlDatabase @parameters
$db2

A rugalmas feladatügynök létrehozása

A rugalmas feladatügynök egy Azure-erőforrás a feladatok létrehozásához, futtatásához és kezeléséhez. Az ügynök ütemezés szerint vagy egyszeri alkalommal hajtja végre a feladatokat. A rugalmas feladatok összes dátuma és időpontja az UTC időzónában található.

A New-AzSqlElasticJobAgent parancsmag használatához az Azure SQL Database-ben lévő adatbázisnak már léteznie kell, ezért a resourceGroupName, serverNameés databaseName paramétereknek a meglévő erőforrásokra kell mutatniuk. Hasonlóképpen a Set-AzSqlElasticJobAgent is használható a rugalmas feladatügynök módosítására.

Ha egy felhasználó által hozzárendelt felügyelt identitással rendelkező Microsoft Entra-hitelesítéssel szeretne létrehozni egy új rugalmas feladatügynököt, használja a IdentityType következő argumentumokatNew-AzSqlElasticJobAgent:IdentityID

Write-Output "Creating job agent..."
$agentName = Read-Host "Please enter a name for your new elastic job agent"
$parameters = @{
    Name = $agentName 
    IdentityType = "UserAssigned" 
    IdentityID = "/subscriptions/abcd1234-caaf-4ba9-875d-f1234/resourceGroups/contoso-jobDemoRG/providers/Microsoft.ManagedIdentity/userAssignedIdentities/contoso-UMI"
}
$jobAgent = $jobDatabase | New-AzSqlElasticJobAgent @parameters
$jobAgent

Új rugalmas feladatügynök létrehozása adatbázis-hatókörű hitelesítő adatokkal, IdentityType és IdentityID nincsenek megadva.

Feladathitelesítés létrehozása

A rugalmas feladatügynöknek képesnek kell lennie a hitelesítésre minden célkiszolgálón vagy adatbázison.

A Feladatügynök-hitelesítés létrehozása című cikknek megfelelően:

A Microsoft Entra-hitelesítés használata UMI-vel a célokhoz való hitelesítéshez

Ha a Microsoft Entra (korábbi nevén Azure Active Directory) hitelesítés ajánlott módszerét szeretné használni egy felhasználó által hozzárendelt felügyelt identitásra (UMI), kövesse az alábbi lépéseket. A rugalmas feladatügynök Entra-hitelesítéssel csatlakozik a kívánt cél logikai kiszolgálóhoz/adatbázisokhoz.

A bejelentkezési és adatbázis-felhasználók mellett vegye figyelembe a GRANT parancsok hozzáadását a következő szkriptben. Ezek az engedélyek szükségesek a jelen példafeladathoz kiválasztott szkript számára. A feladatokhoz eltérő engedélyekre lehet szükség. Mivel a példa létrehoz egy új táblát a megcélzott adatbázisokban, az egyes céladatbázisok adatbázis-felhasználójának megfelelő engedélyekkel kell rendelkeznie a sikeres futtatáshoz.

A célkiszolgáló(k)/adatbázis(ok) mindegyikében hozzon létre egy, az UMI-hez hozzárendelt, tartalmazott felhasználót.

  • Ha a rugalmas feladat logikai kiszolgálóval vagy készletcélokkal rendelkezik, a cél logikai kiszolgáló adatbázisában master létre kell hoznia az UMI-hez hozzárendelt tartalmazott felhasználót.
  • Ha például egy tartalmazott adatbázis-bejelentkezést szeretne létrehozni az master adatbázisban, és egy felhasználót a felhasználói adatbázisban, a felhasználó által hozzárendelt felügyelt identitás (UMI) alapján job-agent-UMI:
$targetServer = '<target server name>'
$adminLogin = '<username>'
$adminPassword = '<password>'

# For the target logical server, in the master database
# Create the login named [job-agent-UMI] based on the UMI [job-agent-UMI], and a user
$params = @{
  'database' = 'master'
  'serverInstance' =  $targetServer.ServerName + '.database.windows.net'
  'username' = $adminLogin
  'password' = $adminPassword
  'outputSqlErrors' = $true
  'query' = 'CREATE LOGIN [job-agent-UMI] FROM EXTERNAL PROVIDER;'
}
Invoke-SqlCmd @params
$params.query = "CREATE USER [job-agent-UMI] FROM LOGIN [job-agent-UMI]"
Invoke-SqlCmd @params

# For each target database in the target logical server
# Create a database user from the job-agent-UMI login 
$targetDatabases = @( $db1.DatabaseName, $Db2.DatabaseName )
$createJobUserScript =  "CREATE USER [job-agent-UMI] FROM LOGIN [job-agent-UMI]"

# Grant permissions as necessary. For example ALTER and CREATE TABLE:
$grantAlterSchemaScript = "GRANT ALTER ON SCHEMA::dbo TO [job-agent-UMI]" 
$grantCreateScript = "GRANT CREATE TABLE TO [job-agent-UMI]"

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

Adatbázis-hatókörű hitelesítő adatok használata a célok hitelesítéséhez

A feladatügynökök a célcsoport által megadott hitelesítő adatokat használják a szkriptek végrehajtásakor és végrehajtásakor. Ezek az adatbázis-hatókörű hitelesítő adatok arra is szolgálnak, hogy csatlakozzanak az master adatbázishoz a kiszolgáló vagy egy rugalmas készlet összes adatbázisának felderítéséhez, ha ezek közül bármelyiket célcsoporttagtípusként használják.

Az adatbázis-hatókörű hitelesítő adatokat létre kell hozni a feladatadatbázisban. A feladat sikeres befejezéséhez minden céladatbázisnak rendelkeznie kell egy megfelelő engedélyeket tartalmazó bejelentkezési hozzáféréssel.

A képen szereplő hitelesítő adatok mellett vegye figyelembe a parancsok hozzáadását GRANT az alábbi szkriptben. Ezek az engedélyek szükségesek a jelen példafeladathoz kiválasztott szkript számára. A feladatokhoz eltérő engedélyekre lehet szükség. Mivel a példa létrehoz egy új táblát a megcélzott adatbázisokban, az egyes céladatbázisok adatbázis-felhasználójának megfelelő engedélyekkel kell rendelkeznie a sikeres futtatáshoz.

Az egyes célkiszolgálókon/adatbázisokban a bejelentkezésnek/felhasználónak ugyanazzal a névvel kell rendelkeznie, mint a feladatfelhasználó adatbázis-hatókörű hitelesítő adatainak identitása, és ugyanaz a jelszó, mint a feladatfelhasználó adatbázis-hatókörű hitelesítő adatai. Ahol a PowerShell-szkriptet használja <strong jobuser password here>, az egész során ugyanazt a jelszót használja.

Az alábbi példa adatbázis-hatókörű hitelesítő adatokat használ. A szükséges feladat hitelesítő adatainak létrehozásához (a feladatadatbázisban) futtassa a következő szkriptet, amely SQL-hitelesítést használ a célkiszolgáló(k)/adatbázis(ok)hoz való csatlakozáshoz:

# For the target logical server, in the master database
# Create the master user login, master user, and job user login
$targetServer = '<target server name>'
$adminLogin = '<username>'
$adminPassword = '<password>'

$params = @{
  'database' = 'master'
  'serverInstance' =  $targetServer.ServerName + '.database.windows.net'
  'username' = $adminLogin
  'password' = $adminPassword
  'outputSqlErrors' = $true
  'query' = 'CREATE LOGIN adminuser WITH PASSWORD=''<strong adminuser password here>'''
}
Invoke-SqlCmd @params
$params.query = "CREATE USER adminuser FROM LOGIN adminuser"
Invoke-SqlCmd @params
$params.query = 'CREATE LOGIN jobuser WITH PASSWORD=''<strong jobuser password here>'''
Invoke-SqlCmd @params

# For each target database in the target logical server
# Create the jobuser from jobuser login and check permission for script execution
$targetDatabases = @( $db1.DatabaseName, $Db2.DatabaseName )
$createJobUserScript =  "CREATE USER jobuser FROM LOGIN jobuser"

# Grant permissions as necessary. For example ALTER and CREATE TABLE:
$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 admin user
Write-Output "Creating job credentials..."
$loginPasswordSecure = (ConvertTo-SecureString -String '<strong jobuser password here>' -AsPlainText -Force)
$loginadminuserPasswordSecure = (ConvertTo-SecureString -String '<strong adminuser password here>' -AsPlainText -Force)

$adminCred = New-Object -TypeName "System.Management.Automation.PSCredential" -ArgumentList "adminuser", $loginadminuserPasswordSecure
$adminCred = $jobAgent | New-AzSqlElasticJobCredential -Name "adminuser" -Credential $adminCred

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

Célkiszolgálók és adatbázisok definiálása

A célcsoport határozza meg azt az egy vagy több adatbázist, amely(ek)en az adott feladatlépés végre lesz hajtva.

A következő kódrészlet két célcsoportot hoz létre: serverGroupés serverGroupExcludingDb2. serverGroup a kiszolgálón a végrehajtás időpontjában létező összes adatbázist célozza meg, és serverGroupExcludingDb2 a kiszolgálón található összes adatbázist célozza meg, kivéve TargetDb2:

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

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

Feladat és lépések létrehozása

Ez a példa egy feladatot és két feladatlépést határoz meg a feladat futtatásához. Az első feladatlépés (step1) létrehoz egy új táblát (Step1Table) a célcsoport ServerGroupminden adatbázisában. A második feladatlépés (step2) létrehoz egy új táblát (Step2Table) minden adatbázisban, kivéve, TargetDb2mert a korábban definiált célcsoport kizárja azt.

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

A feladat futtatása

Futtassa a következő parancsot a feladat azonnali futtatásához:

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

A sikeres befejezés után két új táblát kell látniaTargetDb1, és csak egy új táblát.TargetDb2

Azt is ütemezheti, hogy a feladat később fusson.

Fontos

A rugalmas feladatok minden kezdési időpontja az UTC időzónában van.

A következő paranccsal ütemezheti az adott feladat futtatását egy későbbi időpontra:

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

A feladat-végrehajtások állapotának monitorozása

A feladat-végrehajtások részletes adatai a következő kódrészlettel kérdezhetők le:

# 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

Az alábbi táblázat a feladatok lehetséges végrehajtási állapotát sorolja fel:

State Leírás
Létrehozott A feladat végrehajtása most lett létrehozva, és még nincs folyamatban.
Bejövő forgalom A feladat végrehajtása jelenleg folyamatban van.
WaitingForRetry A feladat végrehajtása nem tudta befejezni a műveletet, és újrapróbálkozásra vár.
Sikerült A feladat végrehajtása sikeresen befejeződött.
SucceededWithSkipped A feladat végrehajtása sikeresen befejeződött, de néhány gyermekét kihagyta.
Failed A feladat végrehajtása sikertelen volt, és kimerítette az újrapróbálkozást.
Időtúllépés A feladat végrehajtása túllépte az időkorlátot.
Visszavont A feladat végrehajtása megszakadt.
Kihagyva A feladat végrehajtása kimaradt, mert ugyanannak a feladatlépésnek egy másik végrehajtása már fut ugyanazon a célon.
WaitingForChildJobExecutions A feladat végrehajtása a gyermekvégrehajtások befejezésére vár.

Clean up resources

A jelen oktatóanyagban létrehozott erőforrásokat az erőforráscsoport törlésével távolíthatja el.

Tipp.

Ha továbbra is dolgozni szeretne ezekkel a feladatokkal, akkor nem törli a cikkben létrehozott erőforrásokat.

Remove-AzResourceGroup -ResourceGroupName $resourceGroupName

Következő lépés