Querys do Dia a Dia: Monitoramento do Status das Databases e de Páginas Corrompidas
Fala Pessoal,
Depois de ter algumas páginas corrompidas e uma database em modo Suspect (Casos do Dia a Dia: Corrupção de Dados e Database Suspect), resolvi criar uma procedure que realiza um monitoramento desse tipo de problema a cada 1 minuto e me envia um e-mail e um torpedo em caso de algum problema.
No meu ambiente temos um serviço que envia torpedos através da VIVO . Então basta dar um insert em uma tabela para receber um torpedo de trabalho no seu celular(deixei essa parte comentada no código). Os de madrugadas são os mais legais!!! =/
Você pode não conseguir enviar um torpedo no seu ambiente, mas um e-mail você consegue. Então para rodar a procedure abaixo você deve configurar o seu Database Mail.
Segue o código da procedure:
Create procedure stpVerifica_Erro_Banco_Dados
AS
declare @subject varchar(500)
if exists (select null from msdb..Suspect_pages where last_update_date >= dateadd(mi,-3,getdate()))
begin
set @subject = ‘Existe um página corrompida no Banco de Dados.’
EXEC msdb.dbo.sp_send_dbmail
@profile_name = ‘SeuProfile’,
@recipients = ‘Seu E-Mail’,
@query = ‘select *
from msdb..Suspect_pages’,
@Subject = @subject;
— exec stpEnvia_Torpedo @subject
end
if exists (select null from sys.databases where state_desc not in (‘ONLINE’,’RESTORING’))
begin
set @subject = ‘Existe uma database que não está ONLINE no SQL Server. ‘
EXEC msdb.dbo.sp_send_dbmail
@profile_name = ‘SeuProfile’,
@recipients = ‘Seu E-Mail’,
@query = ‘ select name, state_desc
from sys.databases
where state_desc NOT IN (”ONLINE”,”RESTORING”)’,
@Subject = @subject;
— exec stpEnvia_Torpedo @subject
end
Como eu tenho servidores que recebem vários restores, eliminei a notificação para esse caso. Agora basta agendar um job que chame essa procedure e torcer para não receber nenhum torpedo ou e-mail.
Outros tipos de verificações podem ser incluídas nessa procedure te alertando com mensagens ou querys programadas do jeito que você queira visualizar.
Isso também poderia ser feito via os Alerts do SQL Server e essa semana o Laerte Junior(Twitter|Blog) fez um post utilizando o PowerShell para monitorar a tabela Suspect_Pages: PowerShell and SQL Server Events–Monitoring DATABASE SUSPECT DATA PAGE .
Gostou dessa dica?
Cadastre seu e-mail para receber novos Posts e curta minha Página no Facebook para receber Dicas de Leituras e Eventos sobre SQL Server.
Aprenda a criar essa e outras rotinas para administrar melhor seu SQL Server no meu Treinamento de Tarefas do Dia a Dia de um DBA.
Abraços,
Fabrício Lima
MCITP – Database Administrator
Consultor e Instrutor SQL Server
Trabalha com SQL Server desde 2006
Fala Fabrício,
Muito bom artigo, e procedure idem… Fiz deploy da mesma no meu ambiente… Fiz uma pequena alteração, mas sinceramente, não fiz medições pra ver se será menos ou mais performatico…
–where state_desc NOT IN (”ONLINE”,”RESTORING”)’,
substituí por
— where state 0;
O resultado final acaba sendo a mesma coisa…
Excelente artigo, simples e objetivo…
Abraço…
Edvaldo Castro
Somente uma correção
– where state = 0;
Obrigado Edvaldo.
Valeu pelo feedback.
Abraços
Edvaldo, acho que interpretei errado seu comentário… Tinha entendido que você tinha mudado a query mas para se adaptar a uma realidade sua e não para melhorar a performance.
Da uma olhada no comentário abaixo.
Abraço
Edvaldo e Fabricio,
Em relação a esta questão de usar “where state=0” e não usar o “NOT IN (”ONLINE”,”RESTORING”)”, acredito q tem um pequenino “equívoco”.
Baseado na lógica q esta sendo implementada :
— if exists (select null from sys.databases where state_desc not in (‘ONLINE’,’RESTORING’))
ou seja,
Se existir na sys.databases bancos com status diferente de ‘ONLINE’,’RESTORING’.
Não seria correto usar “where state > 1”, baseado na lista de códigos abaixo?
Estado do banco de dados (Fonte: http://msdn.microsoft.com/pt-br/library/ms178534.aspx)
0 = ONLINE
1 = RESTORING
2 = RECOVERING
3 = RECOVERY_PENDING
4 = SUSPECT
5 = EMERGENCY
6 = OFFLINE
Correto Leandro.
Tinha visto errado o comentário anterior.
Mas por questão de performance, acretido que isso não faça muita diferenta pois essa tabela é bem pequena.
Fica a critério de vocês.
Abraços
Ok Fabricio…
Concordo contigo neste ponto!
Postei o comentário mais em função do pessoal q acaba
pegando o script e não “ver” este pequeno detalhe…
Já implementei sua idéia…hehehe…
Ótimo post…
Valeu Leandro.
Obrigado pelos comentários.
Abraços.