Статьи

Azure SQL Elastic Jobs

В эти выходные в SQL Saturday Manchester я представляю сессию о том, как бороться с отсутствием агента SQL при переходе на Azure SQL. В этом сеансе рассматриваются параметры в Azure для запуска обычных заданий с базами данных SQL и обычно основное внимание уделяется использованию функций автоматизации Azure и Azure. Однако всего за пару недель до мероприятия Microsoft выпустила новый сервис, который также можно использовать для заполнения этого пробела, SQL Elastic Jobs, и поэтому мне нужно было втиснуть его в мою презентацию в последнюю минуту. Готовя свои демонстрации к этому событию, я наткнулся на некоторые ошибки, и именно на это мы и будем смотреть на этой неделе.

Возможно, вы слышали о Elastic Jobs раньше; существовал старый сервис Azure Elastic Jobs, который существует уже несколько лет; Однако этот сервис не был очень полезен. Он был в основном нацелен на работу с закрытыми базами данных и требовал, чтобы вы работали на месте. Этот сервис заменяется этим новым сервисом, который полностью работает в Azure.

Azure Elastic Jobs позволяет вам писать задачи обслуживания БД в T-SQL и сохранять их в агенте заданий, а затем заставлять агента запускать ваше задание на нескольких серверах, базах данных и эластичных пулах, включая базы данных в других подписках. Вы можете запускать задания как разовые или по расписанию.

Ограничения

Прежде чем мы начнем понимать, как все это работает, необходимо знать о некоторых ограничениях, прежде чем вы решите использовать этот сервис:

  • Это в настоящее время в предварительном просмотре, будучи объявленным несколько недель назад
  • Документация в это время относительно ограничена. Есть документы о том, как выполнять необходимые задачи, но если вы хотите сделать что-то более продвинутое, вы должны понять это самостоятельно
  • Предварительный просмотр ограничен выполнением 100 одновременных заданий
  • Администрирование осуществляется только через PowerShell или T-SQL. Вы можете просматривать вакансии на портале, но не взаимодействовать с ними
  • Задания выполняются с использованием одинаковых учетных данных для всех целей, поэтому эта учетная запись должна существовать в целевых базах данных с разрешениями для выполнения необходимых действий.

Масштаб и стоимость

Упругие рабочие места основаны на концепции агента по трудоустройству; это просто база данных SQL Azure, которую вы преобразовали в агент задания. Это означает, что производительность, масштаб и стоимость Elastic Jobs полностью зависят от вашего выбора базы данных SQL для вашего агента заданий. За обслуживание не взимается дополнительная плата, только стоимость БД.

DB агента задания должен быть как минимум S0, базовый SKU не поддерживается, и рекомендуется S1 или выше.

Предпосылки

Как уже упоминалось, администрирование этого сервиса осуществляется только через PowerShell или T-SQL. Мы собираемся сосредоточиться на использовании Powershell, поскольку мы можем делать все с этим, если вы используете T-SQL. Некоторые шаги все еще должны быть выполнены в PowerShell.

Поскольку эта служба находится в режиме предварительного просмотра, необходимые командлеты PowerShell не включены в стандартную Azure Powershell; вам нужна предварительная версия, и в данный момент необходимая предварительная версия имеет номер версии ниже текущей версии GA, что вызвало некоторые проблемы с инструкциями ранее. Чтобы установить это, вам нужно настроить PowerShell для получения предварительной версии, а затем установить нужную нам версию. Вам необходимо выполнить следующие команды от имени администратора.

Find-Package PackageManagement -RequiredVersion 1.1.7.2 | Install-Package -Force 
Find-Package PowerShellGet -RequiredVersion 1.6.5 | Install-Package -Force 
Install-Module -Name AzureRM.Sql -AllowPrerelease -RequiredVersion 4.8.1-preview -Force 
Import-Module AzureRM.Sql -RequiredVersion 4.8.1 

Как только это будет сделано, вы сможете запустить команду ниже и не получить ошибку:

Get-Help Get-AzureRmSqlElasticJobAgent 

Вам также необходимо включить подписку для предварительного просмотра, выполнив следующую команду:

Register-AzureRmProviderFeature -FeatureName sqldb-JobAccounts -ProviderNamespace Microsoft.Sql 

Регистрация может занять некоторое время, вы можете проверить это, выполнив следующую команду:

Как только статус возвращается как «Зарегистрирован», вы готовы к работе.

Elastic Job Setup

Теперь, когда у нас есть предварительная настройка, мы можем приступить к настройке эластичных заданий, что включает в себя следующие шаги:

  1. Создание новой пустой базы данных для использования в качестве нашего агента по работе
  2. Создание Elastic Job Agent
  3. Создание учетных данных. Агент Elastic Job должен иметь доступ к учетным данным, чтобы иметь возможность доступа к базам данных, с которыми он будет работать. Если вы ссылаетесь на сервер, а не на БД, то ему нужны учетные данные, чтобы иметь возможность перечислять базы данных на сервере.
  4. Создать цель — цель объединяет базы данных, серверные и эластичные пулы, над которыми вы хотите работать.
  5. Создать задание — это контейнер для задач, которые мы хотим запустить, и ссылается на учетные данные, которые будут использоваться
  6. Создание задач — это отдельные рабочие элементы, которые вы будете выполнять над базой данных и которые содержат ваши команды T-SQL
  7. Запустите или запланируйте свою работу

Документация Microsoft по выполнению этих шагов довольно обширна, поэтому я не буду перефразировать ее здесь. Выполните следующие действия, а затем вернитесь, чтобы посмотреть на некоторые более сложные предметы

