Olá pessoal,
Boa tarde!
Neste post, vou compartilhar com vocês um aprendizado que tive essa semana. Na empresa onde eu trabalho, foi atualizada recentemente a versão do RedGate SQL Monitor e com isso, foram criados vários alertas para monitoramento de instâncias.
Um desses monitoramentos, é o de long running queries, que identifica sessões que estão executando uma instrução há mais de X minutos. Configuramos esse tempo em 3 minutos, então qualquer sessão que execute um comando que ultrapasse esse tempo de execução na produção, será alertada a equipe de DBA analisar.
O problema é que identificamos que existia uma sessão que sempre era alertada e acabava disparando várias a várias vezes esse alerta, todos os dias, gerando SPAM no nosso e-mail e fazendo com que esse alerta perca a sua importância.
Analisando o alerta, podemos observar que essa sessão era do Database Mail, um utilitário do próprio SQL Server, que executava o comando sp_readrequest, conforme o alerta nos mostra abaixo:
A stored procedure sp_readrequest é uma procedure de sistema, que basicamente lê as solicitações de mensagens da fila e retorna seu conteúdo. Esse processo fica ativo na instância por um tempo mínimo, determinado pelo parâmetro “DatabaseMailExeMinimumLifeTime”, cujo tempo padrão é de 600 segundos. Ou seja, sempre que esse processo for iniciado (e ele é iniciado constantemente), ele ficará executando por no mínimo, 600 segundos, e por isso, o alerta sempre era disparado.
Para resolver esse problema, de modo que eu não precise alterar ou desativar meu alerta, basta alterar esse tempo mínimo padrão:
Utilizando a inferface do SQL Server Management Studio
Para alterar esse parâmetro pelo SQL Server Management Studio, basta acessar a sessão “Management” > “Database Mail”
Agora, marque a opção “View or change system parameters” e clique em “Next”
Nesta tela é possível visualizar o valor atual e definir um novo valor do parâmetro “Database Mail Executable Minimium Lifetime (seconds)”.
Utilizando Transact-SQL
Para visualizar o valor padrão do parâmetro “” utilizando comandos Transact-SQL (TSQL), basta utilizar a query abaixo:
1 2 3 |
select * from msdb.dbo.sysmail_configuration WHERE paramname = 'DatabaseMailExeMinimumLifeTime' |
E se você quiser alterar o valor do parâmetro, basta realizar um UPDATE na tabela msdb.dbo.sysmail_configuration:
1 2 3 |
UPDATE msdb.dbo.sysmail_configuration SET paramvalue = 60 -- 60 segundos WHERE paramname = 'DatabaseMailExeMinimumLifeTime' |
ou executar a stored procedure sysmail_configure_sp:
1 |
EXECUTE msdb.dbo.sysmail_configure_sp 'DatabaseMailExeMinimumLifeTime', '60' |
Um ponto importante que deve ser levado em consideração, é que esse parâmetro serve para limitar o tempo mínimo que o processo do DatabaseMail irá executar a cada conexão.
Com um tempo mínimo muito alto, o processo ficará ativo na instância, mesmo que não tenha nenhuma mensagem para entregar.
Se você definir um tempo mínimo muito baixo, o processo irá ficar ativo na instância por menos tempo, mas também irá gerar mais conexões e desconexões na instância para processar essa atividade, causando um pequeno overhead por conta disso. Caso sua instância tenha sempre muitas e muitas mensagens no Database Mail para entregar, considere aumentar esse tempo mínimo para diminuir esse overhead de conexões.
Espero que vocês tenham gostado do post e até a próxima!
Abraço.
SQL Server Sessão executando há muito tempo com o comando sp_readrequest (DatabaseMail) Why a Session With sp_readrequest Takes so Long to Execute Red Gate SQL Monitor alert long-running query
SQL Server Sessão executando há muito tempo com o comando sp_readrequest (DatabaseMail) Why a Session With sp_readrequest Takes so Long to Execute Red Gate SQL Monitor alert long-running query
Olá Dirceu.
Parabéns pelo post.
Será que uma higienização de tempo em tempo, através dos seguintes procedimentos abaixo, é aconselhável?
– sysmail_delete_mailitems_sp
– sysmail_delete_log_sp
Oi Thiago,
Beleza?
Desculpe a demora em responder.. Essas 2 sps podem ser úteis para limpar o histórico de e-mails enviados pela msdb, sim.
Segue artigo que pode ajudar nessa questão: https://www.mssqltips.com/sqlservertip/1732/sql-server-database-mail-cleanup-procedures/
Olá Dirceu.
Muito bom o seu Post.
Eu estava passando pela mesma situação. o RedGate também acusando o mailserver (e mais alguns jobs no meu caso).
Alterei a configuração do mailserver mas a duvida que fiquei foi:
– Quando a request do mail server é\era executada o consumo do servidor (CPU) vai as alturas… isso significa então que a request estava consumindo – e travando – os processos enquanto não concluía o serviço?
Abraços.
Jean Pedrozo