Consultando o Log de Erro do SQL Server usando T-SQL

A leitura diária dos arquivos de log do SQL Server é uma das tarefas primárias do DBA. Particularmente tenho o hábito de visualizar o log corrente a cada 10 minutos (no máximo), pois, a leitura do log faz parte da minha estratégia de monitoração. Nesse sentido, tenho preferido consultar os log usando T-SQL ao invés da interface gráfica (Log File Viewer). Dentre os principais motivos para utilizar T-SQL ao invés da interface gráfica destaco:

· A visualização fica mais fácil e o conteúdo do arquivo é carregado mais rapidamente (tente abrir um arquivo de log de erro muito grande usando o Log File Viewer e você sentirá uma certa demora);

· Usando T-SQL é possível fazer pesquisas customizadas sobre o log do mesmo modo como fazemos na interface gráfica, contudo, a pesquisa com T-SQL é mais rápida;

· E, a principal vantagem no meu ponto de vista, é que via T-SQL podemos ler o log de erro de vários servidores ao mesmo tempo, executando um único comando.

Para fazermos a leitura via T-SQL podemos utilizar as seguintes SP’s:

· Sp_readerrorlog

· Xp_readerrorlog

Os Arquivos de Log

Os logs de erro do SQL Server são salvo em arquivos, por padrão na subpasta “Log” da unidade de disco onde a instância foi instalada. É possível abrir e visualizar o conteúdo desses arquivos utilizando um editor de texto como o Notepad.

Toda vez que a instância é reiniciada, o arquivo corrente é arquivado e renomeado sob o nome ERRORLOG.1, enquanto um novo arquivo de log é criado com o nome ERRORLOG. Por default, o SQL Server mantém até 6 arquivos de log arquivados. Caso queira aumentar esse limite, estando no SQL Server Management Studio, faça conforme ilustrado nas figuras abaixo:

image

image

O arquivo de log corrente tem índice 0 e essa informação é importante para a utilização das SP’s de leitura do log de erro que falaremos mais adiante.

É possível listar via T-SQL os arquivos de log de erro da instância. Veja como:

exec sp_enumerrorlogs

clip_image002

Veja que a stored procedure listou os arquivos de log de erro, neste caso, os 6 logs arquivados e o log corrente (de índice 0). Também mostrou a data e hora da última entrada no log (último registro) e o tamanho em disco do arquivo.

Usando SP_READERRORLOG / XP_READERRORLOG

Em termos de sintaxe e de benefícios ambas SP’s são idênticas. Contudo, é válido destacar que a XP_READERRORLOG é uma procedure estendida, além de não documentada.

Para visualizar o log de erros atual do SQL Server simplesmente execute:

exec sp_readerrorlog

clip_image002[4]

Essa stored procedure tem os seguintes parâmetros opcionais:

Parâmetro Valores Descrição
P1 0,1,2,4,5,6… Indica o número do arquivo de log a ser lido. O default é 0.
P2 1 ou 2 Indica o tipo de log a ser lido, onde: 1 = sql server; 2 = sql agent. O default é 1, ou seja, o log do sql server
P3 Texto entre aspas simples ou aspas duplas a ser localizado dentro do log (coluna Text). ATENÇÃO: quando usar a XP_READERRORLOG o texto deve estar entre aspas duplas. A pesquisa é parcial, procurando em qualquer parte da palavra. Deixe NULL neste parâmetro para não utilizá-lo ou simplesmente basta omiti-lo.
P4 Trata-se de uma segunda string a ser pesquisada, objetivando refinar a consulta. Na verdade este parâmetro produz a combinação P3 + P4, ou seja, as duas palavras pesquisadas devem existir na mesma entrada (linha) do log. Deixe NULL neste parâmetro para não utilizá-lo ou simplesmente basta omiti-lo.

Vejamos alguns exemplos.

Localizar as entradas que contenham a palavra AdventureWorks no log corrente do SQL Server.

exec sp_readerrorlog 0, 1, ‘adventureworks’

clip_image002[6]

Localizar as entradas que contenham as palavras CHECKDB e AdventureWorks no log corrente do SQL Server.

exec sp_readerrorlog 0, 1, ‘checkdb’, ‘adventureworks’

clip_image002[8]

Esse tipo de consulta no log é muito útil quando queremos pesquisar por erros ou, por exemplo, filtrar as entradas referentes a backup, etc.

Criando um script para consultas mais refinadas

Como comentei no início do post, tenho o hábito de ficar lendo o log em intervalos de no máximo 10 minutos. Desta forma, não tenho a necessidade de listar o log por completo, apenas as informações dos últimos 10 minutos e, caso se faça necessário, ir ampliando esse range. Fazer esse tipo de pesquisa usando a SP_READERRORLOG ou XP_REAERRORLOG não é possível. Por conta disso, estou deixando o script de uma stored procedure “personalizada”, que possibilita a realização de consultas bem flexíveis. Recomendo criar essa SP na database Master ou em um banco de dados criado para fins administrativos. Você pode baixar o script com o código fonte da SP aqui.

Reciclando o log de erro

Como já foi mencionado, o log de erro é reciclado (reiniciado) automaticamente toda vez que a instância sofre um restart. Considerando que um servidor de banco não é resetado com frequência – normalmente permanece vários meses online, a tendência é o log ficar demasiado grande, dificultando a análise e leitura. Assim, quero deixar uma sugestão: recicle manualmente, de tempos em tempos, o log de erro do SQL Server. Particularmente, faço essa reciclagem a cada 7 dias – normalmente crio um job que é executado aos domingos. Contudo, essa frequência de reciclagem varia de ambiente para ambiente, além de preferências e políticas.

O comando para reciclar manualmente o log de erros é o seguinte:

DBCC ERRORLOG

Conclusão

Inclua em sua estratégia diária de monitoramento a leitura dos log’s de erro do SQL Server. Em ambientes com várias instâncias essa tarefa pode ser facilitada, e muito, através do T-SQL, permitindo analisar o log de várias instâncias ao mesmo tempo.

Até o próximo post!



Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s