Выходные задания

Все задания, описанные в документах Microsoft, действуют на цель для внесения изменений. Тем не менее, также возможно извлечь данные из целей. На приведенной выше схеме это то место, куда входит выходная база данных. Выходная база данных — это просто обычная база данных SQL Azure, где агент задания может получить любой ответ из целевых баз данных и записать его в выходную базу данных.

В этом примере мы рассмотрим выполнение запроса ко всем базам данных, который получает степень фрагментации в каждой таблице и записывает это. Первое, что нам нужно сделать, это написать наш запрос, который получит эти данные. Мы должны помнить, что результаты этого запроса будут записываться в одну и ту же таблицу в выходной базе данных для каждой цели, поэтому запрос должен иметь уникальную ссылку на цель. В этом примере мы используем имя БД.

SELECT 
DB_NAME() AS [Current Database],
SYSDATETIME()  as [QueryDate],
dbschemas.[name] as 'Schema',
dbtables.[name] as 'Table',
dbindexes.[name] as 'Index',
indexstats.avg_fragmentation_in_percent,
indexstats.page_count
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL) AS indexstats
INNER JOIN sys.tables dbtables on dbtables.[object_id] = indexstats.[object_id]
INNER JOIN sys.schemas dbschemas on dbtables.[schema_id] = dbschemas.[schema_id]
INNER JOIN sys.indexes AS dbindexes ON dbindexes.[object_id] = indexstats.[object_id]
AND indexstats.index_id = dbindexes.index_id
WHERE indexstats.database_id = DB_ID()
ORDER BY indexstats.avg_fragmentation_in_percent desc

Теперь нам нужно создать нашу работу; это то же самое, что и предыдущие рабочие места, которые мы создали

$jobAgent= Get-AzureRmSqlElasticJobAgent -ResourceGroupName "SQLAgentDemos" -ServerName "SQLAgentDemo" -Name "DemoJobAgent"
$serverGroupName="ServerGroup1"
$credentialName="jobuser"

Write-Output "Creating a new job"
$JobName = "GetFragmentation"
$Job = $JobAgent | New-AzureRmSqlElasticJob -Name $JobName -RunOnce

Где это отличается при создании задания. Здесь нам нужно указать некоторые дополнительные параметры для подключения к выходной базе данных:

  •  OutputDatabaseObject— Это база данных SQL Azure, в которой хранятся выходные данные. Эта команда ожидает фактический объект SQL Azure, поэтому вам нужно использовать команду get-AzureRMSQLDatabase, чтобы получить это
  •  OutputCredentialName— Учетные данные, чтобы использовать для записи в выходной БД. Эта команда ожидает эластичные учетные данные
  •  OutputTableName— Имя таблицы для записи данных в
  •  OutputSchemaName— схема БД, в которой находится таблица
$SQLCommandString = @"
SELECT 
DB_NAME() AS [Current Database],
SYSDATETIME()  as [QueryDate],
dbschemas.[name] as 'Schema',
dbtables.[name] as 'Table',
dbindexes.[name] as 'Index',
indexstats.avg_fragmentation_in_percent,
indexstats.page_count
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL) AS indexstats
INNER JOIN sys.tables dbtables on dbtables.[object_id] = indexstats.[object_id]
INNER JOIN sys.schemas dbschemas on dbtables.[schema_id] = dbschemas.[schema_id]
INNER JOIN sys.indexes AS dbindexes ON dbindexes.[object_id] = indexstats.[object_id]
AND indexstats.index_id = dbindexes.index_id
WHERE indexstats.database_id = DB_ID()
ORDER BY indexstats.avg_fragmentation_in_percent desc
"@


$outputDatabase=Get-AzureRmSqlDatabase -DatabaseName "OutputDatabase" -ResourceGroupName "SQLAgentDemos" -ServerName "SQLAgentDemo" 
$Job | Add-AzureRmSqlElasticJobStep -Name "step1" -TargetGroupName $serverGroupName -CredentialName $credentialName -CommandText $SQLCommandString -OutputDatabaseObject $outputDatabase -OutputCredentialName $credentialName -OutputTableName "Fragmentation" -OutputSchemaName "dbo"

Когда мы запускаем это задание, оно запрашивает все цели и записывает данные в выходную БД. Если учетная запись, для которой вы выполняете задание с правами, может создать для вас выходную таблицу, если она не существует, это самый простой вариант. Если это невозможно, вы можете вручную создать таблицу, соответствующую результатам вашего запроса, но она также должна включать дополнительный столбец с именем  internal_execution_id  type   UniqueIdentifier.

Отладка

Если ваши задания терпят неудачу, вы можете получить некоторую отладочную информацию из базы данных заданий. Используя SQL Management Studio, вы можете подключиться к базе данных и открыть  job_task_executions таблицу. Эта таблица показывает выполнение каждой задачи, и если есть ошибки, они будут перечислены в этой таблице. Вы также можете просмотреть таблицу job_executions, чтобы получить общий статус задания.

Если задание не выполняется, оно будет повторяться несколько раз, прежде чем полностью завершится неудачей.

Резюме

Упругие задания — это полезное дополнение к набору инструментов, которое можно использовать для замены агента SQL в Azure. Это все еще в предварительном просмотре и имеет некоторые проблемы и ограничения на данный момент. В некоторых отношениях ограничение T-SQL имеет некоторые ограничения по сравнению с чем-то вроде автоматизации Azure, особенно если вы хотите манипулировать другими ресурсами наряду с Azure SQL, но в качестве чистой замены для агента SQL он действительно обещает.