إنشاء عامل مهمة مرنة باستخدام PowerShell (معاينة)

ينطبق على: قاعدة بيانات Azure SQL

⁩مهام مرنة (معاينة)⁧⁩ تمكين تشغيل واحد أو أكثر من Transact-SQL (T-SQL) بالتوازي عبر العديد من قواعد البيانات.

في هذا البرنامج التعليمي، يمكنك معرفة الخطوات المطلوبة لتشغيل استعلام عبر قواعد بيانات متعددة:

  • إنشاء عامل مهمة مرنة
  • إنشاء بيانات اعتماد المهمة؛ بحيث يمكن تنفيذ المهام البرامج النصية على أهدافها
  • تحديد الأهداف (خوادم، تجمعات مرنة، قواعد البيانات، خرائط المقطع) التي تريد تشغيل المهمة عليها
  • إنشاء بيانات اعتماد نطاق قاعدة البيانات في قواعد البيانات الهدف بحيث يتصل العامل، وينفذ المهام
  • قم بإنشاء وظيفة
  • إضافة خطوات مهمة إلى مهمة
  • بدء تنفيذ مهمة
  • مراقبة مهمة

المتطلبات الأساسية

يحتوي الإصدار المطور من مهام قاعدة بيانات مرنة على مجموعة جديدة من أوامر PowerShell للاستخدام أثناء الترحيل. هذه الأوامر الجديدة تنقل جميع بيانات اعتماد المهمة الموجودة لديك، والأهداف (بما في ذلك قواعد البيانات، والخوادم، والمجموعات المخصصة)، ومشغلات المهام، وجداول المهام، ومحتويات المهام، والمهام إلى عامل مهمة مرنة جديد.

تثبيت أحدث cmdlets مهام مرنة

في حال لم يكن لديك اشتراك Azure، فينبغي ⁧⁩إنشاء حساب⁧⁩ مجانًا قبل البدء.

تثبيت وحدة ⁧⁩Az.Sql⁧⁩ للحصول على أحدث cmdlets وظيفة مرنة. تشغيل الأوامر التالية في PowerShell مع الوصول الإداري.

# 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

بالإضافة إلى وحدة ⁧⁩Az.Sql⁧⁩، يتطلب هذا البرنامج التعليمي أيضًا وحدة ⁧⁩SqlServer⁧⁩ PowerShell. لمزيد من التفاصيل، راجع ⁧⁩تثبيت وحدة PowerShell SQL Server⁧⁩.

إنشاء الموارد المطلوبة

يتطلب إنشاء عامل وظيفة مرنة قاعدة بيانات (S0 أو أعلى)؛ لاستخدامها ⁧⁩كقاعدة بيانات مهمة⁧⁩.

يقوم البرنامج النصي أدناه بإنشاء مجموعة موارد جديدة، خادم، وقاعدة بيانات لاستخدامها كقاعدة بيانات المهمة. يقوم البرنامج النصي الثاني بإنشاء خادم ثانٍ مع قاعدتي بيانات فارغة لتنفيذ مهام عليها.

الوظائف المرنة ليس لديها متطلبات تسمية محددة حتى تتمكن من استخدام أي من اصطلاحات التسمية التي تريدها، طالما أنها تتوافق مع أي ⁧⁩متطلبات Azure⁧⁩.

# 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

إنشاء عامل مهمة مرنة

عامل "مهمة مرنة" هو مورد Azure لإنشاء وتشغيل وإدارة المهام. يقوم العامل بتنفيذ المهام استنادًا إلى جدول زمني، أو كمهمة لمرة واحدة.

⁩يتطلب cmdlet New-AzSqlElasticJobAgent⁧⁩ قاعدة بيانات في قاعدة بيانات SQL Azure موجودة بالفعل؛ لذلك يجب أن تشير معلمات ⁧⁩resourceGroupName⁧⁩، و⁧⁩serverName⁧⁩ و⁧⁩databaseName⁧⁩ إلى موارد موجودة.

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

إنشاء بيانات اعتماد المهمة

تستخدم المهام بيانات اعتماد قاعدة البيانات النطاق للاتصال بقواعد البيانات الهدف المحددة من قبل المجموعة الهدف عند تنفيذ ولتنفيذ البرامج النصية. يتم أيضًا استخدام بيانات الاعتماد ذات نطاق قاعدة البيانات للاتصال بقاعدة البيانات الرئيسية لتعداد كافة قواعد البيانات في خادم أو تجمع مرن عند استخدام أي من هذه كنوع عضو المجموعة الهدف.

يجب إنشاء بيانات اعتماد ذات نطاق قاعدة البيانات في قاعدة بيانات مهمة. يجب أن يكون لكافة قواعد البيانات الهدف تسجيل دخول مع أذونات كافية للمهمة لإكمال بنجاح.

Elastic Jobs credentials

