Como criar mais de 30 alertas por e-mail no SQL Server RDS da Amazon
Fala Pessoal,
Para quem encontrou meu Blog só agora, desde setembro já tinha liberado scripts para criar 40 alertas no SQL Server:
Também gravei um mini curso grátis explicando em detalhes como configurar esses 40 alertas:
https://cursos.fabriciolima.net/course?courseid=criando-40-alertas-para-monitorar-o-sql-server
Contudo, esses alertas funcionam para você que administra uma instância “normal” do SQL Server (Físico ou Virtual).
Quem utiliza o SQL Server na Amazon como serviço (RDS), não consegue configurar esse tipo de e-mail diretamente do SQL Server.
E agora Fabrício? Quem poderá me defender?
R: EU!!! O DBA dos alertas.
Segue abaixo uma possível solução para esse problema:
1 – Salvar os e-mails que deveriam ser enviados em uma tabela no RDS
2 – Criar uma outra máquina virtual com o SQL Server (sem ser Express)
3 – Criar um Linked Server do seu SQL Server na VM para o RDS da Amazon
4 – Fazer a conexão com o RDS via Linked Server para pegar os e-mails que devem ser enviados e enviar da VM
É exatamente isso que estou usando com meus clientes RDS.
Me ensina a fazer isso Fabrício?
Claro, vamos fazer aqui juntos.
Segue abaixo o passo a passo que usei para criar em um cliente:
1 – Criar uma base chamada Traces no RDS do cliente
2 – Abrir os scripts de criação dos alertas no Github (free):
https://github.com/FabricioLimaSolucoesEmBD/Script_SQLServer_Alerts
3 – Execução do “Script 1.0 – Step by Step to Create the Alerts.sql”
Como o RDS não permite criar a sp_whoisactive na master, criar na base Traces que foi criada no item 1.
No RDS não podemos criar um operator para os jobs na MSDB. Então pule esse passo.
Crie a tabela Ignore_Databases do script.
4 – Execução do Script “2.0 – Create Alert Table.sql”
Esse Script é só abrir e executar sem nenhuma alteração.
5 – Executar essa procedure abaixo para configurar o envio dos alertas
Execute a procedure para criar a tabela com todas as configurações de alertas. Se for preciso, esse é o lugar onde deve acertar os valores dos alertas.
Mude o parâmetro “[email protected];[email protected]” para os e-mails que vão receber os alertas.
Também mude o parâmetro @Profile para o Database Mail Profile configurado no seu SQL Server da VM que fará o envio do e-mail.
Procedure que deve ser executada:
1 2 3 |
USE Traces exec stpConfiguration_Table '[email protected];[email protected]', @Profile, @Fl_Language --(1 - Portuguese | 0 -- English) |
6 – Execução do Script “2.1 – Create All Alert Procedures and Jobs.sql”
Não podemos rodar o script por completo pois ele cria jobs.
Procure no Script a string “USE [msdb]”, execute tudo o que tem acima dessa String.
Nos 3 jobs que esse Script cria, você vai ter que retirar essa parte do código:
1 2 |
@owner_login_name = N'sa', @notify_email_operator_name=N'DBA_Operator', |
Antes de finalizar, temos que criar uma tabela para controlar o envio de e-mail via Linked Server:
1 2 3 4 5 6 7 8 9 10 11 |
create table Send_DbMail(Id_Send_dbMail int identity, Ds_Profile_Email VARCHAR(200), Ds_Email VARCHAR(500), Ds_Subject VARCHAR(500), Ds_Mail_HTML VARCHAR(MAX), Ds_BodyFormat VARCHAR(50), Ds_Importance VARCHAR(50), Dt_Sent datetime) create clustered index SK01_Send_DbMail on Send_DbMail(Dt_Sent) |
Em seguida, mudamos a procedure de envio de e-mail para salvar em uma tabela ao invés de enviar o e-mail direto:
1 2 3 4 5 6 7 8 9 10 11 12 |
ALTER PROCEDURE stpSend_Dbmail @Ds_Profile_Email VARCHAR(200), @Ds_Email VARCHAR(500),@Ds_Subject VARCHAR(500),@Ds_Mail_HTML VARCHAR(MAX),@Ds_BodyFormat VARCHAR(50),@Ds_Importance VARCHAR(50) AS insert into Send_DbMail(Ds_Profile_Email , Ds_Email,Ds_Subject ,Ds_Mail_HTML ,Ds_BodyFormat ,Ds_Importance) select @Ds_Profile_Email,@Ds_Email,@Ds_Subject,@Ds_Mail_HTML,@Ds_BodyFormat,@Ds_Importance --EXEC msdb.dbo.sp_send_dbmail -- @profile_name = @Ds_Profile_Email, -- @recipients = @Ds_Email, -- @subject = @Ds_Subject, -- @body = @Ds_Mail_HTML, -- @body_format = @Ds_BodyFormat, -- @importance = @Ds_Importance |
Para finalizar as customizações para o RDS, abra a procedure stpWhoIsActive_Result e altere a chamada da sp_whoisactive para a base Traces:
1 2 3 4 5 |
EXEC Traces.[dbo].[sp_whoisactive] @get_outer_command = 1, @delta_interval = 1, @output_column_list = '[dd hh:mm:ss.mss][database_name][login_name][host_name][start_time][status][session_id][blocking_session_id][wait_info][open_tran_count][CPU][CPU_delta][reads][reads_delta][writes][sql_command][sql_text]', @destination_table = '#WhoIsActive_Result' |
Existe uma procedure que envia informações do ambiente uma vêz por mês: stpSQLServer_Configuration
Essa procedure é uma série de blocos com comentários como esse:
1 2 3 |
/*********************************************************************************************************************************** -- Disk Space ***********************************************************************************************************************************/ |
Procure os blocos com as descrições abaixo para comentar o código inteiro desses blocos:
- — Disk Space
- — Jobs da Instância – BODY
- — SQL Server Alerts
- — Operators Agent – HEADER
Temos que fazer isso devido a limitações do RDS.
Pronto!
Feito isso, finalmente conseguimos finalizar a execução do Script 2.1
Preferi colocar essas mudanças aqui, ao invés de duplicar o código dos alertas e ter que manter dois Scripts para sempre.
Parece complexo, mas é fácil!
7 – Pular alguns Scripts
Pulem os Scripts 3.1, 3.2, 3.3, 3.4 e 3.5
O Script 3.6, na minha opinião, deveria ter em todo SQL Server no mundo, então execute ele.
Temos que fazer a mesma alteração, retirando o Script abaixo da parte de criação do job:
1 2 |
@owner_login_name = N'sa', @notify_email_operator_name=N'DBA_Operator', |
Também vamos pular os Scripts 3.7, 3.8 e 3.9
Nesse momento já temos os alertas criados e os seguintes jobs no RDS:
Rode o Job Diário e veja se tudo vai funcionar corretamente.
Agora vamos continuar com a criação de um Checklist Diário para o seu banco de dados RDS.
8 – Executar o Script “4.0 – Procedures CheckList.sql”
Procure pela String “USE [msdb]” e execute todo o código antes dela.
Em seguida, retire o owner e o operator dos 5 jobs que esse script cria para que consiga criar com sucesso:
1 2 |
@owner_login_name = N'sa', @notify_email_operator_name=N'DBA_Operator', |
Desabilite um item do checklist que não funciona no RDS:
1 2 3 |
update CheckList_Parameter set Fl_Enabled = 0 where Nm_Procedure = 'stpCheckList_Jobs_Running' |
Feito isso criamos várias tabelas, procedures e os jobs abaixo:
Finalizamos com isso a criação do checklist do banco de dados.
9 – Executar o Script 4.1 – Delete Old Data.sql
Acertar a parte do job igual já fizemos anteriormente.
Esse Script serve para manter a base Traces pequena.
Agora vamos implementar o processo de envio do e-mail de uma VM nossa com SQL Server que tem acesso ao RDS da Amazon.
10 – Criar um Linked Server da nossa VM com SQL Server para o RDS da Amazon.
Para criar um LS, criamos um usuário chamado LS_DBA no RDS e damos permissão na tabela de controle do envio dos e-mails:
1 2 3 4 5 6 7 8 9 10 |
USE [master] GO CREATE LOGIN [LS_DBA] WITH PASSWORD=N'XXXXXX', DEFAULT_DATABASE=[Traces], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF GO USE [Traces] GO CREATE USER [LS_DBA] FOR LOGIN [LS_DBA] GO GRANT SELECT,UPDATE on Send_DbMail to [LS_DBA] |
Depois você deve cria um LS da sua VM com SQL Server para o RDS (não vou colocar o passo a passo disso aqui).
11 – Para finalizar, basta criar um job na VM com SQL Server com o script abaixo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
select * into #Envio_Email from [NOME_LS].Traces.dbo.Send_DbMail where Dt_sent is null declare @Ds_Profile_Email VARCHAR(200), @Ds_Email VARCHAR(500),@Ds_Subject VARCHAR(500),@Ds_Mail_HTML VARCHAR(MAX),@Ds_BodyFormat VARCHAR(50),@Ds_Importance VARCHAR(50),@Id_Send_DbMail int while exists (select null from #Envio_Email) begin select top 1 @Ds_Profile_Email = Ds_Profile_Email, @Ds_Email = Ds_Email, @Ds_Subject = Ds_Subject, @Ds_Mail_HTML = Ds_Mail_HTML, @Ds_BodyFormat=Ds_BodyFormat,@Ds_Importance=Ds_Importance,@Id_Send_DbMail = Id_Send_DbMail from #Envio_Email order by Id_Send_DbMail EXEC msdb.dbo.sp_send_dbmail @profile_name = @Ds_Profile_Email, @recipients = @Ds_Email, @subject = @Ds_Subject, @body = @Ds_Mail_HTML, @body_format = @Ds_BodyFormat, @importance = @Ds_Importance update [NOME_LS].Traces.dbo.Send_DbMail set Dt_Sent = getdate() where Id_Send_DbMail = @Id_Send_DbMail delete from #Envio_Email where Id_Send_DbMail= @Id_Send_DbMail end |
Ufa! Pronto!!!
Agora temos mais de 30 alertas para incrementar nosso monitoramento no RDS da Amazon (os riscos em vermelho não estão disponíveis):
Segue um exemplo do alerta de lock que criamos:
Nele temos quem está bloqueando quem, de qual host, quais as queries envolvidas e ainda temos o resultado da whoisactive com todas as outras queries em execução.
Até onde sei a amazon não disponibiliza nenhum alerta com todas essas informações para você olhar do seu celular quem está bloqueando quem.
Mas Fabrício, para eu criar esses jobs eu vou ter que pagar uma VM com SQL Server para poder enviar os e-mails???
R: Você tem 2 opções:
1 – Implementar isso tudo sozinho e usar um SQL Server que você já possua para criar esse LS. Se não tiver, vai ter que pagar a mensalidade mesmo.
2 – Contratar nossos serviços para que possamos implantar tudo isso para você utlizando nossa VM que já pagamos para enviar os e-mails.
Ou seja, estou te ensinando a fazer tudo de graça. Mas se não conseguir ou não tiver tempo para implementar essas rotinas, te ofereço ajuda de consultoria do nosso time para implementar tudo isso.
O importante é seu SQL Server ser muito bem monitorado.
Gostou desse Post?
Curta, comente, compartilhe…
Curta nossa página no Facebook , LinkedIn e Instagram para receber Dicas de Leituras, Vídeos e Eventos sobre SQL Server.
Até a próxima.
Abraços,
Fabrício Lima
CEO na Fabrício Lima Soluções em BD
Microsoft Data Platform MVP
Instagram:@fabriciofrancalima
Linkedin: https://www.linkedin.com/in/fabriciolimasolucoesembd/
Consultoria: [email protected]