Создание эластичных заданий и управление ими с помощью T-SQL
Применимо к: База данных SQL Azure
В этой статье приведены учебники и примеры для начала работы с эластичными заданиями с помощью T-SQL. Задания обработки эластичных баз данных позволяют выполнять скрипты Transact-SQL (T-SQL) в нескольких базах данных одновременно.
В примерах этой статьи используются хранимые процедуры и представления, доступные в базе данных заданий.
В этом комплексном руководстве описаны действия, необходимые для выполнения запроса в нескольких базах данных:
- Создание агента эластичного задания
- создание учетных данных заданий для выполнения скриптов на целевых объектах с помощью этих заданий;
- Определите целевые объекты (серверы, эластичные пулы, базы данных), для выполнения задания
- Создание учетных данных с областью базы данных в целевых базах данных для подключения и выполнения заданий агента
- Создание задания
- добавление шагов задания;
- запуск выполнения задания;
- мониторинг задания.
Создание агента эластичного задания
Transact-SQL (T-SQL) можно использовать для создания, настройки, выполнения и управления заданиями.
Создание агента эластичного задания не поддерживается в T-SQL, поэтому сначала необходимо создать агент эластичных заданий с помощью портал Azure или создать агент эластичных заданий с помощью PowerShell.
Создание проверки подлинности задания
Агент эластичного задания должен иметь возможность проходить проверку подлинности на каждом целевом сервере или базе данных. Как описано в статье "Создание проверки подлинности агента задания", рекомендуется использовать проверку подлинности Microsoft Entra (ранее Azure Active Directory) с управляемым удостоверением, назначаемое пользователем (UMI). Ранее учетные данные в области базы данных были единственным вариантом.
Использование проверки подлинности Microsoft Entra с UMI для выполнения задания
Чтобы использовать рекомендуемый метод проверки подлинности Microsoft Entra (ранее Azure Active Directory) для управляемого удостоверения, назначаемого пользователем (UMI), выполните следующие действия. Агент эластичных заданий подключается к требуемому целевому логическому серверу или базам данных через проверку подлинности Microsoft Entra.
Помимо пользователей входа и базы данных обратите внимание на добавление GRANT
команд в следующем скрипте. Эти разрешения являются обязательными для скрипта, выбранного в этом примере задания. Для заданий могут потребоваться разные разрешения. Так как в примере создается новая таблица в целевых базах данных, пользователю базы данных в каждой целевой базе данных требуются соответствующие разрешения для успешного выполнения.
В каждом целевом сервере или базе данных создайте автономного пользователя, сопоставленного с UMI.
- Если у эластичного задания есть логические серверы или целевые объекты пула, необходимо создать автономного пользователя, сопоставленного с UMI в
master
базе данных целевого логического сервера. - Например, чтобы создать имя входа автономной базы данных в
master
базе данных и пользователя в пользовательской базе данных на основе управляемого удостоверения, назначаемого пользователем (UMI) с именемjob-agent-UMI
:
--Create a login on the master database mapped to a user-assigned managed identity (UMI)
CREATE LOGIN [job-agent-UMI] FROM EXTERNAL PROVIDER;
--Create a user on a user database mapped to a login.
CREATE USER [job-agent-UMI] FROM LOGIN [job-agent-UMI];
-- Grant permissions as necessary to execute your jobs. For example, ALTER and CREATE TABLE:
GRANT ALTER ON SCHEMA::dbo TO jobuser;
GRANT CREATE TABLE TO jobuser;
- Чтобы создать пользователя автономной базы данных, если имя входа не требуется на логическом сервере:
--Create a contained database user on a user database mapped to a user-assigned managed identity (UMI)
CREATE USER [job-agent-UMI] FROM EXTERNAL PROVIDER;
-- Grant permissions as necessary to execute your jobs. For example, ALTER and CREATE TABLE:
GRANT ALTER ON SCHEMA::dbo TO jobuser;
GRANT CREATE TABLE TO jobuser;
Использование учетных данных с областью базы данных для выполнения задания
Учетные данные с областью базы данных используются для подключения к целевым базам данных для выполнения скрипта. Для успешного выполнения сценария этим учетным данным необходимы соответствующие разрешения для баз данных, указанных в целевой группе. При использовании логического члена целевой группы SQL Server и (или) пула рекомендуется создать учетные данные для использования для обновления учетных данных перед расширением сервера и (или) пула во время выполнения задания. Учетные данные в области базы данных создаются в базе данных агента задания.
Для создания имени входа и создания пользователя из имени входа необходимо использовать те же учетные данные, чтобы предоставить разрешения для базы данных входа во всех целевых базах данных.
--Connect to the new job database specified when creating the elastic job agent
-- Create a database master key if one does not already exist, using your own password.
CREATE MASTER KEY ENCRYPTION BY PASSWORD='<EnterStrongPasswordHere>';
-- Create two database-scoped credentials.
-- The credential to connect to the Azure SQL logical server, to execute jobs
CREATE DATABASE SCOPED CREDENTIAL job_credential WITH IDENTITY = 'job_credential',
SECRET = '<EnterStrongPasswordHere>';
GO
-- The credential to connect to the Azure SQL logical server, to refresh the database metadata in server
CREATE DATABASE SCOPED CREDENTIAL refresh_credential WITH IDENTITY = 'refresh_credential',
SECRET = '<EnterStrongPasswordHere>';
GO
Затем создайте имена входа на целевых серверах или пользователей автономной базы данных в целевых базах данных.
Внимание
Имя входа или пользователя на каждом целевом сервере или базе данных должно иметь то же имя, что и удостоверение учетных данных, ограниченных базой данных для пользователя задания, и тот же пароль, что и учетные данные с областью базы данных для пользователя задания.
Создайте имя входа в master
базу данных логического СЕРВЕРА SQL Server и пользователей в каждой пользовательской базе данных.
--Create a login on the master database
CREATE LOGIN job_credential WITH PASSWORD='<Enter_same_StrongPassword_as_database_scoped_credential>';
--Create a user on a user database mapped to a login.
CREATE USER [job_credential] FROM LOGIN [job_credential];
-- Grant permissions as necessary to execute your jobs. For example, ALTER and CREATE TABLE:
GRANT ALTER ON SCHEMA::dbo TO job_credential;
GRANT CREATE TABLE TO job_credential;
Создайте пользователя автономной базы данных, если имя входа не требуется на логическом сервере. Обычно это можно сделать только в том случае, если у вас есть одна база данных для управления с помощью этого агента эластичных заданий.
--Create a contained database user on a user database mapped to a Microsoft Entra account
CREATE USER [job_credential] WITH PASSWORD='<Enter_same_StrongPassword_as_database_scoped_credential>';
-- Grant permissions as necessary to execute your jobs. For example, ALTER and CREATE TABLE:
GRANT ALTER ON SCHEMA::dbo TO job_credential;
GRANT CREATE TABLE TO job_credential;
Определение целевых серверов и баз данных
В приведенном ниже примере показано, как выполнить задание со всеми базами данных на сервере.
Подключитесь к следующей команде job_database
, чтобы добавить целевую группу и целевой член:
-- Connect to the job database specified when creating the job agent
-- Add a target group containing server(s)
EXEC jobs.sp_add_target_group 'ServerGroup1';
-- Add a server target member
EXEC jobs.sp_add_target_group_member
@target_group_name = 'ServerGroup1',
@target_type = 'SqlServer',
@server_name = 'server1.database.windows.net';
--View the recently created target group and target group members
SELECT * FROM jobs.target_groups WHERE target_group_name='ServerGroup1';
SELECT * FROM jobs.target_group_members WHERE target_group_name='ServerGroup1';
Исключение отдельной базы данных
В следующем примере показано, как выполнить задание для всех баз данных на сервере, за исключением базы данных с именем MappingDB
.
При использовании проверки подлинности Microsoft Entra (ранее — Azure Active Directory) опустите @refresh_credential_name
параметр, который следует указать только при использовании учетных данных с областью базы данных. В следующих примерах @refresh_credential_name
параметр закомментирован.
Подключитесь к следующей команде job_database
и выполните следующую команду:
--Connect to the job database specified when creating the job agent
-- Add a target group containing server(s)
EXEC [jobs].sp_add_target_group N'ServerGroup';
GO
-- Add a server target member
EXEC [jobs].sp_add_target_group_member
@target_group_name = N'ServerGroup',
@target_type = N'SqlServer',
--@refresh_credential_name = N'refresh_credential', --credential required to refresh the databases in a server
@server_name = N'London.database.windows.net';
GO
-- Add a server target member
EXEC [jobs].sp_add_target_group_member
@target_group_name = N'ServerGroup',
@target_type = N'SqlServer',
--@refresh_credential_name = N'refresh_credential', --credential required to refresh the databases in a server
@server_name = 'server2.database.windows.net';
GO
--Exclude a database target member from the server target group
EXEC [jobs].sp_add_target_group_member
@target_group_name = N'ServerGroup',
@membership_type = N'Exclude',
@target_type = N'SqlDatabase',
@server_name = N'server1.database.windows.net',
@database_name = N'MappingDB';
GO
--View the recently created target group and target group members
SELECT * FROM [jobs].target_groups WHERE target_group_name = N'ServerGroup';
SELECT * FROM [jobs].target_group_members WHERE target_group_name = N'ServerGroup';
Создание целевой группы (пулов)
В примере ниже показано, как выбрать в качестве цели все базы данных в одном или нескольких эластичных пулах.
При использовании проверки подлинности Microsoft Entra (ранее — Azure Active Directory) опустите @refresh_credential_name
параметр, который следует указать только при использовании учетных данных с областью базы данных. В следующих примерах @refresh_credential_name
параметр закомментирован.
Подключитесь к следующей команде job_database
и выполните следующую команду:
--Connect to the job database specified when creating the job agent
-- Add a target group containing pool(s)
EXEC jobs.sp_add_target_group 'PoolGroup';
-- Add an elastic pool(s) target member
EXEC jobs.sp_add_target_group_member
@target_group_name = 'PoolGroup',
@target_type = 'SqlElasticPool',
--@refresh_credential_name = 'refresh_credential', --credential required to refresh the databases in a server
@server_name = 'server1.database.windows.net',
@elastic_pool_name = 'ElasticPool-1';
-- View the recently created target group and target group members
SELECT * FROM jobs.target_groups WHERE target_group_name = N'PoolGroup';
SELECT * FROM jobs.target_group_members WHERE target_group_name = N'PoolGroup';
Создание задания и шагов
С помощью T-SQL создайте задания с помощью системных хранимых процедур в базе данных заданий: jobs.sp_add_job и jobs.sp_add_jobstep. Команды T-SQL похожи на шаги, необходимые для создания заданий агента SQL и шагов задания в SQL Server.
Не следует обновлять внутренние представления каталога в базе данных заданий. Изменение этих представлений каталога вручную может привести к повреждению базы данных заданий и сбою. Эти представления предназначены только для запросов только для чтения. Хранимые процедуры можно использовать в схеме jobs
в базе данных заданий.
- При использовании проверки подлинности Microsoft Entra для идентификатора Microsoft Entra или управляемого удостоверения, назначаемого пользователем, для проверки подлинности на целевых серверах или базах данных @credential_name аргумент не должен быть указан
sp_add_jobstep
илиsp_update_jobstep
. Аналогичным образом опустите необязательные аргументы @output_credential_name и @refresh_credential_name . - При использовании учетных данных с областью базы данных для проверки подлинности на целевых серверах/базах данных требуется
sp_add_jobstep
параметр @credential_name.sp_update_jobstep
- Например,
@credential_name = 'job_credential'
.
- Например,
В следующих примерах приведены руководства по созданию заданий и заданий с помощью T-SQL для выполнения распространенных задач с эластичными заданиями.
Примеры
Развертывание новой схемы в нескольких базах данных
В приведенном ниже примере показано, как развернуть новую схему во всех базах данных.
Подключитесь к следующей команде job_database
и выполните следующую команду:
--Connect to the job database specified when creating the job agent
--Add job for create table
EXEC jobs.sp_add_job @job_name = 'CreateTableTest', @description = 'Create Table Test';
-- Add job step for create table
EXEC jobs.sp_add_jobstep @job_name = 'CreateTableTest',
@command = N'IF NOT EXISTS (SELECT * FROM sys.tables WHERE object_id = object_id(''Test''))
CREATE TABLE [dbo].[Test]([TestId] [int] NOT NULL);',
@target_group_name = 'PoolGroup';
Сбор данных с помощью встроенных параметров
Во множестве сценариев сбора данных может быть удобно добавить некоторые из приведенных переменных сценариев, чтобы упростить последующую обработку результатов задания.
$(job_name)
$(job_id)
$(job_version)
$(step_id)
$(step_name)
$(job_execution_id)
$(job_execution_create_time)
$(target_group_name)
Например, чтобы сгруппировать все результаты из одного выполнения задания вместе, используйте $(job_execution_id)
, как показано в следующей команде:
@command= N' SELECT DB_NAME() DatabaseName, $(job_execution_id) AS job_execution_id, * FROM sys.dm_db_resource_stats WHERE end_time > DATEADD(mi, -20, GETDATE());'
Примечание.
Все время в эластичных заданиях находятся в часовом поясе UTC.
Мониторинг производительности базы данных
Приведенный ниже пример создает задание для сбора данных производительности из нескольких баз данных.
По умолчанию агент заданий создаст выходную таблицу для хранения возвращаемых результатов. Таким образом, участник базы данных, связанный с учетными данными для входа, должен иметь как минимум следующие разрешения: CREATE TABLE
для базы данных, ALTER
, SELECT
, INSERT
, DELETE
для выходной таблицы или ее схемы, а также SELECT
для представления sys.indexes каталога.
Если необходимо заранее вручную создать таблицу, тогда она должна иметь такие свойства.
- Столбцы с правильными именами и типами данных для результирующего набора.
- Дополнительный столбец для
internal_execution_id
типа данных uniqueidentifier. - Некластеризованный индекс с именем
IX_<TableName>_Internal_Execution_ID
столбцаinternal_execution_id
. - Все ранее перечисленные разрешения,
CREATE TABLE
кроме разрешений для базы данных.
Подключитесь к базе данных заданий и выполните команды, приведенные ниже.
--Connect to the job database specified when creating the job agent
-- Add a job to collect perf results
EXEC jobs.sp_add_job @job_name ='ResultsJob', @description='Collection Performance data from all customers'
-- Add a job step w/ schedule to collect results
EXEC jobs.sp_add_jobstep
@job_name = 'ResultsJob',
@command = N' SELECT DB_NAME() DatabaseName, $(job_execution_id) AS job_execution_id, * FROM sys.dm_db_resource_stats WHERE end_time > DATEADD(mi, -20, GETDATE());',
@target_group_name = 'PoolGroup',
@output_type = 'SqlDatabase',
@output_server_name = 'server1.database.windows.net',
@output_database_name = '<resultsdb>',
@output_table_name = '<output_table_name>';
--Create a job to monitor pool performance
--Connect to the job database specified when creating the job agent
-- Add a target group containing elastic job database
EXEC jobs.sp_add_target_group 'ElasticJobGroup';
-- Add a server target member
EXEC jobs.sp_add_target_group_member
@target_group_name = 'ElasticJobGroup',
@target_type = 'SqlDatabase',
@server_name = 'server1.database.windows.net',
@database_name = 'master';
-- Add a job to collect perf results
EXEC jobs.sp_add_job
@job_name = 'ResultsPoolsJob',
@description = 'Demo: Collection Performance data from all pools',
@schedule_interval_type = 'Minutes',
@schedule_interval_count = 15;
-- Add a job step w/ schedule to collect results
EXEC jobs.sp_add_jobstep
@job_name='ResultsPoolsJob',
@command=N'declare @now datetime
DECLARE @startTime datetime
DECLARE @endTime datetime
DECLARE @poolLagMinutes datetime
DECLARE @poolStartTime datetime
DECLARE @poolEndTime datetime
SELECT @now = getutcdate ()
SELECT @startTime = dateadd(minute, -15, @now)
SELECT @endTime = @now
SELECT @poolStartTime = dateadd(minute, -30, @startTime)
SELECT @poolEndTime = dateadd(minute, -30, @endTime)
SELECT elastic_pool_name , end_time, elastic_pool_dtu_limit, avg_cpu_percent, avg_data_io_percent, avg_log_write_percent, max_worker_percent, max_session_percent,
avg_storage_percent, elastic_pool_storage_limit_mb FROM sys.elastic_pool_resource_stats
WHERE end_time > @poolStartTime and end_time <= @poolEndTime;
',
@target_group_name = 'ElasticJobGroup',
@output_type = 'SqlDatabase',
@output_server_name = 'server1.database.windows.net',
@output_database_name = 'resultsdb',
@output_table_name = '<output_table_name>';
Запуск задания
В следующем примере показано, как сразу же запустить задание как вручную незапланированное действие.
Подключитесь к следующей команде job_database
и выполните следующую команду:
--Connect to the job database specified when creating the job agent
-- Execute the latest version of a job
EXEC jobs.sp_start_job 'CreateTableTest';
-- Execute the latest version of a job and receive the execution ID
declare @je uniqueidentifier;
exec jobs.sp_start_job 'CreateTableTest', @job_execution_id = @je output;
select @je;
-- Monitor progress
SELECT * FROM jobs.job_executions WHERE job_execution_id = @je;
Планирование выполнения задания
В следующем примере показано, как запланировать задание для будущего выполнения каждые 15 минут.
Подключитесь к следующей команде job_database
и выполните следующую команду:
--Connect to the job database specified when creating the job agent
EXEC jobs.sp_update_job
@job_name = 'ResultsJob',
@enabled=1,
@schedule_interval_type = 'Minutes',
@schedule_interval_count = 15;
Просмотр определений заданий
В следующем примере показано, как просмотреть определения текущих заданий.
Подключитесь к следующей команде job_database
и выполните следующую команду:
--Connect to the job database specified when creating the job agent
-- View all jobs
SELECT * FROM jobs.jobs;
-- View the steps of the current version of all jobs
SELECT js.* FROM jobs.jobsteps js
JOIN jobs.jobs j
ON j.job_id = js.job_id AND j.job_version = js.job_version;
-- View the steps of all versions of all jobs
SELECT * FROM jobs.jobsteps;
Отслеживание состояния выполнения задания
В приведенном ниже примере показано, как просмотреть сведения о состоянии выполнения всех заданий.
Подключитесь к следующей команде job_database
и выполните следующую команду:
--Connect to the job database specified when creating the job agent
--View top-level execution status for the job named 'ResultsPoolJob'
SELECT * FROM jobs.job_executions
WHERE job_name = 'ResultsPoolsJob' and step_id IS NULL
ORDER BY start_time DESC;
--View all top-level execution status for all jobs
SELECT * FROM jobs.job_executions WHERE step_id IS NULL
ORDER BY start_time DESC;
--View all execution statuses for job named 'ResultsPoolsJob'
SELECT * FROM jobs.job_executions
WHERE job_name = 'ResultsPoolsJob'
ORDER BY start_time DESC;
-- View all active executions
SELECT * FROM jobs.job_executions
WHERE is_active = 1
ORDER BY start_time DESC;
Отмена задания
В следующем примере показано, как получить идентификатор выполнения задания, а затем отменить выполнение задания.
Подключитесь к следующей команде job_database
и выполните следующую команду:
--Connect to the job database specified when creating the job agent
-- View all active executions to determine job execution ID
SELECT * FROM jobs.job_executions
WHERE is_active = 1 AND job_name = 'ResultPoolsJob'
ORDER BY start_time DESC;
GO
-- Cancel job execution with the specified job execution ID
EXEC jobs.sp_stop_job '01234567-89ab-cdef-0123-456789abcdef';
Удаление старого журнала заданий
В приведенном ниже примере показано, как удалить старый журнал заданий до определенной даты.
Подключитесь к следующей команде job_database
и выполните следующую команду:
--Connect to the job database specified when creating the job agent
-- Delete history of a specific job's executions older than the specified date
EXEC jobs.sp_purge_jobhistory @job_name='ResultPoolsJob', @oldest_date='2016-07-01 00:00:00';
--Note: job history is automatically deleted if it is >45 days old
Удаление задания и его журнала заданий
В приведенном ниже примере показано, как удалить задание и связанный с ним журнал заданий.
Подключитесь к следующей команде job_database
и выполните следующую команду:
--Connect to the job database specified when creating the job agent
EXEC jobs.sp_delete_job @job_name='ResultsPoolsJob';
EXEC jobs.sp_purge_jobhistory @job_name='ResultsPoolsJob';
--Note: job history is automatically deleted if it is >45 days old
Хранимые процедуры задания
В базе данных заданий доступны следующие хранимые процедуры. Они также называются, но отличаются от системных хранимых процедур, используемых для службы агент SQL Server.
Хранимая процедура | Description |
---|---|
sp_add_job | Добавляет новое задание. |
sp_update_job | Обновляет существующее задание. |
sp_delete_job | Удаляет существующее задание. |
sp_add_jobstep | Добавляет шаг в задание. |
sp_update_jobstep | Обновляет шаг задания. |
sp_delete_jobstep | Удаляет шаг задания. |
sp_start_job | Запускает выполнение задания. |
sp_stop_job | Останавливает выполнение задания. |
sp_add_target_group | Добавляет целевую группу. |
sp_delete_target_group | Удаляет целевую группу. |
sp_add_target_group_member | Добавляет базу данных или несколько баз данных в целевую группу. |
sp_delete_target_group_member | Удаляет элемент из целевой группы. |
sp_purge_jobhistory | Удаляет записи журнала для задания. |
Представления заданий
Ниже приведены представления, доступные в базе данных заданий.
Представления | Description |
---|---|
job_executions | Отображает журнал выполнения задания. |
jobs | Отображает все задания. |
job_versions | Отображает все версии задания. |
jobsteps | Отображает все шаги в текущей версии каждого задания. |
jobstep_versions | Отображает все шаги во всех версиях каждого задания. |
target_groups | Отображает все целевые группы. |
target_group_members | Отображает все элементы всех целевых групп. |