بالإضافة إلى بيانات الاعتماد في الصورة، لاحظ إضافة أوامر ⁧⁩GRANT⁧⁩ في البرنامج النصي التالي. هذه الأذونات مطلوبة للبرنامج النصي الذي اخترناه لهذه المهمة على سبيل المثال. لأن المثال يقوم بإنشاء جدول جديد في قواعد البيانات المستهدفة، يحتاج كل هدف db الأذونات المناسبة للتشغيل بنجاح.

لإنشاء بيانات اعتماد المهمة المطلوبة (في قاعدة بيانات المهمة)، قم بتشغيل البرنامج النصي التالي:

# 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

تعريف قواعد البيانات الهدف لتشغيل المهمة عليها

تحدد ⁧⁩المجموعة المستهدفة⁧⁩ مجموعة قواعد البيانات أو أكثر التي سيتم تنفيذ خطوة مهمة عليها.

ينشئ المقتطف التالي مجموعتين هدفين: ⁧⁩serverGroup⁧⁩، و⁧⁩serverGroupExcludingDb2⁧⁩. ⁧⁩serverGroup⁧⁩ تستهدف كافة قواعد البيانات الموجودة على الخادم في وقت التنفيذ، ويستهدف ⁧⁩serverGroupExcludingDb2⁧⁩ كافة قواعد البيانات على الخادم، باستثناء ⁧⁩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

إنشاء مهمة وخطوات

يعرف هذا المثال مهمة وخطوتين للمهمة لتشغيلها. الخطوة المهمة الأولى (⁧⁩step1⁧⁩) تقوم بإنشاء جدول جديد (⁧⁩Step1Table⁧⁩) في كل قاعدة بيانات في مجموعة الهدف ⁧⁩ServerGroup⁧⁩. الخطوة المهمة الثانية (⁧⁩step2⁧⁩) تقوم بإنشاء جدول جديد (⁧⁩Step2Table⁧⁩) في كل قاعدة بيانات باستثناء ⁧⁩TargetDb2⁧⁩؛ لأن المجموعة المستهدفة المحدد مسبقًا اختار استبعادها.

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

تشغيل المهمة

لبدء المهمة فورًا،‏ قم بتشغيل الأمر التالي:

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

بعد الانتهاء بنجاح ينبغي أن تشاهد جدولين جديدين في TargetDb1 وجدولاً جديدًا واحدًا فقط في TargetDb2:

new tables verification in SSMS

يمكنك أيضًا جدولة المهمة للتشغيل لاحقًا. لجدولة مهمة لتشغيلها في وقت محدد، قم بتشغيل الأمر التالي:

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

مراقبة حالة تنفيذ المهام

تحصل المقتطفات التالية على تفاصيل تنفيذ المهمة:

# 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

يسرد الجدول التالي حالات تنفيذ المهمة المحتملة:

الولاية الوصف
تم الإنشاء تم إنشاء تنفيذ المهمة للتو، ولم يتم تنفيذه بعد.
قيد التقدم تنفيذ المهمة جارٍ حاليًا.
⁩WaitingForRetry⁧ لم يتمكن تنفيذ المهمة من إكمال إجرائه، وينتظر إعادة المحاولة.
Succeeded تم إكمال تنفيذ المهمة بنجاح.
⁩SucceededWithSkipped⁧ تم الانتهاء من تنفيذ المهمة بنجاح؛ ولكن تم تخطي بعض فروعها.
فشل فشل تنفيذ المهمة، واستنفاد عمليات إعادة المحاولة.
⁩TimedOut⁧ انقضت مهلة تنفيذ المهمة.
⁩Canceled⁧ تم إلغاء تنفيذ المهمة.
Skipped تم تخطي تنفيذ المهمة؛ لأن تنفيذا آخر من نفس خطوة المهمة كان قيد التشغيل بالفعل على نفس الهدف.
⁩WaitingForChildJobExecutions⁧ ينتظر تنفيذ المهمة اكتمال عمليات تنفيذ فروعها.

تنظيف الموارد

حذف موارد Azure التي تم إنشاؤها في هذا البرنامج التعليمي عن طريق حذف مجموعة الموارد.

تلميح

إذا كنت تخطط لمتابعة العمل مع هذه المهام، فلا تقم بتنظيف الموارد التي تم إنشاؤها في هذه المقالة.

Remove-AzResourceGroup -ResourceGroupName $resourceGroupName

الخطوات التالية

في هذا البرنامج التعليمي، قمت بتشغيل برنامج نصي Transact-SQL على مجموعة من قواعد البيانات. تعلمت كيفية القيام بالمهام التالية:

  • إنشاء عامل مهمة مرنة
  • إنشاء بيانات اعتماد المهمة؛ بحيث يمكن تنفيذ المهام البرامج النصية على أهدافها
  • تحديد الأهداف (خوادم، تجمعات مرنة، قواعد البيانات، خرائط المقطع) التي تريد تشغيل المهمة عليها
  • إنشاء بيانات اعتماد نطاق قاعدة البيانات في قواعد البيانات الهدف بحيث يتصل العامل، وينفذ المهام
  • قم بإنشاء وظيفة
  • إضافة خطوة مهمة إلى المهمة
  • بدء تنفيذ المهمة
  • مراقبة المهمة