إنشاء عامل مهمة مرنة باستخدام 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
إنشاء بيانات اعتماد المهمة
تستخدم المهام بيانات اعتماد قاعدة البيانات النطاق للاتصال بقواعد البيانات الهدف المحددة من قبل المجموعة الهدف عند تنفيذ ولتنفيذ البرامج النصية. يتم أيضًا استخدام بيانات الاعتماد ذات نطاق قاعدة البيانات للاتصال بقاعدة البيانات الرئيسية لتعداد كافة قواعد البيانات في خادم أو تجمع مرن عند استخدام أي من هذه كنوع عضو المجموعة الهدف.
يجب إنشاء بيانات اعتماد ذات نطاق قاعدة البيانات في قاعدة بيانات مهمة. يجب أن يكون لكافة قواعد البيانات الهدف تسجيل دخول مع أذونات كافية للمهمة لإكمال بنجاح.
بالإضافة إلى بيانات الاعتماد في الصورة، لاحظ إضافة أوامر 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:
يمكنك أيضًا جدولة المهمة للتشغيل لاحقًا. لجدولة مهمة لتشغيلها في وقت محدد، قم بتشغيل الأمر التالي:
# 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 على مجموعة من قواعد البيانات. تعلمت كيفية القيام بالمهام التالية:
- إنشاء عامل مهمة مرنة
- إنشاء بيانات اعتماد المهمة؛ بحيث يمكن تنفيذ المهام البرامج النصية على أهدافها
- تحديد الأهداف (خوادم، تجمعات مرنة، قواعد البيانات، خرائط المقطع) التي تريد تشغيل المهمة عليها
- إنشاء بيانات اعتماد نطاق قاعدة البيانات في قواعد البيانات الهدف بحيث يتصل العامل، وينفذ المهام
- قم بإنشاء وظيفة
- إضافة خطوة مهمة إلى المهمة
- بدء تنفيذ المهمة
- مراقبة المهمة