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:
- Használja a felhasználó által hozzárendelt felügyelt identitásra (UMI) leképezett adatbázis-felhasználókat a célkiszolgáló(k)/adatbázis(ok) hitelesítéséhez.
- Az UMI használata Microsoft Entra-hitelesítéssel (korábbi nevén Azure Active Directory) az ajánlott módszer. A PowerShell-parancsmagok új argumentumokkal támogatják a Microsoft Entra hitelesítést umi-vel.
- Ez az ajánlott hitelesítési módszer.
- Adatbázis-felhasználókat használjon az adatbázis-hatókörű hitelesítő adatokhoz az egyes adatbázisokban.
- Korábban az adatbázis-hatókörbe tartozó hitelesítő adatok voltak az egyetlen lehetőség arra, hogy a rugalmas feladatügynök hitelesítse magát a célokon.
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ánjob-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 ServerGroup
minden adatbázisában. A második feladatlépés (step2
) létrehoz egy új táblát (Step2Table
) minden adatbázisban, kivéve, TargetDb2
mert 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