Azure SQL Database – Como criar um Job para executar uma procedure?
Fala Pessoal,
Continuando a série de posts sobre Azure SQL Database, dessa vez vou resolver um problema que muitos de vocês que já estão trabalhando com o Azure SQL devem ter passado.
Fabrício, o Azure SQL Database não tem um Agent????
Como que vou rodar meus Jobs de Desfragmentação de Índices, Atualização de Estatísticas, CheckDB e procedures agendadas dos sistemas da minha empresa???
Help-me!!!
Pois é…
Quem já brincou um pouco com o SQL Azure Database sabe que agendar uma execução de uma procedure não é uma tarefa tão fácil como é em uma instância do SQL Server.
Botão direito->New Job não existe no Azure SQL Database…. =(
Pesquisei sobre o assunto e não consegui achar nenhum passo a passo simples. Até pedi para alguns brothers que já tinham mais experiência com Azure para publicar algo sobre isso que eu não encontrava nada em português, mas na correria do dia a dia não conseguiram fazer.
Como estou trabalhando em um projeto de migração de um ambiente para o Azure SQL Database, um dos desenvolvedores dessa empresa (Matheus Felix) já tinha agendado algumas procedures e me explicou uma das formas de fazer isso. Obrigado pela ajuda Matheus!!!
Dito isso, vamos a um passo a passo de como agendar uma procedure para executar em um Job no Azure SQL Database.
Antes de começar a criar o job, criei duas tabelas e duas procedures em uma database chamada Database02 que tenho no azure.
Quando os 2 jobs que vamos criar rodarem, eles vão fazer um simples insert nessas tabelas.
1 2 3 4 5 6 7 8 9 10 11 12 |
CREATE TABLE Teste_Execucao_Job_1 ( Dt_Log DATETIME, Ds_Obs VARCHAR(100) ) CREATE table Teste_Execucao_Job_2 ( Dt_Log DATETIME, Ds_Obs VARCHAR(100) ) GO CREATE procedure dbo.stpTeste_Execucao_Job_1 as insert into Teste_Execucao_Job_1(Dt_Log,Ds_Obs) select SYSDATETIMEOFFSET() AT TIME ZONE 'E. South America Standard Time','Aeeeeee!!!!!! Consegui criar um job no azure!!!!! Até que enfim!!!!' GO CREATE procedure dbo.stpTeste_Execucao_Job_2 as insert into Teste_Execucao_Job_2(Dt_Log,Ds_Obs) select SYSDATETIMEOFFSET() AT TIME ZONE 'E. South America Standard Time','Aeeeeee!!!!!! Funcionou de novo!!!!! Agora ninguém me segura !!!!' |
Passo a passo para criar um Job no Azure SQL Database utilizando runbook:
1) Criar um serviço de Automação
Clique em Create a resource -> Procure por “Automation” -> Clique em Automation -> Create
Escolha um nome -> Coloque a Subscription -> Crie ou use um Resource Group já existente -> Escolha a Localização -> Create
Aguarde o Deploy concluir.
Com o deploy concluído, visualize o serviço de automação que acabamos de criar.
Repare que tem uma opção chamada Runbooks. É ali que vamos clicar no próximo passo.
2) Criar um Runbook para executar nossa procedure
Clique em Runbook (conforme foto anterior) -> Clique em Add a runbook -> Create a new runbook -> Escolha um nome para o seu Runbook -> Em Runbook type coloque PowerShell -> Descrição -> Create
Em seguida você vai ter que pegar esse Script PowerShell abaixo e realizar as alterações para os dados da sua base de dados no Azure SQL Database:
- Seu servidor no Azure: ‘srvfabriciolimasolucoes.database.windows.net’
- Sua base no Azure: ‘database02’
- Seu usuário para conectar na base: ‘Seu_Usuario’
- Senha desse usuário: ‘XXXX’
- Alterar também essa parte da Connection Scring: “User ID=Seu_Usuario;Password=XXXX”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
write-output "Será que o meu Job no Azure vai funcionar?" $SQLInstaciaAzure = 'srvfabriciolimasolucoes.database.windows.net' $SQLDatabase = 'database02' $SQLUser = 'Seu_Usuario' $SQLPassword = 'XXXX' $SQLConnection = New-Object System.Data.SqlClient.SqlConnection $SQLConnection.ConnectionString = "Server=tcp:$SQLInstaciaAzure,1433;Initial Catalog=$SQLDatabase;Persist Security Info=False;User ID=Seu_Usuario;Password=XXXX;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;Pooling=false" $SQLQuery = "dbo.stpTeste_Execucao_Job_1" write-output $SQLQuery $SQLCmd = New-Object System.Data.SqlClient.SqlCommand($SQLQuery,$SQLConnection) $SQLConnection.Open() $SQLCmd.CommandTimeout = '0' $SQLCmd.ExecuteScalar() $SQLConnection.Close() write-output "Aeeee!!!! Cheguei no final do job!!!!" |
Com o script alterado para a sua realidade, copie o código para RUNBOOKS conforme a foto abaixo:
Você também pode testar o Runbook clicanto em Test Pane -> Start -> Se tudo der certo no teste, a tabela já terá uma linha nesse momento.
Vou deixar para mostrar o print dos inserts realizados pelos agendamentos no final desse post.
Saia da tela de teste e volte para a tela anterior clicando em “Edit PowerShell RunBook” no caminho no alto da tela.
Para concluir o Runbook, Clique em Save-> Clique em Publish-> Aperte YES
Segue abaixo como ficou nosso RunBook:
3) Criar o Scheduler para executar nosso RunBook
Clique no Runbook que acabamos de criar -> Clique em Schedule -> Link a schedule to your runbook -> Create a new schedule -> Coloque um nome no agendamento -> Escreva uma descrição -> Escolha a data e horário inicial do job -> Clique em Recurring para que o job se repita -> Selecione Hour, Day, Week or Month
Como você pode perceber, o menor intervalo que vamos conseguir agendar nosso job será a cada 1 hora.
Mas Fabrício, como coloco um job para rodar a cada 15 minutos?
Ai podemos fazer um jeitinho brasileiro e criar 4 schedulers (minuto 00, minuto 15, minuto 30 e minuto 45).
E se precisar de um job a cada 1 minuto?
Resposta no site do Azure: “Criar um webhook para o runbook e usar o Agendador do Azure para chamar o webhook. O Agendador do Azure fornece granularidade mais refinada ao definir uma agenda.”
Fonte: https://docs.microsoft.com/pt-br/azure/automation/automation-schedules
Revise as informações do agendamento:
Clique em Create.
Repita esses passo para criar outros 3 agendamentos para os minutos 15, 30 e 45.
Feito isso teremos 4 agendamentos conforme abaixo:
Nesse passo 3 nós já criamos os agendamentos e associamos para o nosso RunBook.
Mas Fabrício, toda vez que criar um job para rodar a cada 15 min vou ter que criar esses 4 agendamentos?
Não.
Repita o passo 2 para criar um segundo runbook para chamar a procedure stpTeste_Execucao_Job_2.
Veja como fica com o segundo RunBook criado:
Clique no Runbook 2 -> Clique em Schedule -> Link a schedule to your runbook -> Escolha um dos agendamentos que criamos para o job anterior -> Clique em ok
Repita isso para todos os schedules para esse segundo Job também ficar com 4 agendamentos.
Clicando em Schedule desse Runbook 2, conseguimos ver novamente os 4 agendamentos:
Ou seja, não precisamos recriar os agendamentos. \o/
Pronto. A criação dos nossos 2 jobs foi concluída com sucesso.
Agora é só aguardar os agendamentos serem executados.
Esse serviço de Automação de processos tem um pequeno custo para ser utilizado. Você tem 500 minutos grátis a cada mês e o que passar disso você paga R$ 0,007/minuto.
Se um job de desfragmentação de índice demorar 1 hora por dia:
Custo Mensal = 1.800 minutos – 500 grátis = 1.300* 0,007 = R$ 9,10 por mês
Um valor bem acessível para a empresa de vocês.
Fonte: https://azure.microsoft.com/pt-br/pricing/details/automation/
Esperei quase uma hora para deixar os agendamentos executarem e mostrar os resultados para vocês.
Após as execuções dos Jobs, vamos conferir se temos um INSERT a cada 15 min:
WOW!!! Não é que funciona??? TOP em!!!
No portal do azure, também podemos monitorar a execução desses jobs de algumas formas.
Nessa tela abaixo podemos ver um overview da execução de todos os Jobs. Isso é mais perto do Agent que temos, já que conseguimos ver os jobs que estão rodando, que falharam, que executaram com sucesso e etc…
Visualização das execuções de um Runbook específico:
É isso ai galera. Um post um pouco longo mas acredito que será MUITO útil para vocês que estão migrando seus sistemas para o Azure SQL Database.
Até a próxima.
Posts relacionados sobre o Azure SQL Database:
- Azure SQL Database – Função getdate() com valor errado no Azure. É isso mesmo?
- Azure SQL DB Managed Instance – Introdução
- Azure SQL Database – Como fazer um join entre tabelas de bases diferentes?
- Azure SQL Database – Quanto posso usar de Transaction Log? É ilimitado?
Gostou da dica?
Curta, comente, compartilhe com os coleguinhas…
Assine meu canal no Youtube e curta minha Página no Facebook para receber Dicas de Leituras e Eventos sobre SQL Server.
Abraços,
Fabrício Lima
Microsoft Data Platform MVP
Consultor e Instrutor SQL Server
Trabalha com SQL Server desde 2006
Muito bom!
Obrigado César!
Parabéns! Muito bom o artigo!
Obrigado Willians!
Bom demais Runbook, quem também não manja muito de Powershell, ele permite que você faça upload de outros módulos, como o dbatools, que fica muito mais simples.
Top em. Isso nunca testei.
Fabrício, vc é fera cara!!!
Obrigado por compartilhar este post, me ajudou muito.
Obrigado Bruno!
Boa tarde, poderia por gentileza me ajudar com uma forma de retorna o resultado do sp_updatestats pelo próprio runbook? quando uso o runbook e utilizo o script informado acima não tenho o retorno da execução da procedure.
Existe um service no Azure que funciona como o Agent do SQL Server para os databases do Azure SQL Server. O serviço chama-se “Elastic Job Agents”. Link com documentação para usar: https://docs.microsoft.com/en-us/azure/azure-sql/database/job-automation-overview
Show Leandro.
Com o tempo novas opções vão aparecendo.
Obrigado por compartilhar
Se meu server for on premisse? estamos querendo tirar a responsabilidade dos jobs no servidor on premisse e jogar em um serviço na Azure. Mas esse exemplo é Azure SQL Database. Como faria pra conectar no on premisse?
Nunca fiz.
Teria que estudar as possibilidades.