Introdução
Uma das principais habilidades de que você precisa como administrador de banco de dados ou profissional de TI geralmente é a capacidade de monitorar os sistemas com muito cuidado. A falta dessa habilidade chave pode levar a erros de diagnóstico ao solucionar problemas. O SQL Server expõe várias ferramentas que podem ajudar o DBA na solução de problemas que ocorrem na produção. O log de erros do SQL Server e o log do SQL Server Agent são dois dos recursos mais importantes para solucionar problemas do SQL Server. Neste artigo, exploraremos as maneiras pelas quais podemos manipular os logs do Servidor e do Agente.
Comportamento padrão
Por padrão, o SQL Server mantém os últimos seis logs de erro e os últimos nove logs do agente na instância. Por padrão, um novo arquivo de log é gerado toda vez que a instância do agente é reiniciada. O número de arquivos de log mantidos pode ser modificado para os logs do SQL Server usando a instrução da GUI equivalente abaixo (Fig. 1). Para abrir esta GUI no Pesquisador de Objetos, clique com o botão direito do mouse em Gerenciamento , selecione Log de erros do SQL Server e clique em Configurar .
Fig 1. Últimos Seis Registros de Erros
Cada arquivo de log é gerado na reinicialização e armazenado fisicamente em C: \Arquivos de Programas\ Microsoft SQL Server\MSSQL14.
Durante a inicialização da instância, o mecanismo grava informações importantes no log de erros, que incluirá:
Detalhes da versão do SQL Server Fabricante do sistema
- ID do processo do SQL Server
- Número da porta em uso
- Modo de autenticação
- Parâmetros de inicialização do registro
- Conta de serviço
- Tamanho da CPU e memória detectados
- Status das opções de chave, por exemplo Páginas grandes, extensão do pool de buffers, OLTP na memória etc.
Essas informações podem ser muito úteis quando você deseja apenas descobrir rapidamente sobre qualquer um deles a partir da instância que é apresentada a você.
Configurando opções de registro de erros
Conforme mencionado anteriormente, certos aspectos do log de erros do SQL e do log do agente são configuráveis. No meu ambiente, definimos NumErrorLogs para 30 porque queremos ter os últimos trinta dias de logs preservados diariamente. Garantimos que cada arquivo de log contenha os dados de um dia executando sp_cycle_errorlog (e sp_cycle_agent_errorlog) à meia-noite usando um trabalho de agente. A Listagem 3 mostra os detalhes deste trabalho. Esses procedimentos armazenados também podem ser bastante úteis para ciclos explícitos do log de erros quando você deseja reproduzir um problema e vê-lo se desenrolar (ou seja, antes de escalar para SQL Profiler ou Extended Events).
-- Listing 1: Configure NumErrorLogs USE [master] GO EXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'NumErrorLogs', REG_DWORD, 30 GO
Fig 2. Configurando o Número Máximo de Arquivos de Log de Erros
O log de erros do SQL Agent pode ser configurado com algum nível de detalhe clicando com o botão direito do mouse em SQL Server Agent , e, em seguida, Registros de erros e selecione Configurar do cardápio. A Listagem 2 e a Fig. 2 mostram como modificar o nível de registro.
-- Listing 2: Setting Error Logging Level USE [msdb] GO EXEC msdb dbo.sp_set_sqlagent_properties @errorlogging_level 7 GO
Fig 3. Configurando as opções de log de erros do SQL Agent
-- Listing 3 /* Create Job to Cycle Server and Agent Error Logs */ USE [msdb] GO /****** Object: Job [Cycle Error Logs] Script Date: 01/25/2015 15:40:34 ******/ BEGIN TRANSACTION DECLARE @ReturnCode INT SELECT @ReturnCode = 0 /****** Object: JobCategory [[Uncategorized (Local)]]] Script Date: 01/25/2015 15:40:34 ******/ IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'[Uncategorized (Local)]' AND category_class 1 BEGIN EXEC @ReturnCode = msdb dbo sp_add_category @class N'JOB', @type=N'LOCAL', @name=N'[Uncategorized (Local)]' IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback END DECLARE @jobId BINARY(16 EXEC @ReturnCode = msdb dbo sp_add_job @job_name=N'Custom_Cycle_Error_Logs', @enabled 1 @notify_level_eventlog 0, @notify_level_email 0, @notify_level_netsend 0 @notify_level_page 0 @delete_level 0, @description=N'No description available.', @category_name=N'[Uncategorized (Local)]', @owner_login_name N'COMPANYDOMAIN\kigiri', @job_id = @jobId OUTPUT IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback /****** Object: Step [Step 1] Script Date: 01/25/2015 15:40:35 ******/ EXEC @ReturnCode = msdb dbo sp_add_jobstep @job_id @jobId, @step_name N'Step 1', @step_id 1 @cmdexec_success_code 0 @on_success_action 1 @on_success_step_id 0, @on_fail_action 2 @on_fail_step_id 0, @retry_attempts 0 @retry_interval 0 @os_run_priority 0, @subsystem=N'TSQL', @command=N'EXEC master.sys.sp_cycle_errorlog GO EXEC msdb.dbo.sp_cycle_agent_errorlog GO', @database_name=N'master', @flags 0 IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback EXEC @ReturnCode = msdb dbo sp_update_job @job_id = @jobId @start_step_id = 1 IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback EXEC @ReturnCode = msdb dbo sp_add_jobschedule @job_id @jobId @name N'Daily Schedule', @enabled 1 @freq_type 4, @freq_interval 1 @freq_subday_type 1 @freq_subday_interval 0 @freq_relative_interval 0 @freq_recurrence_factor 0 @active_start_date 20121208, @active_end_date 99991231 @active_start_time 0 @active_end_time 235959 [email protected]_uid=N'f3eb3e85-9875-4cf5-a789-8c558b772d27' IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback EXEC @ReturnCode = msdb dbo sp_add_jobserver @job_id = @jobId @server_name = N'(local)' IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback COMMIT TRANSACTION GOTO EndSave QuitWithRollback: IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION EndSave: GO /* Change Maximum Number of Error Log Files to 30 */ USE [master] GO EXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'NumErrorLogs', REG_DWORD, 30 GO /* Set jo history length and agent properties */ EXEC msdb dbo.sp_purge_jobhistory @oldest_date '2015-11-28T19:29:00' GO USE [msdb] GO EXEC msdb dbo.sp_set_sqlagent_properties @jobhistory_max_rows 10000, @jobhistory_max_rows_per_job 1000 GO
"Despejando" através de logs
Familiarizar-se com o log de erros é útil para identificar itens como os itens listados na segunda seção ou monitorar eventos como a recuperação de um grande banco de dados. Mas ao pesquisar um item específico, como falhas de login ou erros semelhantes ocultos no mar de logs, você pode usar o filtro ou pesquisar capacidade.
Fig 4. Filtro e Pesquisa
A pesquisa seria útil ao procurar um número ou texto de erro específico. A pesquisa retorna as ocorrências do item solicitadas por linha de cada vez. Quando você precisar restringir o log de erros usando critérios específicos, use o filtro. Você pode filtrar por conexão , data ou geral detalhes.
Fig 5. Critério de Pesquisa
Fig 6. Critério de Filtro
Quando a instância falha
Uma boa pergunta que um leitor atento faria é o que acontece quando o SQL Server falha ao iniciar? Como examinamos os logs? Bem, acontece que além do fato de que os logs de erro são gravados em arquivos simples cujo caminho foi especificado anteriormente, você também pode visualizar os logs do Servidor e do Agente no Visualizador de Eventos do Windows. Tudo o que você precisa fazer é filtrar os logs do aplicativo Event Viewer para eventos com uma origem MSSQLSERVER. Em ambientes mais avançados, os logs do SQL Server, como qualquer outro log do Windows, podem ser armazenados em uma ferramenta de terceiros como SEIM ou Splunk. Isso torna as coisas muito mais fáceis. A partir do SQL Server 2012, também é possível visualizar logs de erros offline de outra instância inteiramente, usando servidores registrados, bem como WMI e WQL.
Fig 7. Visualizando Logs do SQL Server no Visualizador de Eventos
Conclusão
O log de erros do SQL Server pode ser considerado o ponto de partida para solucionar erros comuns. Outros logs, como arquivos de rastreamento gerados pelo SQL Trace ou capturados pelo SQL Profiler ou Extended Events Session, fornecem muito mais detalhes sobre o que está acontecendo dentro do mecanismo. Há também logs específicos, como os relacionados ao Database Mail ou Replication. Embora todos sejam muito úteis para solucionar problemas no SQL Server, eu recomendaria os logs de erro do SQL Server como um ótimo ponto de partida.
Referências
Exibindo o log de erros do SQL Server
Visualizando Arquivos de Log Offline
Registro de erros do ciclo Sp
Registro de erros do agente do ciclo Sp
Caminho de instalação padrão do SQL Server